
    +hU>                        d 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 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 ddlmZ dd	lm
Z
 ddlmZ ej"                  ej$                  j'                  d       G d de	j(                                      Z G d dej,                        Z G d de      Z G d de      Z G d dee      Zd Z G d de      Zy)zDynamic collection API.

Dynamic collections act like Query() objects for read operations and support
basic add/delete mutation.

   )
attributes)exc)
interfaces)object_mapper)object_session)relationships)
strategies)util)Query   )log)resultdynamic)lazyc                       e Zd Zd Zy)
DynaLoaderc           	         d| _         | j                  s"t        j                  d| j                  z        | j                  j
                  t        j                  t        j                  fvr"t        j                  d| j                  z         t        j                  | j                  |dt        | j                  j                  | j                  j                  | j                  j                          y )NTztOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.zOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.  This warning will be an exception in a future release.)	useobject
impl_classtarget_mapperorder_byquery_class)is_class_leveluselistr   InvalidRequestErrorparent_property	directionr   	ONETOMANY
MANYTOMANYr
   warnr	   _register_attributeDynamicAttributeImplmapperr   r   )selfr#   s     I/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/orm/dynamic.pyinit_class_attributezDynaLoader.init_class_attribute!   s    "||))!#'#7#78 
 !!++  !!4
 
 II" %)$8$89 	&&  +..55))22,,88	
    N)__name__
__module____qualname__r&    r'   r%   r   r      s    
r'   r   c                       e Zd ZdZdZdZdZdZdZ	 d fd	Z	e
j                  fdZde
j                  fdZej                   d        Zej                   d	        Z	 dd
Z	 ddZd Zde
j                  dddfdZd Zd Ze
j                  fdZe
j                  fdZe
j                  fdZe
j                  fdZe
j                  fdZe
j                  fdZ xZS )r"   TFr+   Nc                     t        t        | 
  ||||fi | || _        |rt	        |      | _        |st        | _        y t        |j                         v r|| _        y t        |      | _        y N)superr"   __init__r   tupler   AppenderQueryr   AppenderMixinmromixin_user_query)
r$   class_keytypecallabledispatchr   r   r   kw	__class__s
            r%   r0   zDynamicAttributeImpl.__init__G   sm     	"D2Cx	
35	
 +!(ODM,Dkoo//*D/<Dr'   c                     |t         j                  z  s*| j                  |t         j                        j                  S | j                  | |      S r.   )r   SQL_OK_get_collection_historyPASSIVE_NO_INITIALIZEadded_itemsr   )r$   statedict_passives       r%   getzDynamicAttributeImpl.get_   sH    ***//z77k ##D%00r'   c                     |t         j                  z  s'| j                  ||      j                  }t        |      S | j                  ||      }|j                  }t        |      S r.   )r   r=   r>   r@   added_plus_unchangedDynamicCollectionAdapter)r$   rA   rB   	user_datarC   datahistorys          r%   get_collectionz#DynamicAttributeImpl.get_collectiong   sa     ***//w?KKD (-- 225'BG//D'--r'   c                 J    t        j                  | t         j                        S r.   )r   Event	OP_APPENDr$   s    r%   _append_tokenz"DynamicAttributeImpl._append_tokenu       j&:&:;;r'   c                 J    t        j                  | t         j                        S r.   )r   rM   	OP_REMOVErO   s    r%   _remove_tokenz"DynamicAttributeImpl._remove_tokeny   rQ   r'   c                     || j                  ||      }|j                  |       | j                  j                  D ]  } ||||xs | j                        } | j
                  r*|'| j                  t        j                  |      |d       y y y NT)	_modified_event	add_addedr9   appendrP   trackparentsethasparentr   instance_stater$   rA   rB   value	initiatorcollection_historyfns          r%   fire_append_eventz&DynamicAttributeImpl.fire_append_event}   s     %!%!5!5eU!C$$U+--&& 	FBueY%D$2D2DEE	F  1j77>tL !2r'   c                    || j                  ||      }|j                  |       | j                  r(|&| j                  t	        j
                  |      |d       | j                  j                  D ]  } ||||xs | j                          y )NF)	rW   add_removedrZ   r[   r   r\   r9   removerT   r]   s          r%   fire_remove_eventz&DynamicAttributeImpl.fire_remove_event   s     %!%!5!5eU!C&&u- 1j77>uM--&& 	>BueY<$*<*<=	>r'   c                 
   | j                   |j                  vr#t        | |      |j                  | j                   <   |j                  || t        j
                         d|| j                   <   |j                  | j                      S rV   )r7   committed_stateCollectionHistoryrW   r   	NEVER_SET)r$   rA   rB   s      r%   rW   z$DynamicAttributeImpl._modified_event   sk    885000.?e.LE!!$((+eT:+?+?@ dhh$$TXX..r'   c	                 \   |r|j                   | j                   u ry |r|y |}	t        |	      }
|j                  r%t        j                  | j                  ||            }| j                  ||      }|j                  s|j                  }nj                  |j                        }t        j                  }|j                  |
      } ||
      j                  |      }|j                  |      }|
