
    Ƿi2<                         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
e          Zd ZddZ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                       e Zd ZdS )ObjectImportErrorN)__name__
__module____qualname__     [/srv/django_bis/venv311/lib/python3.11/site-packages/django_extensions/management/shells.pyr   r   !   s        Dr   r   c                     t          t          |                     d                              }	 	 ||                    t                    dz            S # t
          $ r |d         cY S w xY w# t          $ r | cY S w xY 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rpartss     r   get_app_namer   %   s    " (8>>#..//00F	&,,'9::Q>?? 	 	 	!9	    s)   "A A*'A- )A**A- -A<;A<Fc                 ^   i }| D ]&}t          |t                    r|                                }	 t          |t                    r|                    d          r		 t	          j        |          }nF# t          $ r9}|s-t          |                    d|d|                     Y d}~Y d}~nd}~ww xY wt          d |j
        D                       s(|s%t          |                    d|z                       |s%t          |                    d|z                       |j
        D ]5}t          |t          j                  r4|j        D ],}|j        p|j        }	t!          j        |j                  ||	<   -t          |t          j                  rt!          j        |j        i i d |j        D                       }
|j        D ]}|j        p|j        }		 |j        d	k    r&t+          |
          D ]}t-          |
|          ||<   nt-          |
|j                  ||	<   [# t.          $ r0}t          t+          |
                     t1          |          d}~ww xY w7nt3          j        d
t6          d           t          |t                    rVt'          |          }
|
||                    d          d         <   |s%t          |                    d|z                       t          |t:          t<          f          rt?          |          dk    rt          |d         t                    s/|s+t          |                    d|d         z                       dt          |d         t:          t<          f          rt          d |d         D                       rt'          |d         i i |d                   }
g }|d         D ]o}	 t-          |
|          ||<   |                     |           ,# t.          $ r7 |s2t          |                    d|d|d         d|d                     Y lw xY w|sAt          |                    d|d         dd!                    |                               nlt          |d         t                    r|d         d	k    rqt'          |d         i i |d                   }
t+          |
          D ]}t-          |
|          ||<   |s+t          |                    d|d         z                       nt-          t'          |d         i i |d         g          |d                   }
|
||d         <   |s4t          |                    d|d         d|d                              n_|s5t          |                    d|d         d|d         d                     n'|s%t          |                    d|z                       # t0          $ r+ |s%t          |                    d|z                       Y $w xY 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 zimport zError parsing:  Nc              3   b   K   | ]*}t          |t          j        t          j        f          V  +d S N)
isinstanceastImport
ImportFrom).0bodys     r   	<genexpr>zimport_items.<locals>.<genexpr>[   s5      ``d:dSZ,HII``````r   z"Only specify import statements: %rz%sc                     g | ]	}|j         
S r   )name)r)   r-   s     r   
<listcomp>z import_items.<locals>.<listcomp>i   s    TvTvTvcgUYU^TvTvTvr   *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              3   @   K   | ]}t          |t                    V  d S r$   )r%   str)r)   es     r   r+   zimport_items.<locals>.<genexpr>   s/      FpFp^_zRSUXGYGYFpFpFpFpFpFpr   zUnable to import z from z: z does not existr!    import , zfrom %s import *z: names must be of type stringz1Unable to import %r: names must be of type stringzUnable to import %r)"r%   r3   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-   r@   imported_objectkimported_namess                r   import_itemsrY   B   s    & YF YF	i%% 	*!))IV	F)S)) Rli.B.BCW.X.X Rl!9Y//DD  ! ! !% !ekkkIIIss*STTUUU ! ! ! ! !! ``VZV_````` % ]ekk*NQZ*Z[[\\\! ?%++D9,<==>>> I 7 7D!$
33 Z$(J Z ZD%)[%=DIF7@7Nty7Y7Y,V44!$77 7*3*>t{BPRTvTvkokuTvTvTv*w*w$(J 7 7D%)[%=DIF	7#'9#3#3-0-A-A %Z %Z>EoWX>Y>Y(8(;(;%Z @GX\Xa?b?b$4V$<#1 7 7 7 %c/&:&: ; ; ;&1#&6&6 677(   V  Xs  @A  B  B  B  Bi-- -l&0&;&;O@O$Y__S%9%9!%<=% Je//i0GHHIII	D%=99 'lc)nnPQ>Q>Q%ilC88 !) y!%++.gjstujv.v"w"wxxx !)A,u>> K3FpFpclmncoFpFpFpCpCp K*4Yq\2r9UV<*X*X)+$-aL < <D<9@RV9W9W 0 6
 !/ 5 5d ; ; ; ;	 $2 F F F'1 !F$)%+++jnjnjnpyz{p|p|p|  C  C  C  7D  +E  +E  %F  %F  %FF
  * v!%"3"3"39UV<<<Y]YbYbcqYrYrYr4s"t"tuuu#IaL#66 K %Q<3...81r2yYZ|.\.\O%(%9%9 R R6=oq6Q6Q 0 3 3#- \ %e&7&78JYWX\8Y&Z&Z [ [ [.5j1rSUXabcXdWe6f6fhqrsht.u.uO=L,Yq\:#- m %e&7&7&7yYZ|||]fgh]i]i8j&k&k l l l) K!%+++mvwxmymymy  |E  FG  |H  |H  |H  /I  #J  #J  K  K  K% lekk*]`i*ijjkkk 	F 	F 	F Fekk"7)"CDDEEE	F s   ,W5A43W54
B7>*B2(W5-W52B77AW5 CW5A	H&%W5&
I 	0+I	I 	 BW5.A9W5)A+W5O>(W5>>P?<W5>P??F4W551X*)X*c                     ddl m ddlm} j        s
 |             ddlm                      dg           }t          dg           }||z   dv }                     d          t          d	i           t          d
