o
    uvXj‰3  ã                   @   sö   d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ dgd	gd
gdgg d¢dgdœZedk rOe ddgi¡ ne ddgi¡ edkrded  g d¢¡ G dd„ deƒZdd„ Zddd„Zdd„ ZdS ) é    N)ÚDictÚListÚTupleÚUnion)ÚMODELS_MODULE_NAME)Úimport_string)ÚVERSION)ÚCollisionResolvingRunner)ÚSubclassesFinderÚcacheÚsettingsÚget_user_modelÚtransaction)
ÚAvgÚCaseÚCountÚFÚMaxÚMinÚPrefetchÚQÚSumÚWhenÚtimezone)zdjango.core.cachezdjango.confzdjango.contrib.authz	django.dbúdjango.db.modelszdjango.utils)é   é
   zdjango.core.urlresolversÚreversezdjango.urls)r   é   r   )ÚExistsÚOuterRefÚSubqueryc                   @   s   e Zd ZdS )ÚObjectImportErrorN)Ú__name__Ú
__module__Ú__qualname__© r&   r&   ú`/var/www/html/myproject/venv/lib/python3.10/site-packages/django_extensions/management/shells.pyr"   *   s    r"   c                 C   s^   t t|  d¡ƒƒ}zz|| t¡d  W W S  ty#   |d  Y W S w  ty.   |  Y S w )a   
    Retrieve application name from models.py module path

    >>> get_app_name('testapp.models.foo')
    'testapp'

    'testapp' instead of 'some.testapp' for compatibility:
    >>> get_app_name('some.testapp.models.foo')
    'testapp'
    >>> get_app_name('some.models.testapp.models.foo')
    'testapp'
    >>> get_app_name('testapp.foo')
    'testapp'
    >>> get_app_name('some.testapp.foo')
    'testapp'
    Ú.r   )ÚlistÚreversedÚsplitÚindexr   Ú
ValueErrorÚ
IndexError)Úmod_nameÚrpartsr&   r&   r'   Úget_app_name.   s   þþr1   Fc           	      C   sÔ  i }| D �]b}�z*t |tjƒr)t|ƒ}||| d¡d < |s't| d| ¡ƒ W qt |ttfƒ�r%t	|ƒdk�r%t |d tjƒsO|sMt| 
d|d  ¡ƒ W qt |d ttfƒr²tdd„ |d D ƒƒr²t|d i i |d ƒ}g }|d D ]*}z	t||ƒ||< W n ty˜   |s–t| 
d	||d |f ¡ƒ Y qtw | |¡ qt|s±t| d
|d d |¡f ¡ƒ nt |d tjƒ�r|d dkrèt|d i i |d ƒ}t|ƒD ]	}t||ƒ||< qÐ|sçt| d|d  ¡ƒ nItt|d i i |d gƒ|d ƒ}|||d < |�st| d
|d |d f ¡ƒ n|�s$t| 
d|d |d f ¡ƒ n|�s1t| 
d| ¡ƒ W q t�yg   z|�sGt| 
d| ¡ƒ W n t�yd   |�sbt| 
d|d |d f ¡ƒ Y nw Y qw |S )aœ  
    Import the items in import_directives and return a list of the imported items

    Each item in import_directives should be one of the following forms
        * a tuple like ('module.submodule', ('classname1', 'classname2')), which indicates a 'from module.submodule import classname1, classname2'
        * a tuple like ('module.submodule', 'classname1'), which indicates a 'from module.submodule import classname1'
        * a tuple like ('module.submodule', '*'), which indicates a 'from module.submodule import *'
        * a simple 'module.submodule' which indicates 'import module.submodule'.

    Returns a dict mapping the names to the imported items
    r(   r   z	import %sé   z7Unable to import %r: module name must be of type stringr   c                 s   s   � | ]	}t |tjƒV  qd S ©N)Ú
isinstanceÚsixÚstring_types)Ú.0Úer&   r&   r'   Ú	<genexpr>f   s   € zimport_items.<locals>.<genexpr>z.Unable to import %r from %r: %r does not existúfrom %s import %sú, Ú*zfrom %s import *z9Unable to import %r from %r: names must be of type stringz1Unable to import %r: names must be of type stringzUnable to import %rzUnable to import %r from %r)r4   r5   r6   Ú
__import__r+   ÚprintÚSQL_COLTYPEr)   ÚtupleÚlenÚERRORÚallÚgetattrÚAttributeErrorÚappendÚjoinÚdirÚImportErrorÚ	TypeError)	Úimport_directivesÚstyleÚ
quiet_loadÚimported_objectsÚ	directiveÚimported_objectÚimported_namesÚnameÚkr&   r&   r'   Úimport_itemsK   sz   
(€þ €€"€€€€€þ€ürT   c                    s   ddl m‰ ddlm} ˆjs|ƒ  ddlm‰
 ˆ dg ¡}tˆ
dg ƒ}|| ‰dˆv }ˆ d¡‰	tˆ
d	i ƒ‰tˆ
d
i ƒ‰ tˆ
di ƒ}i ‰‡ ‡‡‡fdd„‰‡‡	‡
‡fdd„}‡‡fdd„}‡‡‡fdd„‰‡fdd„}	d}
z
ddl	m
} d}
W n	 ty�   Y nw |r¢ˆ	s�tˆ d¡ƒ t|ˆˆ	d�}t |¡D ]\}}|ˆ|< q™i ‰|
rÚ|rÚt |¡D ],\}}| d¡d }t|jƒ}|ˆv sÉd||f ˆv rÊq­ˆ |jg ¡ ˆ|j  |¡ q­|�s|	ƒ D ]4\}}|sçqàt|jƒ}|ˆv rñqà|D ] }d||jf ˆv rÿqó|j�rˆ |jg ¡ ˆ|j  |j¡ qóqà|ƒ  ˆ	�s)tˆ d¡|�r%dnd  ƒ |ƒ  tˆ
d!dƒ�rUˆ	�s=tˆ d"¡ƒ tt ¡ ˆˆ	d�}t |¡D ]	\}}|ˆ|< �qKtˆ
d#i ƒ}|�r~ˆ	�shtˆ d¡ƒ t|ˆˆ	d�}t |¡D ]	\}}|ˆ|< �qtˆS )$Nr   ©Úapps)Úsetup)r   Ú	dont_loadÚSHELL_PLUS_DONT_LOADr<   rM   ÚSHELL_PLUS_MODEL_ALIASESÚSHELL_PLUS_APP_PREFIXESÚSHELL_PLUS_PRE_IMPORTSc                     s¤   i } t t ˆ¡ƒD ]F\}}t|ƒ}ˆ |i ¡}ˆ  |¡}t |ƒD ].}d||f ˆv r+q | |¡}|s=|r;d||f }n|}|  |g ¡ | |  d||f ¡ q q	| S )aÓ  
        Collect dictionary from names to possible models. Model is represented as his full path.
        Name of model can be alias if SHELL_PLUS_MODEL_ALIASES or SHELL_PLUS_APP_PREFIXES is specified for this model.
        This dictionary is used by collision resolver.
        At this phase we can't import any models, because collision resolver can change results.
        :return: Dict[str, List[str]]. Key is name, value is list of full model's path's.
        ú%s.%sz%s_%s)Úsortedr5   Ú	iteritemsr1   ÚgetÚ
setdefaultrF   )Úmodels_to_importÚapp_modÚmodelsÚapp_nameÚapp_aliasesÚprefixÚ
model_nameÚalias)Úapp_prefixesrX   Úload_modelsÚmodel_aliasesr&   r'   Ú&get_dict_from_names_to_possible_models§   s"   

óz>import_objects.<locals>.get_dict_from_names_to_possible_modelsc                     s:   t ˆdg ƒ} | rˆstˆ d¡ƒ ˆ t| ƒ ¡ ƒ d S d S )NÚSHELL_PLUS_SUBCLASSES_IMPORTz# Shell Plus Subclasses Imports)rD   r>   Ú	SQL_TABLEr
   Úcollect_subclasses)Úbase_classes_to_import)Úperform_automatic_importsrM   r   rL   r&   r'   Úimport_subclassesÅ   s   ýz)import_objects.<locals>.import_subclassesc                     s   t ƒ  ˆ ƒ ¡} ˆ| ƒ dS )zï
        Perform collision resolving and imports all models.
        When collisions are resolved we can perform imports and print information's, because it is last phase.
        This function updates imported_objects dictionary.
        N)r	   Úrun_collision_resolver)Úmodules_to_models)rm   rr   r&   r'   Úimport_modelsÌ   s   z%import_objects.<locals>.import_modelsc                    sì   |   ¡ D ]o\}}g }t|ƒD ]Q\}}ztd||f ƒˆ |< ||kr'| |¡ n	| d||f ¡ W q ty_ } z"ˆ d¡rBt ¡  ˆ d¡sUtˆ 	d||t
|ƒf ¡ƒ W Y d}~qd}~ww ˆ d¡sstˆ d|d |¡f ¡ƒ qdS )	a  
        Import elements from given dictionary.
        :param modules_to_classes: dictionary from module name to tuple.
        First element of tuple is model name, second is model alias.
        If both elements are equal than element is imported without alias.
        r]   z
%s (as %s)Ú	tracebackrM   z*Failed to import '%s' from '%s' reason: %sNr:   r;   )Úitemsr^   r   rF   rI   r`   rw   Ú	print_excr>   rB   Ústrr?   rG   )Úmodules_to_classesÚfull_module_pathrd   Úmodel_labelsrh   ri   r8   )rN   ÚoptionsrL   r&   r'   rr   Õ   s,   €

