
    i&                    z   S r SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ	r	  SS	KJ
r
  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSKJr  SSK!J"r"  \(       a0  SSKJ#r#  SSK$J%r%  SSKJ&r&  SSKJ'r'  SS K(J)r)  SS!KJ*r*  SS"K+J,r,  SS#K-J.r.  \" S$\S%9r/ " S& S'\\/   5      r0 " S( S)\5      r1\Rd                  Rg                  S*S+9 " S, S-\ 5      5       r4 " S. S/\\/   5      r5 " S0 S1\5\/   \\/   5      r6S4S2 jr7g3)5zDynamic collection API.

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

.. legacy:: the "dynamic" loader is a legacy feature, superseded by the
 "write_only" loader.


    )annotations)Any)Iterable)Iterator)List)Optional)overload)Tuple)Type)TYPE_CHECKING)TypeVar)Union   )
attributes)exc)relationships)util)PassiveFlag)Query)object_session)AbstractCollectionWriter)WriteOnlyAttributeImpl)WriteOnlyHistory)WriteOnlyLoader   )result)QueryableAttribute)Mapper)_RelationshipOrderByArg)Session)InstanceState)AliasedClass)	_Dispatch)ColumnElement_T)boundc                  6    \ rS rSr S         SS jjrSrg)DynamicCollectionHistory>   Nc                z   U(       a_  [        X5      R                  S5      n[        R                  " U5      U l        UR
                  U l        UR                  U l        SU l        g [        R                  " 5       U l        [        R                  " 5       U l        [        R                  " 5       U l        SU l        g )NFT)AppenderQuery	autoflushr   OrderedIdentitySetunchanged_itemsadded_itemsdeleted_items_reconcile_collection)selfattrstatepassiveapply_tocolls         H/var/www/ias/venv/lib/python3.13/site-packages/sqlalchemy/orm/dynamic.py__init__!DynamicCollectionHistory.__init__?   s      -77>D#'#:#:4#@D '33D!)!7!7D)-D&!%!8!8!:D#668D#'#:#:#<D ).D&    )r1   r/   r0   r.   N)
r3   DynamicAttributeImplr4   InstanceState[_T]r5   r   r6   z&Optional[DynamicCollectionHistory[_T]]returnNone)__name__
__module____qualname____firstlineno__r9   __static_attributes__ r;   r8   r(   r(   >   sB     <@/"/ !/ 	/
 9/ 
/ /r;   r(   c                  \    \ rS rSr% Sr\\   rS\S'    S               S	S jjr	Sr
g)
r=   S   TzType[AppenderMixin[Any]]query_classNc                
   [         R                  R                  " XUS U40 UD6  X@l        U(       a  [	        U5      U l        U(       d  [        U l        g [        UR                  5       ;   a  X`l        g [        U5      U l        g r<   )r   AttributeImplr9   target_mappertupleorder_byr+   rI   AppenderMixinmromixin_user_query)r2   class_keydispatchrL   rN   rI   kws           r8   r9   DynamicAttributeImpl.__init__X   sl     	  ))#tX	
13	
 +!(ODM,Dkoo//*/<Dr;   )rN   rI   rL   r<   )rR   z#Union[Type[Any], AliasedClass[Any]]rS   strrT   z"_Dispatch[QueryableAttribute[Any]]rL   z
Mapper[_T]rN   r   rI   z!Optional[Type[AppenderMixin[_T]]]rU   r   r?   r@   )rA   rB   rC   rD   _supports_dynamic_iterationr(   r   collection_history_cls__annotations__r9   rE   rF   r;   r8   r=   r=   S   sv    "&5c:)) :>=3= = 5	=
 "= *= 7= = 
= =r;   r=   dynamic)lazyc                      \ rS rSr\rSrg)
DynaLoaderp   rF   N)rA   rB   rC   rD   r=   
impl_classrE   rF   r;   r8   r^   r^   p   s    %Jr;   r^   c                  8  ^  \ rS rSr% SrSrS\S'   S\S'         SU 4S jjr\SS	 j5       r	\	R                  SS
 j5       r	SS jr\(       a  SS jr\SS j5       r\SS j5       rSS jrS S jr S!   S"S jjrS#S jrS$S jrS#S jrS$S jrS$S jrSrU =r$ )%rO   u   zLA mixin that expects to be mixing in a Query class with
AbstractAppender.


NzOptional[Type[Query[_T]]]rI   zTuple[ColumnElement[Any], ...]_order_by_clausesc                h   > [         R                  " U UR                  S 5        [        TU ]  X5        g r<   )r   r9   rL   super)r2   r3   r4   	__class__s      r8   r9   AppenderMixin.__init__   s/     		

 	%r;   c                    [        U R                  5      nUb1  UR                  (       a   U R                  U;   a  UR                  5         [        R
                  " U R                  5      (       d  g U$ r<   )r   instancer,   flushorm_utilhas_identityr2   sesss     r8   sessionAppenderMixin.session   sM    dmm,4==D3HJJL$$T]]33Kr;   c                    Xl         g r<   rn   )r2   ro   s     r8   ro   rp      s    	r;   c           
     |   U R                   nUGc  [        R                  " U R                  5      nUR                  (       a-  [
        R                  " S[        R                  " U5      -  5        [        R                  " [        R                  " U R                  R                  R                  /5      [        U R                  R!                  [        R                  " U R                  5      ["        R$                  5      R&                  5      SS9R)                  5       $ U R+                  U5      R-                  5       $ )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)ro   r   instance_stateri   detachedr   warnrk   	state_strr   IteratorResultSimpleResultMetaDatar3   rR   rA   iter_get_collection_historyr   PASSIVE_NO_INITIALIZEr/   scalars	_generate_iter)r2   rn   r4   s      r8   r   AppenderMixin._iter   s    ||<--dmm<E~~		C  ))%02 ((++TYY-=-=-F-F,GHII55"11$--@#99 "k	 *.	 gi	 >>$'--//r;   c                    g r<   rF   )r2   s    r8   __iter__AppenderMixin.__iter__   s    Cr;   c                    g r<   rF   r2   indexs     r8   __getitem__AppenderMixin.__getitem__   s    -0r;   c                    g r<   rF   r   s     r8   r   r      s    58r;   c                   U R                   nUcW  U R                  R                  [        R                  " U R
                  5      [        R                  5      R                  U5      $ U R                  U5      R                  U5      $ r<   )ro   r3   r|   r   ru   ri   r   r}   indexedr   r   )r2   r   rn   s      r8   r   r      si    ||<9944))$--811 gen
 >>$'33E::r;   c                   U R                   nUc[  [        U R                  R                  [        R
                  " U R                  5      [        R                  5      R                  5      $ U R                  U5      R                  5       $ r<   )ro   lenr3   r|   r   ru   ri   r   r}   r/   r   countrm   s     r8   r   AppenderMixin.count   sk    ||<		11--dmm<55 +	  >>$'--//r;   c                   U R                   nUcU  [        U5      nUcG  [        R                  " S[        R
                  " U5      < SU R                  R                  < S35      eU R                  (       a%  U R                  U R                  R                  US9nO%UR                  U R                  R                  5      nU R                  Ul        U R                  Ul        U R                  Ul        U$ )NzParent instance zh is not bound to a Session, and no contextual session is established; lazy load operation of attribute 'z' cannot proceed)ro   )ri   r   orm_excDetachedInstanceErrorrk   instance_strr3   rS   rI   rL   query_where_criteria	_from_objrc   )r2   rn   ri   r   s       r8   r   AppenderMixin._generate   s     ==<!(+D|33  ,,X6		G  $$TYY%<%<d$KEJJtyy667E $ 4 4.."&"8"8r;   c                &    U R                  U5        g)aN  Add an iterable of items to this :class:`_orm.AppenderQuery`.

The given items will be persisted to the database in terms of
the parent instance's collection on the next flush.

This method is provided to assist in delivering forwards-compatibility
with the :class:`_orm.WriteOnlyCollection` collection class.

.. versionadded:: 2.0

N_add_all_implr2   iterators     r8   add_allAppenderMixin.add_all   s     	8$r;   c                (    U R                  U/5        g)a@  Add an item to this :class:`_orm.AppenderQuery`.

The given item will be persisted to the database in terms of
the parent instance's collection on the next flush.

This method is provided to assist in delivering forwards-compatibility
with the :class:`_orm.WriteOnlyCollection` collection class.

.. versionadded:: 2.0

Nr   r2   items     r8   addAppenderMixin.add   s     	D6"r;   c                &    U R                  U5        g)zAdd an iterable of items to this :class:`_orm.AppenderQuery`.

The given items will be persisted to the database in terms of
the parent instance's collection on the next flush.

Nr   r   s     r8   extendAppenderMixin.extend	  s     	8$r;   c                (    U R                  U/5        g)zAppend an item to this :class:`_orm.AppenderQuery`.

The given item will be persisted to the database in terms of
the parent instance's collection on the next flush.

Nr   r   s     r8   appendAppenderMixin.append  s     	D6"r;   c                &    U R                  U5        g)zRemove an item from this :class:`_orm.AppenderQuery`.

The given item will be removed from the parent instance's collection on
the next flush.

N)_remove_implr   s     r8   removeAppenderMixin.remove  s     	$r;   rr   )r3   r=   r4   r>   r?   r@   )r?   Optional[Session])ro   r    r?   r@   )r?   z1Union[result.ScalarResult[_T], result.Result[_T]])r?   zIterator[_T])r   intr?   r%   )r   slicer?   zList[_T])r   zUnion[int, slice]r?   zUnion[_T, List[_T]])r?   r   r<   )rn   r   r?   z	Query[_T])r   zIterable[_T]r?   r@   )r   r%   r?   r@   )rA   rB   rC   rD   __doc__rI   rZ   r9   propertyro   setterr   r   r   r	   r   r   r   r   r   r   r   r   rE   __classcell__)rf   s   @r8   rO   rO   u   s     .2K*155&(&1B&	&   ^^ 02 /0 08 8;
0 #' 
:%#%#   r;   rO   c                      \ rS rSrSrSrg)r+   i%  zA dynamic query that supports basic collection storage operations.

Methods on :class:`.AppenderQuery` include all methods of
:class:`_orm.Query`, plus additional methods used for collection
persistence.


rF   N)rA   rB   rC   rD   r   rE   rF   r;   r8   r+   r+   %  s    r;   r+   c                J    SU R                   -   n[        U[        U 4SU 05      $ )zAReturn a new class with AppenderQuery functionality layered over.AppenderrI   )rA   typerO   )clsnames     r8   rQ   rQ   0  s)    $D}c*]C,@AAr;   N)r   r   r?   ztype[AppenderMixin[Any]])8r   
__future__r   typingr   r   r   r   r   r	   r
   r   r   r   r    r   r   r   r   r   rk   baser   r   r   ro   r   	writeonlyr   r   r   r   enginer   r   mapperr   r   r    r4   r!   r"   eventr#   sql.elementsr$   r%   r(   r=   RelationshipPropertystrategy_forr^   rO   r+   rQ   rF   r;   r8   <module>r      s  	 #                   # / - ' &   $6 $"!,T//3 /*=1 =: ##00i0@& & A&m ,R0 m `M"%uRy Br;   