i           t          di           }i i fdfd}fd} fdfd}	d}
	 ddl	m
} d}
n# t          $ r Y nw xY w|rUs"t                              d                     t          |          }|                                D ]
\  }}||<   |
r|s|                                D ]}\  }}|                    d          d         }t#          |j                  }|v s	|d|v rB                    |j        g            |j                                     |           ~|s |	            D ]|\  }}|st#          |j                  }|v r!|D ]X}|d|j        v r|j        r@                    |j        g            |j                                     |j                   Y} |             s)t                              d          |rdndz              |             t          dd          rZs"t                              d                     t          t,                    }|                                D ]
\  }}||<   t          di           }|rUs"t                              d                     t          |          }|                                D ]
\  }}||<   t          di           }|rUs"t                              d                      t          |          }|                                D ]
\  }}||<   S )!Nr   )apps)setup)settings	dont_loadSHELL_PLUS_DONT_LOADr/   rQ   SHELL_PLUS_MODEL_ALIASESSHELL_PLUS_APP_PREFIXESSHELL_PLUS_PRE_IMPORTSc                     i } t          
                                          D ]\  }}t          |          }                    |i           }                    |          }t          |          D ]e}|d|	v r|                    |          }|s|r|d|}n|}|                     |g            | |                             |d|           f| 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.
        r   _)sorteditemsr   get
setdefaultrM   )models_to_importapp_modmodelsapp_nameapp_aliasesprefix
model_namealiasapp_prefixesr^   load_modelsmodel_aliasess           r   &get_dict_from_names_to_possible_modelsz>import_objects.<locals>.get_dict_from_names_to_possible_models   s    %k&7&7&9&9:: 	P 	POGV#G,,H'++Hb99K!%%h//F$Vnn P P
&hh