ÿ€ü
€ðz1import_objects.<locals>.perform_automatic_importsc                  3   s*   � ˆ   ¡ D ]} | jr| j|  ¡ fV  qd S r3   )Úget_app_configsÚmodels_moduleÚ
get_models)ÚapprU   r&   r'   Úget_apps_and_modelsî   s   €€þz+import_objects.<locals>.get_apps_and_modelsF)Ú_document_registryTz# Shell Plus User Imports)rM   r(   éÿÿÿÿr]   z# Shell Plus Model Imports%sz SKIPPEDÚ ÚSHELL_PLUS_DJANGO_IMPORTSz# Shell Plus Django ImportsÚSHELL_PLUS_POST_IMPORTS)Údjango.appsrV   ÚdjangorW   ÚreadyÚdjango.confr   r`   rD   Úmongoengine.baser„   rI   r>   ro   rT   r5   r_   r+   r1   r$   ra   rF   r#   r‡   rx   )r~   rL   rW   Údont_load_cliÚdont_load_confÚdont_load_any_modelsr\   rs   rv   rƒ   Úmongoenginer„   ÚimportsrS   ÚvrR   Úmodre   rc   Ú
app_modelsrˆ   r&   )rj   rV   rX   rm   rN   rk   rl   r~   rr   rM   r   rL   r'   Úimport_objects“   s”   
	ÿ


€ù	r–   )F)r5   rw   Útypingr   r   r   r   Údjango.apps.configr   Údjango.utils.module_loadingr   rŠ   r   ÚDJANGO_VERSIONÚ%django_extensions.collision_resolversr	   Ú#django_extensions.import_subclassesr
   r‡   ÚupdateÚextendÚ	Exceptionr"   r1   rT   r–   r&   r&   r&   r'   Ú<module>   s8   ø
ÿÿ
H