a
    8Xh2<                     @   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   h/var/www/viveiro_mudafortebrasil/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rzt|}W nL ty } z4|st|d||f  W Y d}~W qW Y d}~n
d}~0 0 t	dd |j
D s|st|d|  W q|st|d|  |j
D  ]}t |tjr |jD ]"}|jp|j}	t|j||	< qt |tjrt|ji i dd	 |jD }
|jD ]}|jp`|j}	z@|jd
krt|
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|st|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  nt |d tr"|d d
krt|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   |st|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qt|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Ĉ	std" tt	d}| D ]\}}||< qt
d#i }|r	st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rt  dst	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