3y@@#
33 + ++166:: > * ++E2666 '..'''::/NOOOOP  r   c                      t          dg           } | rPs"t                              d                      t          |                                                      d S d S )NSHELL_PLUS_SUBCLASSES_IMPORTz# Shell Plus Subclasses Imports)rF   r;   	SQL_TABLEr
   collect_subclasses)base_classes_to_importperform_automatic_importsrQ   r]   rP   s    r   import_subclassesz)import_objects.<locals>.import_subclasses   s}    !(3QSU!V!V! 	e Jeoo&GHHIII%%&67M&N&N&a&a&c&cddddd	e 	er   c                  p    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_modelsrt   rz   s    r   import_modelsz%import_objects.<locals>.import_models   sA     566MMNtNtNvNvww!!"344444r   c                    |                                  D ]H\  }}g }t          |          D ]\  }}	 t          |d|          |<   ||k    r|                    |           n|                    |d|d           U# t          $ r}                    d          rt          j                                         d          s8t          		                    d|d|dt          |                               Y d	}~d	}~ww xY w                    d          s;t          	                    d
|dd                    |                               Jd	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 (as )	tracebackrQ   zFailed to import 'z' from 'z
' reason: Nr!   r5   r6   )rf   re   r   rM   rH   rg   r   	print_excr;   r<   r3   r>   rN   )
modules_to_classesfull_module_pathrk   model_labelsro   rp   r4   rR   optionsrP   s
          r   rz   z1import_objects.<locals>.perform_automatic_imports   s    );(@(@(B(B 	l 	l$fL'-f~~ t t#Ut.;GWGWGWYcYc<d.e.e$U+!U**$++J7777$++JJJ,NOOO" t t t{{;// .!+---";;|44 tekkkLVJJXhXhXhjmnojpjpjpqs s t t t	t ;;|,, le'''?O?O?OQUQZQZ[gQhQhQh(ijjkkk!	l 	ls   AB
DA5DDc               3      K                                    D ]&} | j        r| j        |                                 fV  'd S r$   )get_app_configsmodels_module
get_models)appr[   s    r   get_apps_and_modelsz+import_objects.<locals>.get_apps_and_models
  sV      '')) 	: 	:C  :')9)99999	: 	:r   F)_document_registryTz# Shell Plus User Pre Imports)rQ   r   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.appsr[   djangor\   readydjango.confr]   rg   rF   mongoengine.baser   rH   r;   rw   rY   rf   r   r   r   rh   rM   r   r   ) r   rP   r\   dont_load_clidont_load_confdont_load_any_modelsrb   r{   r   r   mongoenginer   importsrW   vr-   modrl   rj   
app_modelsr   r   rq   r[   r^   rt   rR   rr   rs   rz   rQ   r]   s    ``                    @@@@@@@@@@r   import_objectsr      s         : $$$$$$KKR00MX'=rBBN.I)+\**JH&@"EEM8%>CCL$X/GLLK               <e e e e e e e e5 5 5 5 5 5l l l l l l l2: : : : :
 K777777     $ 	D%//"ABBCCC5uTTTMMOO 	$ 	$DAq"#Q 5/ 5+1133 	5 	5ID#::c??2&D#CN33H9$$HHHdd)C	(Q(Q""3>2666'..t4444 E#6#6#8#8 	E 	EGZ #G$455H9$$! E E&hh5BB> E**3>2>>>/66s|DDDE  neoo<==OcAkiklmmmMOOO x4d;; $ 	B%//"?@@AAA8%JWWWMMOO 	$ 	$DAq"#Q +?DD $ 	@%//"=>>???15ZPPPMMOO 	$ 	$DAq"#Q &h0I2NN $ 	E%//"BCCDDD6*UUUMMOO 	$ 	$DAq"#Qs   C 
C'&C')F)r&   r   rI   rA   typingr   r   r   r   django.apps.configr   django.utils.module_loadingr   %django_extensions.collision_resolversr	   #django_extensions.import_subclassesr
   #django_extensions.utils.deprecationr   r   r:   r   r   rY   r   r   r   r   <module>r      sI   



                     2 1 1 1 1 1 5 5 5 5 5 5 J J J J J J @ @ @ @ @ @ K K K K K K	 	 	 	 	 	 	 		 	 	 	  :i i i iXk k k k kr   