o
    /hF                     @   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/html/env_mimamsha/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'
    .   )listreversedsplitindexr   
ValueError
IndexError)mod_namerpartsr   r   r   get_app_name%   s   r   Fc                 C   s  i }| D ];}t |tr| }zt |tr|drzt|}W n& tyI } z|s?t|d||f  W Y d}~W qW Y d}~nd}~ww t	dd |j
D sa|s_t|d|  W q|slt|d|  |j
D ]|}t |tjr|jD ]}|jp|j}	t|j||	< qzt |tjrt|ji i dd	 |jD }
|jD ]G}|jp|j}	z|jd
krt|
D ]	}t|
|||< qnt|
|j||	< W q ty } ztd|j d|j dt|
  t|d}~ww qon;tjdtdd t |trt|}
|
||dd < |st|d|  W qt |ttfrt|dkrt |d ts>|s<t|d|d   W qt |d ttfrt	dd |d D rt|d i i |d }
g }|d D ].}z	t|
|||< W n ty   |st|d||d |f  Y qew | | qe|st|d|d d!|f  nt |d tr
|d d
krt|d i i |d }
t|
D ]
}t|
|||< q|st|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|s)t|d|  W q ty@   |s>t|d|  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
    )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>]   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>t   s    z import_items.<locals>.<listcomp>*zCouldn't find z in z. Only found: 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#      s    

z.Unable to import %r from %r: %r does not existfrom %s import %s, zfrom %s import *z2Unable to import %r from %r: names must be stringsz*Unable to import %r: names must be stringsz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)import_directivesstyle
quiet_loadimported_objects	directivenodeexcr"   r$   r6   imported_objectkimported_namesr   r   r   import_itemsB   sF  







!	
	rO   c                    sD  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w |r	std t|	d}| D ]\}}||< q|
r|s| D ],\}}|dd }t|j}|v sd||f v rq|jg  |j | q|s|	 D ]4\}}|sqt|j}|v rq|D ] }d||jf v rq|jr|jg  |j |j qq|  	s'td|r#dnd   |  t
d!drP	s;td" tt	d}| D ]	\}}||< qFt
d#i }|rx	sctd$ t|	d}| D ]	\}}||< qnt
d%i }|r	std& t|	d}| D ]	\}}||< qS )'Nr   apps)setup)settings	dont_loadSHELL_PLUS_DONT_LOADr&   rG   SHELL_PLUS_MODEL_ALIASESSHELL_PLUS_APP_PREFIXESSHELL_PLUS_PRE_IMPORTSc                     s   i } 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)sorteditemsr   get
setdefaultrC   )models_to_importapp_modmodelsapp_nameapp_aliasesprefix
model_namealias)app_prefixesrT   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)r<   r1   	SQL_TABLEr	   collect_subclasses)base_classes_to_import)perform_automatic_importsrG   rS   rF   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)ri   rn   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.
        rY   z
%s (as %s)	tracebackrG   z*Failed to import '%s' from '%s' reason: %sNr+   r,   )r[   rZ   r   rC   r>   r\   rs   	print_excr1   r2   r)   r4   rD   )modules_to_classesfull_module_pathr`   model_labelsrd   re   r*   )rH   optionsrF   r   r   rn   9  sD   




z1import_objects.<locals>.perform_automatic_importsc                  3   s*       D ]} | jr| j|  fV  qd S r   )get_app_configsmodels_module
get_models)apprP   r   r   get_apps_and_models]  s   z+import_objects.<locals>.get_apps_and_modelsF)_document_registryTz# Shell Plus User Pre Imports)rG   r   rY   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)django.appsrQ   djangorR   readydjango.confrS   r\   r<   mongoengine.baser~   r>   r1   rk   rO   r[   r   r   r   r]   rC   r   r   )rx   rF   rR   dont_load_clidont_load_confdont_load_any_modelsrX   ro   rr   r}   mongoenginer~   importsrM   vr$   modra   r_   
app_modelsr   r   r   )rf   rQ   rT   ri   rH   rg   rh   rx   rn   rG   rS   rF   r   import_objects   s   
	$


	r   )F)r   rs   r?   r7   typingr   r   r   r   django.apps.configr   django.utils.module_loadingr   %django_extensions.collision_resolversr   #django_extensions.import_subclassesr	   #django_extensions.utils.deprecationr
   r   r0   r   r   rO   r   r   r   r   r   <module>   s    
 1