a
    ÆZEg2<  ã                   @   sª   d dl Z d dlZ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 g d¢Z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)ÚCollisionResolvingRunner)ÚSubclassesFinder)ÚRemovedInNextVersionWarning)z#from django.core.cache import cachez from django.conf import settingsz.from django.contrib.auth import get_user_modelz!from django.db import transactionzRfrom django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, Whenz!from django.utils import timezonezfrom django.urls import reversez7from django.db.models import Exists, OuterRef, Subqueryc                   @   s   e Zd ZdS )ÚObjectImportErrorN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú\/var/www/sistema_ama/venv/lib/python3.9/site-packages/django_extensions/management/shells.pyr   !   s   r   c                 C   sf   t t|  d¡ƒƒ}z8z|| t¡d  W W S  tyF   |d  Y W S 0 W n ty`   |  Y S 0 dS )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'
    Ú.é   N)ÚlistÚreversedÚsplitÚindexr   Ú
ValueErrorÚ
IndexError)Úmod_nameZrpartsr   r   r   Úget_app_name%   s    r   Fc                 C   s–  i }| D �]†}t |tƒr | ¡ }�z@t |tƒ�rè| d¡�rèzt |¡}W nL ty– } z4|s‚t| d||f ¡ƒ W Y d}~W qW Y d}~n
d}~0 0 t	dd„ |j
D ƒƒsÆ|sÂt| d| ¡ƒ W q|sÜt| d| ¡ƒ |j
D � ]þ}t |tjƒ�r |jD ]"}|j�p|j}	t |j¡||	< qüt |tjƒrât |ji i dd	„ |jD ƒ¡}
|jD ]�}|j�p`|j}	z@|jd
k�r�t|
ƒD ]}t|
|ƒ||< �qxnt|
|jƒ||	< W n: t�yÜ } z tt|
ƒƒ t|ƒ‚W Y d}~n
d}~0 0 �qPqâ�nxtjdtdd� t |tƒ�r>t|ƒ}
|
|| d¡d < |�s6t| d| ¡ƒ W q�n"t |ttfƒ�rHt|ƒdk�rHt |d tƒ�sŒ|�sˆt| 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}zt|
|ƒ||< W n6 t�y&   |�s"t| d||d |f ¡ƒ Y n0 |  |¡ �qÚ|�sFt| d|d d !|¡f ¡ƒ nèt |d tƒ�r"|d d
k�rÎt|d i i |d ƒ}
t|
ƒD ]}t|
|ƒ||< �qš|�s t| d|d  ¡ƒ nRtt|d i i |d gƒ|d ƒ}
|
||d < |�sFt| d|d |d f ¡ƒ n$|�s`t| d|d |d f ¡ƒ n|�s`t| d| ¡ƒ W q t�yŽ   |�sŠt| d| ¡ƒ Y q0 q|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
    )zfrom zimport zError parsing: %r %sNc                 s   s    | ]}t |tjtjfƒV  qd S ©N)Ú
isinstanceÚastÚImportÚ
ImportFrom)Ú.0Úbodyr   r   r   Ú	<genexpr>[   ó    zimport_items.<locals>.<genexpr>z"Only specify import statements: %rz%sc                 S   s   g | ]
}|j ‘qS r   )Úname)r    r$   r   r   r   Ú
<listcomp>i   r#   z import_items.<locals>.<listcomp>Ú*zuOld style import definitions are deprecated. You should use the new style which is similar to normal Python imports. é   )Ú
stacklevelr   r   z	import %sz7Unable to import %r: module name must be of type stringr   c                 s   s   | ]}t |tƒV  qd S r   )r   Ústr)r    Úer   r   r   r"   …   r#   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 %r)"r   r)   ÚstripÚ
startswithr   ÚparseÚ	ExceptionÚprintÚERRORÚallr!   ÚSQL_COLTYPEr   ÚnamesÚasnamer$   Ú	importlibÚimport_moduler   Ú
__import__ÚmoduleÚdirÚgetattrÚAttributeErrorÚImportErrorÚwarningsÚwarnr
   r   r   ÚtupleÚlenÚappendÚjoin)Zimport_directivesÚstyleÚ
quiet_loadÚimported_objectsÚ	directiveÚnodeÚexcr!   r$   r6   Zimported_objectÚkZimported_namesr   r   r   Úimport_itemsB   sœ    

$

(,"""  rL   c                    sh  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 ‰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0 |�rNˆ	�s$tˆ d¡ƒ t|ˆˆ	d�}| ¡ D ]\}}|ˆ|< �q:|
�rÄ|�sÄ| ¡ D ]`\}}| d¡d }t|jƒ}|ˆv �sbd||f ˆv �r¢�qbˆ |jg ¡ ˆ|j  |¡ �qb|�sJ|	ƒ D ]x\}}|�sâ�qÐt|jƒ}|ˆv �rú�qÐ|D ]F}d||jf ˆv �r�qþ|j�rþˆ |jg ¡ ˆ|j  |j¡ �qþ�qÐ|ƒ  ˆ	�srtˆ d¡|�rjdnd  ƒ |ƒ  tˆ
d!dƒ�rÄˆ	�sštˆ d"¡ƒ ttˆˆ	d�}| ¡ D ]\}}|ˆ|< �q°tˆ
d#i ƒ}|�rˆ	�sêtˆ d$¡ƒ t|ˆˆ	d�}| ¡ D ]\}}|ˆ|< �q tˆ
d%i ƒ}|�rdˆ	�s:tˆ d&¡ƒ t|ˆˆ	d�}| ¡ D ]\}}|ˆ|< �qPˆS )'Nr   ©Úapps)Úsetup)ÚsettingsÚ	dont_loadZSHELL_PLUS_DONT_LOADr&   rF   ZSHELL_PLUS_MODEL_ALIASESZSHELL_PLUS_APP_PREFIXESÚSHELL_PLUS_PRE_IMPORTSc                     s¢   i } t ˆ ¡ ƒD ]Œ\}}t|ƒ}ˆ |i ¡}ˆ  |¡}t |ƒD ]\}d||f ˆv rTq>| |¡}|sx|rtd||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)ÚsortedÚitemsr   ÚgetÚ
setdefaultrC   )Zmodels_to_importÚapp_modÚmodelsÚapp_nameZapp_aliasesÚprefixÚ
model_nameÚalias)Úapp_prefixesrQ   Úload_modelsÚmodel_aliasesr   r   Ú&get_dict_from_names_to_possible_modelsÃ   s     

