
    jg2<                         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y)    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y)ObjectImportErrorN)__name__
__module____qualname__     ^/var/www/html/Stanley/venv/lib/python3.12/site-packages/django_extensions/management/shells.pyr   r   !   s    r   r   c                     t        t        | j                  d                  }	 	 ||j                  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   %   sn    " (8>>#./0F	&,,'9:Q>?? 	!9	  s)   A AA AA A#"A#c                 
   i }| D ]  }t        |t              r|j                         }	 t        |t              r|j                  d      r	 t	        j
                  |      }t        d j                  D              s |st        |j                  d|z               |st        |j                  d|z               |j                  D ]=  }t        |t        j                        rM|j                  D ]>  }|j                  xs |j                  }	t!        j"                  |j                        ||	<   @ t        |t        j$                        st!        j&                  |j(                  i i |j                  D cg c]  }|j                   c}      }
|j                  D ]e  }|j                  xs |j                  }		 |j                  dk(  r t+        |
      D ]  }t-        |
|      ||<    nt-        |
|j                        ||	<   g @ nt3        j4                  d	t6        d
       t        |t              rCt'        |      }
|
||j9                  d      d   <   |st        |j                  d|z               wt        |t:        t<        f      rt?        |      d
k(  rt        |d   t              s$|s t        |j                  d|d   z               t        |d   t:        t<        f      rt        d |d   D              rxt'        |d   i i |d         }
g }|d   D ]#  }	 t-        |
|      ||<   |jA                  |       % |sAt        |j                  d|d   ddjC                  |                   nt        |d   t              r|d   dk(  rVt'        |d   i i |d         }
t+        |
      D ]  }t-        |
|      ||<    |st        |j                  d|d   z               nt-        t'        |d   i i |d   g      |d         }
|
||d   <   |spt        |j                  d|d   d|d                nI|sGt        |j                  d|d   d|d   d             n|st        |j                  d|z                |S # t        $ r3}|s&t        |j                  d|d|             Y d}~Y d}~ed}~ww xY wc c}w # t.        $ r$}t        t+        |
             t1        |      d}~ww xY w# t.        $ r- |s't        |j                  d|d|d   d|d             Y w xY w# t0        $ r# |st        |j                  d|z               Y dw xY w)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   p   K   | ].  }t        |t        j                  t        j                  f       0 y wN)
isinstanceastImport
ImportFrom).0bodys     r   	<genexpr>zimport_items.<locals>.<genexpr>[   s'     `V_d:dSZZ,HIV_s   46z"Only specify import statements: %rz%s*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                y wr$   )r%   str)r)   es     r   r+   zimport_items.<locals>.<genexpr>   s     Fpco^_zRSUXGYcos   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%   r0   strip
startswithr&   parse	ExceptionprintERRORallr*   SQL_COLTYPEr'   namesasnamename	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_itemsrW   B   s3    &	i%!)IV	F)S)i.B.BCW.X!99Y/D
 `VZV_V_``%ekk*NQZ*Z[\!%++D9,<=> IID!$

3$(JJD%)[[%=DIIF7@7N7Ntyy7Y,V4 %/ "$7*3*>*>t{{BPRkokukuTvkucgUYU^U^kuTv*w$(JJD%)[[%=DIIF	7#'99#3-0-A>EoWX>Y(8(; .B @GX\XaXa?b$4V$< %/ &(   V  Xs  @A  Bi-&0&;O@O$Y__S%9!%<=%e//i0GHI	D%=9c)nPQ>Q%ilC8)!%++.gjstujv.v"wx !)A,u>3FpclmncoFpCp*4Yq\2r9UV<*X)+$-aLD<9@RV9W 0 6
 !/ 5 5d ; %1  *!%"3"39UV<Y]YbYbcqYr4s"tu#IaL#6 %Q<3..81r2yYZ|.\O%(%96=oq6Q 0 3 &:#- %e&7&78JYWX\8Y&Z [.5j1rSUXabcXdWe6fhqrsht.uO=L,Yq\:#- %e&7&7yYZ|]fgh]i8j&k l)!%++mvwxmy  |E  FG  |H  /I  #J  K%ekk*]`i*ijkm 'v i ! !%ekkIs*STU  &!$ Uw $2 7 %c/&: ;&1#&6 674 $2 F'1$)%++jnpyz{p|  C  7D  +E  %FF6  	Fekk"7)"CDE	Fs   #T>R#;T>B0T>*T>:S0T>>ASA4T><AT>AT>&T5ET>	S"S<T>T>ST>	T	S=	=T	T>2T;7T>:T;;T>>(U*)U*c                     ddl m ddlm} j                  s |        ddlm  j                  dg       }t        dg       }||z   dv } j                  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}
|rGst        j                  d             t        |      }|j                         D ]
  \  }}||<    |
