
    EvgrC                     \   d Z ddlZddlZddlZddlmZ ddlmZ ddl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  ej        d
          Z edd          Zd Z G d dej                  Z G d d          Z G d d          Z G d d          Zd Zd Zd Z G d d          Z dS )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)
FieldError)DEFAULT_DB_ALIASDatabaseErrorconnections)
LOOKUP_SEP)tree)cached_property)make_hashabledjango.db.modelsPathInfozGfrom_opts to_opts target_fields join_field m2m direct filtered_relationc              #   j   K   | V  |                                  D ]}t          |          E d {V  d S N)__subclasses__
subclassesclssubclasss     Y/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/models/query_utils.pyr   r       sW      
III&&(( ( (h''''''''''( (    c                        e Zd ZdZdZdZdZeZdZddd fd	
Z	d
 Z
d Zd Zd Zd Z	 ddZd ZefdZd Zed             Zd Zd Zed             Z xZS )Qze
    Encapsulate filters as objects that can then be combined logically (using
    `&` and `|`).
    ANDORXORTNF)
_connector_negatedc                    t                                          g |t          |                                          ||           d S )N)children	connectornegated)super__init__sorteditems)selfr   r   argskwargs	__class__s        r   r#   z
Q.__init__3   sQ    5t5fV\\^^445  	 	
 	
 	
 	
 	
r   c                 P   t          |dd          du rt          |          | s|                                S |s)t          |t                    r|                                 S |                     |          }|                    | |           |                    ||           |S )NconditionalF)r    )getattr	TypeErrorcopy
isinstancer   createadd)r&   otherconnobjs       r   _combinez
Q._combine:   s    5-//588E""" 	 ::<< 	E1-- 	99;;kkDk))dt
r   c                 8    |                      || j                  S r   )r5   r   r&   r2   s     r   __or__zQ.__or__G   s    }}UDG,,,r   c                 8    |                      || j                  S r   )r5   r   r7   s     r   __and__z	Q.__and__J       }}UDH---r   c                 8    |                      || j                  S r   )r5   r   r7   s     r   __xor__z	Q.__xor__M   r;   r   c                 V    |                                  }|                                 |S r   )r.   negate)r&   r4   s     r   
__invert__zQ.__invert__P   s!    iikk


r   c                 l    |                     | ||dd|          \  }}|                    |           |S )NF)allow_joins
split_subqcheck_filterable	summarize)_add_qpromote_joins)r&   queryrB   reuserE   for_saveclausejoinss           r   resolve_expressionzQ.resolve_expressionU   sM    
 #" % 
 
 	E"""r   c              #      K   | V  | j         D ]N}t          |t                    r|d         }t          |d          r|                                E d{V  J|V  OdS )zg
        Recursively yield this Q object and all subexpressions, in depth-first
        order.
           flattenN)r   r/   tuplehasattrrP   )r&   childs     r   rP   z	Q.flattene   s      
 


] 	 	E%'' !aui((  ==??********	 	r   c           
         ddl m}m} ddlm} ddlm} ddlm}  |d          }|	                                D ]8\  }	}
t          |
d          s ||
          }
|                    |
|	d	           9|                     |d
          d           t          |         j        j        r7|                    t!           || d |                                           n|                    |            |                    |          }	 |                    |          duS # t&          $ r'}t(                              d| |           Y d}~dS d}~ww xY w)z|
        Do a database query to check if the expressions of the Q instance
        matches against the expressions.
        r   )BooleanFieldValue)Coalesce)Query)SINGLENrM   F)selectrO   _checkT)output_field)usingz.Got a database error calling check() on %r: %s)django.db.modelsrU   rV   django.db.models.functionsrW   django.db.models.sqlrX   django.db.models.sql.constantsrY   r%   rR   add_annotationr   featuressupports_comparing_boolean_expradd_qr   get_compilerexecute_sqlr   loggerwarning)r&   againstr]   rU   rV   rW   rX   rY   rH   namevaluecompileres                r   checkzQ.checkt   s    	98888888777777......999999d"==?? 	< 	<KD%5"677 %e  U ;;;;UU1XXx000u&F 	KK((4LLNNKKKLLMMMMKK%%E%22	''//t;; 	 	 	NNKTSTUUU44444	s   D# #
E-EEc                    | j         j        d| j         j        }|                    d          r|                    dd          }t          | j                  }i }| j        | j        k    r
| j        |d<   | j	        rd|d<   |||fS )N.zdjango.db.models.query_utilsr   r   Tr   )
r)   
__module____name__
startswithreplacerQ   r   r    defaultr!   )r&   pathr'   r(   s       r   deconstructzQ.deconstruct   s    .333T^5L5LM??9:: 	T<< >@RSSDT]##>T\))#'>F< < 	&!%F:T6!!r   c                 4   |                                  \  }}}|g|                                }|D ]X}t          |t                    r,|\  }}t	          |          }|                    ||f           C|                    |           Yt          |          S r   )rx   r%   r/   rQ   r   append)r&   rw   r'   r(   identityrS   argrl   s           r   r{   z
Q.identity   s    !--//dF*6<<>>* 	' 	'E%'' '"
U%e,,e----&&&&Xr   c                 Z    t          |t                    st          S |j        | j        k    S r   )r/   r   NotImplementedr{   r7   s     r   __eq__zQ.__eq__   s)    %## 	"!!~..r   c                 *    t          | j                  S r   )hashr{   )r&   s    r   __hash__z
Q.__hash__   s    DM"""r   c                 L    ddl m} d |                    |           D             S )z
        Retrieve all base fields referenced directly or through F expressions
        excluding any fields referenced through joins.
        r   )rH   c                 P    h | ]#}|                     t          d           d         $S )rO   r   )splitr   ).0rS   s     r   	<setcomp>z+Q.referenced_base_fields.<locals>.<setcomp>   s8     
 
 
.3EKK
A&&q)
 
 
r   )r`   rH   get_children_from_q)r&   rH   s     r   referenced_base_fieldszQ.referenced_base_fields   sF     	/.....
 
7<7P7PQU7V7V
 
 
 	
r   )NTNFF)rs   rr   __qualname____doc__r   r   r   rv   r+   r#   r5   r8   r:   r=   r@   rM   rP   r   ro   rx   r
   r{   r   r   r   __classcell__)r)   s   @r   r   r   &   s]         C	B
CGK)- 
 
 
 
 
 
 
  - - -. . .. . .   SX       $4    :
" 
" 
" 
 
 _
/ / /
# # # 

 

 _

 

 

 

 

r   r   c                   &    e Zd ZdZd ZddZd ZdS )DeferredAttributez
    A wrapper for a deferred-loading field. When the value is read from this
    object the first time, the query is executed.
    c                     || _         d S r   )field)r&   r   s     r   r#   zDeferredAttribute.__init__   s    


r   Nc                     || S |j         }| j        j        }||vrV|                     |          }|:|j        | j        j        rt          d          |                    |g           n|||<   ||         S )zx
        Retrieve and caches the value from the datastore on the first lookup.
        Return the cached value.
        Nz4Cannot read a generated field from an unsaved model.)fields)__dict__r   attname_check_parent_chainpk	generatedAttributeErrorrefresh_from_db)r&   instancer   data
field_namevals         r   __get__zDeferredAttribute.__get__   s    
 K Z'
T!! **844C{;&4:+?&(N   (((====#&Z Jr   c                     |j         }|                    | j        j                  }| j        j        r | j        |k    rt          ||j                  S dS )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_keyr,   r   )r&   r   opts
link_fields       r   r   z%DeferredAttribute._check_parent_chain   sT     ~++DJ,<==
:! 	9djJ&>&>8Z%7888tr   r   )rs   rr   r   r   r#   r   r    r   r   r   r      sP         
         .
 
 
 
 
r   r   c                       e Zd ZdZd Zd ZdS )class_or_instance_methodz
    Hook used in RegisterLookupMixin to return partial functions depending on
    the caller type (instance or class of models.Field).
    c                 "    || _         || _        d S r   )class_methodinstance_method)r&   r   r   s      r   r#   z!class_or_instance_method.__init__   s    (.r   c                 n    |t          j        | j        |          S t          j        | j        |          S r   )	functoolspartialr   r   )r&   r   owners      r   r   z class_or_instance_method.__get__   s4    $T%6>>> !5x@@@r   N)rs   rr   r   r   r#   r   r   r   r   r   r      sA         
/ / /A A A A Ar   r   c                      e Zd Zd Zej        d             Zd Z eee          Z	 e
e          Zd Zd Zed             Ze
d             Zdd	Zdd
Z eee          Z e
e          ZddZddZ eee          Z e
e          ZdS )RegisterLookupMixinc                 R    |                                                      |d           S r   )get_lookupsget)r&   lookup_names     r   _get_lookupzRegisterLookupMixin._get_lookup   s$    !!%%k4888r   c                 h    d t          j        |           D             }|                     |          S )Nc                 D    g | ]}|j                             d i           S )class_lookups)r   r   )r   parents     r   
<listcomp>z9RegisterLookupMixin.get_class_lookups.<locals>.<listcomp>  s7     
 
 
9?FO44
 
 
r   )inspectgetmromerge_dicts)r   r   s     r   get_class_lookupsz%RegisterLookupMixin.get_class_lookups  s?    
 
CJ>RUCVCV
 
 
 }---r   c                 `    |                                  }t          | dd           x}ri ||S |S Ninstance_lookups)r   r,   )r&   r   r   s      r   get_instance_lookupsz(RegisterLookupMixin.get_instance_lookups  sE    ..00&t-?FFF 	98m8'788r   c                     ddl m} |                     |          }|*t          | d          r| j                            |          S |t          ||          sd S |S )Nr   )Lookupr\   )django.db.models.lookupsr   r   rR   r\   
get_lookup
issubclass)r&   r   r   founds       r   r   zRegisterLookupMixin.get_lookup  sp    333333  --=WT>::=$//<<<Zv%>%>4r   c                     ddl m} |                     |          }|*t          | d          r| j                            |          S |t          ||          sd S |S )Nr   )	Transformr\   )r   r   r   rR   r\   get_transformr   )r&   r   r   r   s       r   r   z!RegisterLookupMixin.get_transform  sp    666666  --=WT>::=$22;???Zy%A%A4r   c                 X    i }t          |           D ]}|                    |           |S )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   zRegisterLookupMixin.merge_dicts%  s8     % 	 	AMM!r   c                 \    t          |           D ]}|j                                         d S r   )r   r   cache_clearr   s     r   _clear_cached_class_lookupsz/RegisterLookupMixin._clear_cached_class_lookups0  s9    "3 	5 	5H&224444	5 	5r   Nc                 t    ||j         }d| j        vri | _        || j        |<   |                                  |S )Nr   )r   r   r   r   r   lookupr   s      r   register_class_lookupz)RegisterLookupMixin.register_class_lookup5  sI     ,K#,.. "C)/+&'')))r   c                 L    ||j         }d| j        vri | _        || j        |<   |S r   )r   r   r   r&   r   r   s      r   register_instance_lookupz,RegisterLookupMixin.register_instance_lookup>  s7     ,KT]22$&D!-3k*r   c                 P    ||j         }| j        |= |                                  dS )zn
        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_lookupz,RegisterLookupMixin._unregister_class_lookupK  s5    
  ,Kk*'')))))r   c                 (    ||j         }| j        |= dS )zs
        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_lookupz/RegisterLookupMixin._unregister_instance_lookupU  s#    
  ,K!+...r   r   )rs   rr   r   r   r   cacher   r   r   r   classmethodr   r   staticmethodr   r   r   r   register_lookupr   r   _unregister_lookupr   r   r   r   r      sq       9 9 9 _. . _.   +*+<>RSSK#$566       \ 5 5 [5       /.7 O (K(=>>* * * */ / / / 21 "=   +{+CDDr   r   c                     | j         sdS t          | j         dd          rdS |s| j         S | j        |vrdS |r.| |vr*t	          d| j        j        j         d| j         d          dS )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 rq   zM cannot be both deferred and traversed using select_related at the same time.T)remote_fieldr,   nullrk   r   r   r   object_name)r   
restricted	requestedselect_masks       r   select_related_descendr   d  s      u u!=%88 u  :~ z""u  
uK//LU[&2 L LUZ L L L
 
 	
 4r   c                     t          dt          |           dz             D ]A}t          j        | d|                   }|                    |          r|| |d         fc S BdS )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.
    rO   r   N)Nr   )rangelenr   joinr   )lookup_partsannotationsnlevel_n_lookups       r   refs_expressionr     sz     1c,''!+,, 4 4#ac):;;??>** 	4!<#33333	48r   c                 p      fd} ||          p%t          |dd          o ||j        j                  S )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                 f    j         j        | j        k    p| j        j         j        v p| j        v S r   )r   concrete_modelall_parents)r   r   s    r   ro   z-check_rel_lookup_compatibility.<locals>.check  s=    K&$*== )"ek&==)((	
r   r   F)r,   r   r   )r   target_optsr   ro   s   `   r   check_rel_lookup_compatibilityr     sX    
 
 
 
 
  5 }e,,Iu{7H1I1Ir   c                   L    e Zd ZdZ e            ddZd Zd Zd Zd Z	d Z
d	S )
FilteredRelationz7Specify custom filtering in the ON clause of SQL joins.	conditionc                    |st          d          || _        d | _        t          |t                    st          d          || _        d | _        d S )Nzrelation_name cannot be empty.z*condition argument must be a Q() instance.)
ValueErrorrelation_namealiasr/   r   r  resolved_condition)r&   r  r  s      r   r#   zFilteredRelation.__init__  sa     	?=>>>*
)Q'' 	KIJJJ #"&r   c                     t          || j                  st          S | j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r/   r)   r~   r  r  r  r7   s     r   r   zFilteredRelation.__eq__  sQ    %00 	"!!%"55 2
ek)2%/1	
r   c                     t          | j        | j                  }| j        |_        | j        x}|                                |_        |S )Nr   )r   r  r  r  r  clone)r&   r	  r  s      r   r	  zFilteredRelation.clone  sJ     !3t~NNNj"&"99F'9'?'?'A'AE$r   c                 t    |                                  }|j        x}r|                    |          |_        |S r   )r	  r  relabeled_clone)r&   
change_mapr	  r  s       r   r  z FilteredRelation.relabeled_clone  s<    

!&!99 	V'9'I'I*'U'UE$r   c                     |                                  }|                    | j        |ddd          d         |_        |S )NTF)	can_reuserB   rC   update_join_typesr   )r	  build_filterr  r  )r&   rH   rI   r'   r(   r	  s         r   rM   z#FilteredRelation.resolve_expression  sN    

#(#5#5N# $6 $
 $
 $  r   c                 6    |                     | j                  S r   )compiler  )r&   rm   
connections      r   as_sqlzFilteredRelation.as_sql  s     7888r   N)rs   rr   r   r   r   r#   r   r	  r  rM   r  r   r   r   r   r     s        AA34133 ' ' ' ' '
 
 
    	 	 	9 9 9 9 9r   r   )!r   r   r   loggingcollectionsr   django.core.exceptionsr   	django.dbr   r   r   django.db.models.constantsr   django.utilsr	   django.utils.functionalr
   django.utils.hashabler   	getLoggerrh   r   r   Noder   r   r   r   r   r   r   r   r   r   r   <module>r     s          " " " " " " - - - - - - B B B B B B B B B B 1 1 1 1 1 1       3 3 3 3 3 3 / / / / / /		-	.	.
 :M ( ( (W
 W
 W
 W
 W
	 W
 W
 W
t* * * * * * * *ZA A A A A A A A dE dE dE dE dE dE dE dEN# # #L
 
 
  :29 29 29 29 29 29 29 29 29 29r   