
    jO                     l   S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJr  \R0                  " S5      r\" SS/5      r\" SS5      rS r " S S\R<                  5      r " S S5      r  " S S5      r! " S S5      r"S r#S r$S r% " S S5      r&g)z
Various data structures used in query construction.

Factored out from django.db.models.query to avoid making the main module very
large and/or so that they can be used by other modules without getting into
circular import difficulties.
    N)
namedtuple)nullcontext)
FieldError)DEFAULT_DB_ALIASDatabaseErrorconnectionsmodelstransaction)
LOOKUP_SEP)tree)cached_property)make_hashabledjango.db.models
_connector_negatedPathInfozGfrom_opts to_opts target_fields join_field m2m direct filtered_relationc              #   l   #    U v   U R                  5        H  n[        U5       S h  vN   M     g  N	7fN)__subclasses__
subclassesclssubclasss     T/var/www/html/KUNJ/venv/lib/python3.13/site-packages/django/db/models/query_utils.pyr   r   #   s.     
I&&(h''' )'s   &42
4c                      ^  \ rS rSrSrSrSrSr\rSr	S\\\4r
SSS	.U 4S
 jjr\SU 4S jj5       r\S 5       rS rS rS rS rS r SS jrS rS r\4S jrS r\S 5       rS rS r\S 5       rSrU =r $ )Q)   zY
Encapsulate filters as objects that can then be combined logically (using
`&` and `|`).
ANDORXORTNF)r   r   c                |   > U R                  U5        [        TU ]	  / UQ[        UR	                  5       5      QUUS9  g N)children	connectornegated)_check_connectorsuper__init__sorteditems)selfr   r   argskwargs	__class__s        r   r(   
Q.__init__7   sA    j)5t5fV\\^45  	 	
    c                 B   > U R                  U5        [        TU ]	  XUS9$ r"   )r&   r'   create)r   r#   r$   r%   r.   s       r   r2   Q.create?   s$    Y'w~xg~VVr0   c                     XR                   ;  a4  SR                  S U R                   SS   5       5      n[        SU S35      eg )Nz, c              3   (   #    U  H  o< v   M
     g 7fr    ).0conns     r   	<genexpr>%Q._check_connector.<locals>.<genexpr>G   s     'S@R(@Rs      zconnector must be one of z
, or None.)
connectorsjoin
ValueError)r   r$   connector_reprss      r   r&   Q._check_connectorD   sF    NN*"ii'Sqr@R'SSO88ITUU +r0   c                 $   [        USS5      SL a  [        U5      eU (       d  UR                  5       $ U(       d%  [        U[        5      (       a  U R                  5       $ U R                  US9nUR                  X5        UR                  X5        U$ )NconditionalF)r$   )getattr	TypeErrorcopy
isinstancer   r2   add)r+   otherr8   objs       r   _combine
Q._combineJ   su    5-/58E""::<E1--99;kkDk)
r0   c                 8    U R                  XR                  5      $ r   )rJ   r   r+   rH   s     r   __or__Q.__or__W   s    }}UGG,,r0   c                 8    U R                  XR                  5      $ r   )rJ   r   rM   s     r   __and__	Q.__and__Z       }}UHH--r0   c                 8    U R                  XR                  5      $ r   )rJ   r    rM   s     r   __xor__	Q.__xor__]   rS   r0   c                 F    U R                  5       nUR                  5         U$ r   )rE   negate)r+   rI   s     r   
__invert__Q.__invert__`   s    iik


r0   c           	      T    UR                  U UUSSUS9u  pgUR                  U5        U$ )NF)allow_joins
split_subqcheck_filterable	summarize)_add_qpromote_joins)r+   queryr\   reuser_   for_saveclausejoinss           r   resolve_expressionQ.resolve_expressione   s@    
 #" % 
 	E"r0   c                    U(       d  U $ U R                  U R                  U R                  S9nU R                   GH  nUn[	        U[
        5      (       a  Uu  pV[        U;   a  UR                  [        S5      u  pxOUnS n[        R                  " U5      n	U	R                  U5      =n
U	Lap  Uc  SnU
R                  U5      =nc0  U
R                  U5      =n b  U" U
5      n
SnU
R                  U5      nUc  US:X  a  U
R                  S5      nSnUb  U" X5      nOUR                  U5      nUR                  R                  U5        GM     U$ )N)r$   r%   r;   exactisnullT)r2   r$   r%   r#   rF   tupler   rsplitr	   Freplace_expressions
get_lookupget_transformappend)r+   replacementsclonechildchild_replacementlhsrhspathlookupfieldfield_replacementlookup_classtransform_classs                r   ro   Q.replace_expressionsu   s]   KdnndllK]]E %%'' $#&::j!#<LD&D!F).)B)B<)PP% ~!((9(D(DV(LLU/@/N/Nv/VVO!%& 1@@Q0R-%,F+<+G+G+OL{v'8'8'C'CH'M"#/,89J,P)$)$=$=l$K!NN!!"34A #B r0   c              #      #    U v   U R                    HL  n[        U[        5      (       a  US   n[        US5      (       a  UR	                  5        Sh  vN   MH  Uv   MN     g N7f)zO
Recursively yield this Q object and all subexpressions, in depth-first
order.
r;   flattenN)r#   rF   rl   hasattrr   )r+   ru   s     r   r   	Q.flatten   sV     
 
]]E%''aui(( ==?** #
 +s   AA&A$A&c                 V   SSK Jn  SSKJn  SSKJn  U" S5      nUR                  5        H.  u  px[        US5      (       d  U" U5      nUR                  XSS9  M0     UR                  U" S	5      S
5        [        U   n	UR                  U 5        UR                  US9n
U	R                  (       a  [        R                  " US9O	[        5       n U   U
R!                  U5      SLsSSS5        $ ! , (       d  f       g= f! ["         a   n[$        R'                  SX5         SnAgSnAff = f)zd
Do a database query to check if the expressions of the Q instance
matches against the expressions.
r   )Value)Query)SINGLENrg   F)selectr;   _check)usingz.Got a database error calling check() on %r: %sT)django.db.modelsr   django.db.models.sqlr   django.db.models.sql.constantsr   r*   r   add_annotationr   add_qget_compilerin_atomic_blockr
   atomicr   execute_sqlr   loggerwarning)r+   againstr   r   r   r   rb   namevalue
connectioncompilercontext_manageres                r   checkQ.check   s     	+.9d"==?KD5"677e  U ; + 	U1Xx0 '
D%%E%2 )) U+ 	
	 ++F34? ! 	NNKTU	s6   C> C-#	C> -
C;7C> ;C> >
D(D##D(c                 h   U R                   R                  < SU R                   R                  < 3nUR                  S5      (       a  UR	                  SS5      n[        U R                  5      n0 nU R                  U R                  :w  a  U R                  US'   U R                  (       a  SUS'   XU4$ )N.zdjango.db.models.query_utilsr   r   Tr   )
r.   
__module____name__
startswithreplacerl   r#   r$   defaultr%   )r+   ry   r,   r-   s       r   deconstructQ.deconstruct   s    ..33T^^5L5LM??9::<< >@RSDT]]#>>T\\)#'>>F< <<!%F:6!!r0   c                    U R                  5       u  pnU/UR                  5       QnU HL  n[        U[        5      (       a#  Uu  pg[	        U5      nUR                  Xg45        M;  UR                  U5        MN     [        U5      $ r   )r   r*   rF   rl   r   rr   )r+   ry   r,   r-   identityru   argr   s           r   r   
Q.identity   sv    !--/F*6<<>*E%''"
%e,-&  Xr0   c                 j    [        U[        5      (       d  [        $ UR                  U R                  :H  $ r   )rF   r   NotImplementedr   rM   s     r   __eq__Q.__eq__   s(    %##!!~~..r0   c                 ,    [        U R                  5      $ r   )hashr   )r+   s    r   __hash__
Q.__hash__   s    DMM""r0   c                     SSK Jn  UR                  U 5       Vs1 s H  o"R                  [        S5      S   iM     sn$ s  snf )zv
Retrieve all base fields referenced directly or through F expressions
excluding any fields referenced through joins.
r   )rb   r;   )r   rb   get_children_from_qsplitr   )r+   rb   ru   s      r   referenced_base_fieldsQ.referenced_base_fields   sE     	/ 8=7P7PQU7V
7VeKK
A&q)7V
 	
 
s   "?r6   )NNF)NTNFF)!r   r   __qualname____firstlineno____doc__r   r   r    r   rB   r<   r(   classmethodr2   r&   rJ   rN   rQ   rU   rY   rg   ro   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__)r.   s   @r   r   r   )   s     C	B
CGKR%J)- 
 
 W W V V
-.. SX %N $4 @
" 
 
/
# 

 

r0   r   c                   :    \ rS rSrSrS rS
S jrS rS rS r	S	r
g)DeferredAttribute   zx
A wrapper for a deferred-loading field. When the value is read from this
object the first time, the query is executed.
c                     Xl         g r   r{   )r+   r{   s     r   r(   DeferredAttribute.__init__   s    
r0   Nc                 .   Uc  U $ UR                   nU R                  R                  nXC;  af  U R                  U5      nUcN  UR	                  5       (       d  [        SU< S35      eUR                  R                  R                  X5        X4   $ XSU'   X4   $ )z`
Retrieve and caches the value from the datastore on the first lookup.
Return the cached value.
zCannot retrieve deferred field z from an unsaved model.)	__dict__r{   attname_check_parent_chain
_is_pk_setAttributeError_state
fetch_modefetch)r+   instancer   data
field_namevals         r   __get__DeferredAttribute.__get__  s    
 K  ZZ''
! **84C{**,,(9* H1 1 
 **00@  $'Z r0   c                     UR                   nUR                  U R                  R                  5      nU R                  R                  (       a%  U R                  U:w  a  [        XR                  5      $ g)z
Check if the field value can be fetched from a parent field already
loaded in the instance. This can be done if the to-be fetched
field is a primary key field.
N)_metaget_ancestor_linkr{   modelprimary_keyrC   r   )r+   r   opts
link_fields       r   r   %DeferredAttribute._check_parent_chain  sS     ~~++DJJ,<,<=
::!!djjJ&>8%7%788r0   c                 L    UR                  U R                  R                  /S9  g )N)fields)refresh_from_dbr{   r   )r+   r   s     r   	fetch_oneDeferredAttribute.fetch_one(  s       ););(< =r0   c                 z   U R                   R                  nUS   R                  R                  nU R                   R                  R
                  R                  U5      R                  USS9R                  U Vs1 s H  oDR                  iM     sn5      nU H  n[        XbXVR                     5        M     g s  snf )Nr   T)flat)r{   r   r   dbr   _base_managerr   values_listin_bulkpksetattr)r+   	instancesr   r   ivalue_by_pkr   s          r   
fetch_manyDeferredAttribute.fetch_many+  s    **$$q\  ##JJ**004[t[,WI.IqddI./ 	
 "HH{;;'?@ " /s   :B8r   r   )r   r   r   r   r   r(   r   r   r   r   r   r6   r0   r   r   r      s!    
 2
>	Ar0   r   c                   $    \ rS rSrSrS rS rSrg)class_or_instance_methodi7  z
Hook used in RegisterLookupMixin to return partial functions depending on
the caller type (instance or class of models.Field).
c                     Xl         X l        g r   class_methodinstance_method)r+   r   r   s      r   r(   !class_or_instance_method.__init__=  s    (.r0   c                     Uc!  [         R                  " U R                  U5      $ [         R                  " U R                  U5      $ r   )	functoolspartialr   r   )r+   r   owners      r   r    class_or_instance_method.__get__A  s:    $$T%6%6>>  !5!5x@@r0   r   N)r   r   r   r   r   r(   r   r   r6   r0   r   r   r   7  s    
/Ar0   r   c                       \ rS rSrS r\R                  S 5       rS r\	" \\5      r
\" \5      rS rS r\S 5       r\S 5       rSS
 jrSS jr\	" \\5      r\" \5      rSS jrSS jr\	" \\5      r\" \5      rSrg	)RegisterLookupMixiniG  c                 B    U R                  5       R                  US 5      $ r   )get_lookupsget)r+   lookup_names     r   _get_lookupRegisterLookupMixin._get_lookupH  s    !%%k488r0   c                     [         R                  " U 5       Vs/ s H  oR                  R                  S0 5      PM      nnU R	                  U5      $ s  snf Nclass_lookups)inspectgetmror   r   merge_dicts)r   parentr  s      r   get_class_lookups%RegisterLookupMixin.get_class_lookupsK  sR     DK>>RUCV
CVOO4CV 	 
 }--
s   %Ac                 Z    U R                  5       n[        U SS 5      =n(       a  0 UEUE$ U$ Ninstance_lookups)r	  rC   )r+   r  r  s      r   get_instance_lookups(RegisterLookupMixin.get_instance_lookupsR  s=    ..0&t-?FFF8m8'788r0   c                     SSK Jn  U R                  U5      nUc,  [        U S5      (       a  U R                  R                  U5      $ Ub  [        X25      (       d  g U$ )Nr   )Lookupoutput_field)django.db.models.lookupsr  r   r   r  rp   
issubclass)r+   r   r  founds       r   rp   RegisterLookupMixin.get_lookup[  sU    3  -=WT>::$$//<<Z%>%>r0   c                     SSK Jn  U R                  U5      nUc,  [        U S5      (       a  U R                  R                  U5      $ Ub  [        X25      (       d  g U$ )Nr   )	Transformr  )r  r  r   r   r  rq   r  )r+   r   r  r  s       r   rq   !RegisterLookupMixin.get_transforme  sU    6  -=WT>::$$22;??Z%A%Ar0   c                 P    0 n[        U 5       H  nUR                  U5        M     U$ )z
Merge dicts in reverse to preference the order of the original list.
e.g., merge_dicts([a, b]) will preference the keys in 'a' over those in
'b'.
)reversedupdate)dictsmergedds      r   r  RegisterLookupMixin.merge_dictso  s(     %AMM! !r0   c                 \    [        U 5       H  nUR                  R                  5         M     g r   )r   r	  cache_clearr   s     r   _clear_cached_class_lookups/RegisterLookupMixin._clear_cached_class_lookups{  s"    "3H&&224 (r0   Nc                     Uc  UR                   nSU R                  ;  a  0 U l        XR                  U'   U R                  5         U$ r  )r   r   r  r#  r   rz   r   s      r   register_class_lookup)RegisterLookupMixin.register_class_lookup  sF     ,,K#,,. "C)/+&'')r0   c                 n    Uc  UR                   nSU R                  ;  a  0 U l        XR                  U'   U$ r  )r   r   r  r+   rz   r   s      r   register_instance_lookup,RegisterLookupMixin.register_instance_lookup  s:     ,,KT]]2$&D!-3k*r0   c                 \    Uc  UR                   nU R                  U	 U R                  5         g)zV
Remove given lookup from cls lookups. For use in tests only as it's
not thread-safe.
N)r   r  r#  r&  s      r   _unregister_class_lookup,RegisterLookupMixin._unregister_class_lookup  s/    
  ,,Kk*'')r0   c                 <    Uc  UR                   nU R                  U	 g)z[
Remove given lookup from instance lookups. For use in tests only as
it's not thread-safe.
N)r   r  r*  s      r   _unregister_instance_lookup/RegisterLookupMixin._unregister_instance_lookup  s#    
  ,,K!!+.r0   )r  r   )r   r   r   r   r   r   cacher	  r  r   r   r   rp   rq   staticmethodr  r#  r'  r+  register_lookupr.  r1  _unregister_lookupr   r6   r0   r   r   r   G  s    9 __. . ++<>RSK#$56 	 	 5 5 /7O ((=>*/ 2 "=  ++CDr0   r   c                 @   U R                   (       d  g[        U R                   SS5      (       a  gU(       d  U R                  (       + $ U R                  U;  a  gU(       a?  X;  a:  [	        SU R
                  R                  R                   SU R                   S35      eg)a  
Return whether `field` should be used to descend deeper for
`select_related()` purposes.

Arguments:
 * `field` - the field to be checked. Can be either a `Field` or
   `ForeignObjectRel` instance.
 * `restricted` - a boolean field, indicating if the field list has been
   manually restricted using a select_related() clause.
 * `requested` - the select_related() dictionary.
 * `select_mask` - the dictionary of selected fields.
Fparent_linkzField r   zM cannot be both deferred and traversed using select_related at the same time.T)remote_fieldrC   nullr   r   r   r   object_name)r{   
restricted	requestedselect_masks       r   select_related_descendr?    s      u!!=%88 ::~ zz" u/U[[&&2231UZZL AL L
 	
 r0   c                     [        S[        U 5      S-   5       H:  n[        R                  " U SU 5      nUR	                  U5      (       d  M4  X0US 4s  $    g)z
Check if the lookup_parts contains references to the given annotations set.
Because the LOOKUP_SEP is contained in the default annotation names, check
each prefix of the lookup_parts for a match.
r;   r   N)Nr6   )rangelenr   r=   r   )lookup_partsannotationsnlevel_n_lookups       r   refs_expressionrG    sX     1c,'!+,#a):;??>**!#333 - r0   c                    ^  U 4S jnU" U5      =(       d0    [        USS5      =(       a    U" UR                  R                  5      $ )z
Check that self.model is compatible with target_opts. Compatibility
is OK if:
  1) model and opts match (where proxy inheritance is removed)
  2) model is parent of opts' model or the other way around
c                    > TR                   R                  U R                  :H  =(       d9    U R                  TR                   R                  ;   =(       d    TU R                  ;   $ r   )r   concrete_modelall_parents)r   r   s    r   r   -check_rel_lookup_compatibility.<locals>.check  sP    KK&&$*=*== )""ekk&=&==)(((	
r0   r   F)rC   r   r   )r   target_optsr{   r   s   `   r   check_rel_lookup_compatibilityrN    s<    
   }e,Iu{{7H7H1Ir0   c                   N    \ rS rSrSr\" 5       S.S jrS rS rS r	S r
S	 rS
rg)FilteredRelationi  z7Specify custom filtering in the ON clause of SQL joins.	conditionc                    U(       d  [        S5      eXl        S U l        [        U[        5      (       d  [        S5      eX l        S U l        g )Nzrelation_name cannot be empty.z*condition argument must be a Q() instance.)r>   relation_namealiasrF   r   rR  resolved_condition)r+   rT  rR  s      r   r(   FilteredRelation.__init__  sF    =>>*
)Q''IJJ #"&r0   c                     [        XR                  5      (       d  [        $ U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ r   )rF   r.   r   rT  rU  rR  rM   s     r   r   FilteredRelation.__eq__  sZ    %00!!%"5"55 2

ekk)2%//1	
r0   c                     [        U R                  U R                  S9nU R                  Ul        U R                  =nb  UR                  5       Ul        U$ )NrQ  )rP  rT  rR  rU  rV  rt   )r+   rt   rV  s      r   rt   FilteredRelation.clone  sK     !3!3t~~Njj"&"9"99F'9'?'?'AE$r0   c                 x    U R                  5       nUR                  =n(       a  UR                  U5      Ul        U$ r   )rt   rV  relabeled_clone)r+   
change_maprt   rV  s       r   r]   FilteredRelation.relabeled_clone  s7    

!&!9!999'9'I'I*'UE$r0   c                 p    U R                  5       nUR                  U R                  USSSS9S   Ul        U$ )NTF)	can_reuser\   r]   update_join_typesr   )rt   build_filterrR  rV  )r+   rb   rc   r,   r-   rt   s         r   rg   #FilteredRelation.resolve_expression%  sI    

#(#5#5NN# $6 $
 $  r0   c                 8    UR                  U R                  5      $ r   )compilerV  )r+   r   r   s      r   as_sqlFilteredRelation.as_sql0  s     7 788r0   )rU  rR  rT  rV  N)r   r   r   r   r   r   r(   r   rt   r]  rg   rg  r   r6   r0   r   rP  rP    s(    A343 '
	9r0   rP  )'r   r   r  loggingcollectionsr   
contextlibr   django.core.exceptionsr   	django.dbr   r   r   r	   r
   django.db.models.constantsr   django.utilsr   django.utils.functionalr   django.utils.hashabler   	getLoggerr   	frozensetPROHIBITED_FILTER_KWARGSr   r   Noder   r   r   r   r?  rG  rN  rP  r6   r0   r   <module>rv     s       " " - W W 1  3 /			-	.$lJ%?@ 
 M(N
		 N
b:A :AzA A eE eEP#L
:29 29r0   