D ]  }||v s| j                  |||d |        |D ]  }| j                  |||d |        y )N)r`   )parent_tokenlisthas_identityr
   IdentitySetrD   rW   r@   unionintersection
differencerb   rf   )r$   rA   rB   r^   r_   rC   	check_oldpop_adaptiterable
new_valuesold_collectionr`   idset	constants	additionsremovalsmembers                     r%   setzDynamicAttributeImpl.set   sG    //43D3DD5=(^
!--dhhue.DEN!11%?!!/;;N+11"..N   "//
;	*%00;	!,,Y7  	F"&&'9 ' 	  	F""#5 # 	r'   c                     t               r.   NotImplementedError)r$   argskwargss      r%   deletezDynamicAttributeImpl.delete   s    !##r'   c                     t        d      )Nz7Dynamic attributes don't support collection population.r   )r$   rA   rB   r^   s       r%   set_committed_valuez(DynamicAttributeImpl.set_committed_value   s    !H
 	
r'   c                 F    | j                  ||      }|j                         S r.   )r>   
as_history)r$   rA   rB   rC   cs        r%   get_historyz DynamicAttributeImpl.get_history   s     ((8||~r'   c                     | j                  ||      }|j                  D cg c]  }t        j                  |      |f c}S c c}w r.   )r>   	all_itemsr   r\   )r$   rA   rB   rC   r   xs         r%   get_all_pendingz$DynamicAttributeImpl.get_all_pending   s>     ((8;<;;Ga**1-q1GGGs   Ac                     | j                   |j                  v r|j                  | j                      }nt        | |      }|j                  r!|t        j
                  z  rt        | ||      S |S )N)apply_to)r7   rh   ri   rn   r   INIT_OK)r$   rA   rC   r   s       r%   r>   z,DynamicAttributeImpl._get_collection_history   s^    88u,,,%%dhh/A!$.A7Z-?-?#?$T51==Hr'   c                 6    || ur| j                  ||||       y y r.   )rb   r$   rA   rB   r^   r_   rC   s         r%   rY   zDynamicAttributeImpl.append   %     D ""5%	B !r'   c                 6    || ur| j                  ||||       y y r.   )rf   r   s         r%   re   zDynamicAttributeImpl.remove   r   r'   c                 0    | j                  |||||       y )N)rC   )re   r   s         r%   rt   zDynamicAttributeImpl.pop  s     	E5%GDr'   r.   ) r(   r)   r*   uses_objectsdefault_accepts_scalar_loadersupports_population
collectionr   r   r0   r   PASSIVE_OFFrD   r?   rK   r
   memoized_propertyrP   rT   rb   rf   rW   r~   r   r   r   r   r>   rY   re   rt   __classcell__r;   s   @r%   r"   r"   ?   s1   L$)!JGH =0 )3(>(> 1 00. 
< < 
< < BFM BF>
/" &&4l$

 1;0F0F 
 %/$D$DH 6@5K5K 	 7A6L6LC 7A6L6LC 7A6L6LEr'   r"   c                   2    e Zd ZdZd Zd Zd Zd Zd ZeZ	y)rG   z9simplified CollectionAdapter for internal API consistencyc                     || _         y r.   )rI   )r$   rI   s     r%   r0   z!DynamicCollectionAdapter.__init__  s	    	r'   c                 ,    t        | j                        S r.   )iterrI   rO   s    r%   __iter__z!DynamicCollectionAdapter.__iter__  s    DIIr'   c                      y r.   r+   rO   s    r%   _reset_emptyz%DynamicCollectionAdapter._reset_empty  s    r'   c                 ,    t        | j                        S r.   )lenrI   rO   s    r%   __len__z DynamicCollectionAdapter.__len__  s    499~r'   c                      yrV   r+   rO   s    r%   __bool__z!DynamicCollectionAdapter.__bool__  s    r'   N)