z>import_objects.<locals>.get_dict_from_names_to_possible_modelsc                     s6   t ˆdg ƒ} | r2ˆs"tˆ d¡ƒ ˆ t| ƒ ¡ ƒ d S )NZSHELL_PLUS_SUBCLASSES_IMPORTz# Shell Plus Subclasses Imports)r<   r1   Ú	SQL_TABLEr	   Zcollect_subclasses)Zbase_classes_to_import)Úperform_automatic_importsrF   rP   rE   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   Zrun_collision_resolver)Zmodules_to_models)ra   rc   r   r   Úimport_modelsè   s    z%import_objects.<locals>.import_modelsc                    sî   |   ¡ D ]à\}}g }t|ƒD ]¤\}}z>td||f ƒˆ |< ||krN| |¡ n| d||f ¡ W q ty¾ } zDˆ d¡r„t ¡  ˆ d¡sªtˆ 	d||t
|ƒf ¡ƒ W Y d}~qd}~0 0 qˆ d¡stˆ 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.
        rS   z
%s (as %s)Ú	tracebackrF   z*Failed to import '%s' from '%s' reason: %sNr+   r,   )rU   rT   r   rC   r>   rV   rf   Ú	print_excr1   r2   r)   r4   rD   )Zmodules_to_classesZfull_module_pathrY   Zmodel_labelsr\   r]   r*   )rG   ÚoptionsrE   r   r   rc   ñ   s"    

ÿ
z1import_objects.<locals>.perform_automatic_importsc                  3   s(   ˆ   ¡ D ]} | jr| j|  ¡ fV  qd S r   )Zget_app_configsZmodels_moduleZ
get_models)ZapprM   r   r   Úget_apps_and_models
  s    z+import_objects.<locals>.get_apps_and_modelsF)Ú_document_registryTz# Shell Plus User Pre Imports)rF   r   éÿÿÿÿrS   z# Shell Plus Model Imports%sz SKIPPEDÚ ÚSHELL_PLUS_DJANGO_IMPORTSz# Shell Plus Django ImportsÚSHELL_PLUS_IMPORTSz# Shell Plus User ImportsÚSHELL_PLUS_POST_IMPORTSz# Shell Plus User Post Imports)Zdjango.appsrN   ZdjangorO   ÚreadyZdjango.confrP   rV   r<   Zmongoengine.baserj   r>   r1   rb   rL   rU   r   r   r   rW   rC   r   rm   )rh   rE   rO   Zdont_load_cliZdont_load_confZdont_load_any_modelsrR   rd   re   ri   Zmongoenginerj   ZimportsrK   Úvr$   ÚmodrZ   rX   Z
app_modelsrn   ro   r   )r^   rN   rQ   ra   rG   r_   r`   rh   rc   rF   rP   rE   r   Úimport_objects®   sœ    
	


rs   )F)r   rf   r?   r7   Útypingr   r   r   r   Zdjango.apps.configr   Zdjango.utils.module_loadingr   Z%django_extensions.collision_resolversr   Z#django_extensions.import_subclassesr	   Z#django_extensions.utils.deprecationr
   rm   r0   r   r   rL   rs   r   r   r   r   Ú<module>   s   
l