3
g2<                 @   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 dd	d
dddddg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)RemovedInNextVersionWarningz#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   a/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django_extensions/management/shells.pyr   !   s   r   c             C   s\   t t| jd}y0y||jtd  S  tk
r>   |d S X W n tk
rV   | S X 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 }x| D ]}t |tr$|j }yFt |to:|jdrytj|}W n> tk
r } z"|szt|jd||f  wW Y dd}~X nX t	dd |j
D s|st|jd|  w|st|jd|  x|j
D ]
}t |tjrx.|jD ]$}|jp|j}	tj|j||	<  qW t |tjrtj|ji i d	d
 |jD }
x|jD ]}|jp^|j}	yD|jdkrx2t|
D ]}t|
|||< qxW nt|
|j||	< W n8 tk
r } ztt|
 t|W Y dd}~X nX qNW qW n~tjdtdd t |tr@t|}
|
||jdd < |s:t|jd|  wn*t |ttfrRt|dkrRt |d ts|st|jd|d   wt |d ttfrdt	dd |d D rdt|d i i |d }
g }xh|d D ]\}yt|
|||< W n8 tk
r*   |s&t|jd||d |f  Y nX |j | qW |sPt|jd|d dj!|f  nt |d tr,|d dkrt|d i i |d }
x t|
D ]}t|
|||< qW |s*t|jd|d   nRtt|d i i |d g|d }
|
||d < |sPt|jd|d |d f  n$|sjt|jd|d |d f  n|sjt|jd|  W q tk
r   |st|jd|  Y qX 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
    from 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>[   s    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   s    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 )N)r   str)r!   er   r   r   r#      s    z.Unable to import %r from %r: %r does not existzfrom %s import %sz, 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   )"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$   r4   Zimported_objectkZimported_namesr   r   r   import_itemsB   s    
(,"""  rJ   c                s  ddl m ddlm} js$|  ddlm
 jdg }t
dg }|| dk}j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}
yddl	m
} d}
W n tk
r
   Y nX |rT	s&tjd t|	d}x|j D ]\}}||< q>W |
r| rxl|j D ]`\}}|jdd' }t|j}|ksld||f krqlj|jg  |j j| qlW |s^x|	 D ]|\}}|sqt|j}|krqxN|D ]F}d||jf kr*q|jrj|jg  |j j|j qW qW |  	stjd|r~dnd   |  t
d!dr܈	stjd" tt	d}x|j D ]\}}||< qW t
d#i }|r0	stjd$ t|	d}x|j D ]\}}||< qW t
d%i }|r	sVtjd& t|	d}x|j D ]\}}||< qnW S )(Nr   )apps)setup)settings	dont_loadZSHELL_PLUS_DONT_LOADr&   rD   ZSHELL_PLUS_MODEL_ALIASESZSHELL_PLUS_APP_PREFIXESSHELL_PLUS_PRE_IMPORTSc                 s   i } xt j D ]\}}t|}j|i } j|}xht |D ]\}d||f krXqB|j|}|s||rxd||f }n|}| j|g  | | jd||f  qBW qW | 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.
        z%s.%sz%s_%s)sorteditemsr   get
setdefaultrA   )Zmodels_to_importapp_modmodelsapp_nameZapp_aliasesprefix
model_namealias)app_prefixesrN   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jd  t| j  d S )NZSHELL_PLUS_SUBCLASSES_IMPORTz# Shell Plus Subclasses Imports)r:   r/   	SQL_TABLEr	   Zcollect_subclasses)Zbase_classes_to_import)perform_automatic_importsrD   rM   rC   r   r   import_subclasses   s
    z)import_objects.<locals>.import_subclassesc                 s   t  j  } |  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)r]   r_   r   r   import_models   s    z%import_objects.<locals>.import_modelsc                s   x| j  D ]\}}g }xt|D ]\}}y>td||f  |< ||krR|j| n|jd||f  W q  tk
r } z>jdrtj  jdstj	d||t
|f  W Y dd}~X q X q W jds
tjd|dj|f  q
W 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.
        z%s.%sz
%s (as %s)	tracebackrD   z*Failed to import '%s' from '%s' reason: %sNzfrom %s import %sz, )rQ   rP   r   rA   r<   rR   rb   	print_excr/   r0   r)   r2   rB   )Zmodules_to_classesZfull_module_pathrU   Zmodel_labelsrX   rY   r*   )rE   optionsrC   r   r   r_      s     

,
z1import_objects.<locals>.perform_automatic_importsc              3   s,   x& j  D ]} | jr
| j| j fV  q
W d S )N)Zget_app_configsZmodels_moduleZ
get_models)Zapp)rK   r   r   get_apps_and_models
  s    z+import_objects.<locals>.get_apps_and_modelsF)_document_registryTz# Shell Plus User Pre Imports)rD   r   r   z%s.%sz# 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.appsrK   ZdjangorL   readyZdjango.confrM   rR   r:   Zmongoengine.baserf   r<   r/   r^   rJ   rQ   r   r   r   rS   rA   r   rh   )rd   rC   rL   Zdont_load_cliZdont_load_confZdont_load_any_modelsrO   r`   ra   re   Zmongoenginerf   ZimportsrI   vr$   modrV   rT   Z
app_modelsri   rj   r   )rZ   rK   rN   r]   rE   r[   r\   rd   r_   rD   rM   rC   r   import_objects   s    
	



ro   )F)r   rb   r=   r5   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
   rh   r.   r   r   rJ   ro   r   r   r   r   <module>   s*   
l