r(   r)   r*   __doc__r0   r   r   r   r   __nonzero__r+   r'   r%   rG   rG   
  s%    C Kr'   rG   c                   h     e Zd ZdZ fdZd Z eed       Zd Zd Zd Z	ddZ
d	 Zd
 Zd Z xZS )r3   Nc                    t         t        |   |j                  d        |j	                         x| _        }|| _        t        |      }|j                  | j                  j                     }|j                  +|j                  j                         |j                  f| _        |j                  |d      f| _        | j                  j                   r| j                  j                   | _        y y )NF)alias_secondary)r/   r3   r0   r   objinstanceattrr   _propsr7   	secondaryr#   __clause_element__	_from_obj_with_parent_where_criteriar   _order_by_clauses)r$   r   rA   r   r#   propr;   s         r%   r0   zAppenderMixin.__init__"  s    mT+D,>,>E#(99;.	x(}}TYY]]+>>% #kk<<>ODN h> 
 99%)YY%7%7D" r'   c                     t        | j                        }|6| j                  r*|j                  r| j                  |v r|j                          t	        j
                  | j                        sy |S r.   )r   r   	autoflushflushorm_utilrn   r$   sesss     r%   sessionzAppenderMixin.session=  sS    dmm,%JJL$$T]]3Kr'   c                      y r.   r+   )sr   s     r%   <lambda>zAppenderMixin.<lambda>K  s    r'   c                 V   | j                   }|t        j                  | j                        }|j                  r+t        j                  dt        j                  |      z         t        j                  t        j                  | j                  j                  j                  g      | j                  j                  t        j                  | j                        t        j                         j"                  d      j%                         S | j'                  |      j)                         S )NzInstance %s is detached, dynamic relationship cannot return a correct result.   This warning will become a DetachedInstanceError in a future release.T)_source_supports_scalars)r   r   r\   r   detachedr
   r    r   	state_strr   IteratorResultSimpleResultMetaDatar   r6   r(   r>   r?   r@   scalars	_generate_iter)r$   r   rA   s      r%   r   zAppenderMixin._iterM  s    ||<--dmm<E~~		C  ))%02 ((++TYY-=-=-F-F,GH		11--dmm<44 +)- gi >>$'--//r'   c                 
   | j                   }|V| j                  j                  t        j                  | j
                        t        j                        j                  |      S | j                  |      j                  |      S r.   )
r   r   r>   r   r\   r   r?   indexedr   __getitem__)r$   indexr   s      r%   r   zAppenderMixin.__getitem__d  si    ||<9944))$--800 gen
 >>$'33E::r'   c                    | j                   }|Zt        | j                  j                  t	        j
                  | j                        t        j                        j                        S | j                  |      j                         S r.   )r   r   r   r>   r   r\   r   r?   r@   r   countr   s     r%   r   zAppenderMixin.countn  sk    ||<		11--dmm<44 +	  >>$'--//r'   c                    | j                   }|Pt        |      }|Ct        j                  dt	        j
                  |      d| j                  j                  d      | j                  r(| j                  | j                  j                  |      }n%|j                  | j                  j                        }| j                  |_        | j                  |_        | j                  |_        |S )NzParent instance zh is not bound to a Session, and no contextual session is established; lazy load operation of attribute 'z' cannot proceed)r   )r   r   orm_excDetachedInstanceErrorr   instance_strr   r7   r   r   queryr   r   r   )r$   r   r   r   s       r%   r   zAppenderMixin._generatez  s     ==<!(+D|33  ,,X6		G  $$TYY%<%<d$KEJJtyy667E $ 4 4.."&"8"8r'   c                     |D ]Z  }| j                   j                  t        j                  | j                        t        j
                  | j                        |d        \ y r.   r   rY   r   r\   r   instance_dict)r$   iteratoritems      r%   extendzAppenderMixin.extend  sM     	DII))$--8((7		r'   c                     | j                   j                  t        j                  | j                        t        j
                  | j                        |d        y r.   r   r$   r   s     r%   rY   zAppenderMixin.append  >    		%%dmm4$$T]]3		