r|sj                         D ]v  \  }}|j!                  d      d   }t#        |j$                        }|v s	|d|v r=j'                  |j$                  g        |j$                     j)                  |       x |s |	       D ]  \  }}|s	t#        |j*                        }|v r#|D ]g  }|d|j*                  v r|j$                  s$j'                  |j$                  g        |j$                     j)                  |j*                         i   |        s!t        j                  d      |rdndz          |        t        dd      rKst        j                  d             t        t,              }|j                         D ]
  \  }}||<    t        di       }|rGst        j                  d             t        |      }|j                         D ]
  \  }}||<    t        di       }|rGst        j                  d              t        |      }|j                         D ]
  \  }}||<    S # t        $ r Y w xY w)!Nr   )apps)setup)settings	dont_loadSHELL_PLUS_DONT_LOADr,   rO   SHELL_PLUS_MODEL_ALIASESSHELL_PLUS_APP_PREFIXESSHELL_PLUS_PRE_IMPORTSc                  r   i } t        
j                               D ]  \  }}t        |      }j                  |i       }j                  |      }t        |      D ]V  }|d|	v r|j                  |      }|s|r|d|}n|}| j	                  |g        | |   j                  |d|       X  | 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
setdefaultrK   )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:OGV#G,H'++Hb9K!%%h/F$Vn
&
3y@#
3+1: > * ++E26 '..':/NO -  ;&  r   c                      t        dg       } | r<st        j                  d              t        |       j	                                y y )NSHELL_PLUS_SUBCLASSES_IMPORTz# Shell Plus Subclasses Imports)rD   r8   	SQL_TABLEr
   collect_subclasses)base_classes_to_importperform_automatic_importsrO   r[   rN   s    r   import_subclassesz)import_objects.<locals>.import_subclasses   sI    !(3QSU!V!eoo&GHI%&67M&N&a&a&cd "r   c                  R    t               j                                }  |        y)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_modelsrr   rx   s    r   import_modelsz%import_objects.<locals>.import_models   s&     56MMNtNvw!"34r   c                 V   | j                         D ]  \  }}g }t        |      D ]G  \  }}	 t        |d|      |<   ||k(  r|j                  |       n|j                  |d|d       I j                  d      rot        	j                  d
|ddj                  |                    y	# t        $ rl}j                  d      rt        j                          j                  d      s,t        	j                  d|d|dt        |                   Y d	}~d	}~ww xY w)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 )	tracebackrO   zFailed to import 'z' from 'z
' reason: Nr!   r2   r3   )rd   rc   r   rK   rF   re   r   	print_excr8   r9   r0   r;   rL   )
modules_to_classesfull_module_pathri   model_labelsrm   rn   r1   rP   optionsrN   s
          r   rx   z1import_objects.<locals>.perform_automatic_imports   s    );(@(@(B$fL'-f~#Ut.;GWYc<d.e$U+!U*$++J7$++J,NO (6 ;;|,e''?OQUQZQZ[gQh(ijk! )C # t{{;/!++-";;|4ekkLVXhjmnojpqs t	ts   AB33	D(<A"D##D(c               3      K   j                         D ]-  } | j                  s| j                  | j                         f / y wr$   )get_app_configsmodels_module
get_models)apprY   s    r   get_apps_and_modelsz+import_objects.<locals>.get_apps_and_models
  s;     '')C  '')999 *s
    A!AF)_document_registryTz# Shell Plus User Pre Imports)rO   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.appsrY   djangorZ   readydjango.confr[   re   rD   mongoengine.baser   rF   r8   ru   rW   rd   r   r   r   rf   rK   r   r   ) r   rN   rZ   dont_load_clidont_load_confdont_load_any_modelsr`   ry   r}   r   mongoenginer   importsrU   vr>   modrj   rh   
app_modelsr   r   ro   rY   r\   rr   rP   rp   rq   rx   rO   r[   s    ``                    @@@@@@@@@@r   import_objectsr      sd    ::$KKR0MX'=rBN.I)+\*JH&@"EM8%>CL$X/GLK <e5l2:
 K7
 %//"ABC5uTMMODAq"#Q $ /+113ID#::c?2&D#CNN3H9$Hd)C	(Q""3>>26'..t4 4  #6#8GZ#G$4$45H9$!&5B>>**3>>2>/66s||D " $9" eoo<=OciklmO x4d;%//"?@A8%JWMMODAq"#Q $ !+?D%//"=>?15ZPMMODAq"#Q $ &h0I2N%//"BCD6*UMMODAq"#Q $ M  s   ;M* *	M76M7)F)r&   r   rG   r?   typingr   r   r   r   django.apps.configr   django.utils.module_loadingr   %django_extensions.collision_resolversr	   #django_extensions.import_subclassesr
   #django_extensions.utils.deprecationr   r   r7   r   r   rW   r   r   r   r   <module>r      sR    
     2 5 J @ K	 		 	:iXkr   