r'   c                     | j                   j                  t        j                  | j                        t        j
                  | j                        |d        y r.   )r   re   r   r\   r   r   r   s     r%   re   zAppenderMixin.remove  r   r'   r.   )r(   r)   r*   r   r0   r   propertyr   r   r   r   r   rY   re   r   r   s   @r%   r3   r3     sD    K86 w 12G0.;
04

r'   r3   c                       e Zd ZdZy)r2   zBA dynamic query that supports basic collection storage operations.N)r(   r)   r*   r   r+   r'   r%   r2   r2     s    Lr'   r2   c                 J    d| j                   z   }t        |t        | fd| i      S )zAReturn a new class with AppenderQuery functionality layered over.Appenderr   )r(   typer3   )clsnames     r%   r5   r5     s)    $D}c*]C,@AAr'   c                   P    e Zd ZdZd
dZed        Zed        Zd Zd Z	d Z
d	 Zy)ri   zDOverrides AttributeHistory to receive append/remove events directly.Nc                 j   |r_t        ||      j                  d      }t        j                  |      | _        |j
                  | _        |j                  | _        d| _        y t        j                         | _        t        j                         | _        t        j                         | _        d| _        y )NFT)r2   r   r
   OrderedIdentitySetunchanged_itemsr@   deleted_items_reconcile_collection)r$   r   rA   r   colls        r%   r0   zCollectionHistory.__init__  s     u-77>D#'#:#:4#@D '33D!)!7!7D)-D&!%!8!8!:D#668D#'#:#:#<D ).D&r'   c                 ^    t        | j                  j                  | j                              S r.   )rm   r@   rp   r   rO   s    r%   rF   z&CollectionHistory.added_plus_unchanged  s$    D$$**4+?+?@AAr'   c                     t        | j                  j                  | j                        j                  | j                              S r.   )rm   r@   rp   r   r   rO   s    r%   r   zCollectionHistory.all_items  s=    ""4#7#78>>""
 	
r'   c                    | j                   rf| j                  j                  | j                        }| j                  j                  | j                        }| j                  j                  |      }n$| j                  | j                  | j                  }}}t        j                  t        |      t        |      t        |            S r.   )	r   r@   rr   r   r   rq   r   Historyrm   )r$   addeddeleted	unchangeds       r%   r   zCollectionHistory.as_history  s    %%$$//0D0DEE((55d6J6JKG,,77@I   $$"" &9E
 !!$u+tIWNNr'   c                 2    t        | j                        |   S r.   )rm   r@   )r$   r   s     r%   r   zCollectionHistory.indexed  s    D$$%e,,r'   c                 :    | j                   j                  |       y r.   )r@   addr$   r^   s     r%   rX   zCollectionHistory.add_added  s    U#r'   c                     || j                   v r| j                   j                  |       y | j                  j                  |       y r.   )r@   re   r   r   r   s     r%   rd   zCollectionHistory.add_removed  s8    D$$$##E*""5)r'   r.   )r(   r)   r*   r   r0   r   rF   r   r   r   rX   rd   r+   r'   r%   ri   ri     sI    N/ B B 
 
O-$*r'   ri   N)r    r   r   r   r   r   r   r   r	   r
   r   r   r   r   enginer   class_loggerRelationshipPropertystrategy_forAbstractRelationshipLoaderr   AttributeImplr"   objectrG   r3   r2   r5   ri   r+   r'   r%   <module>r     s                 ##00i0@
66 
 A 
>HE:33 HEVv *L
F L
^MM5 MB3* 3*r'   