
    ؄_K9                        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
 ej        ej                            d           G d de	j                                          Z G d dej                  Z G d de          Z G d dee          Zd Z G d de          ZdS )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)
properties)
strategies)util)Query   )logdynamic)lazyc                       e Zd Zd ZdS )
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                   d S )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     [/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/orm/dynamic.pyinit_class_attributezDynaLoader.init_class_attribute    s    "| 	)!#'#78  
 !+ !4
 
 
 I" %)$89   	& +.5)2,8	
 	
 	
 	
 	
 	
    N)__name__
__module____qualname__r%    r&   r$   r   r      s#        
 
 
 
 
r&   r   c                   Z    e 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!   TFNc                      t          t          |           j        ||||fi | || _        || _        |st
          | _        d S t          |                                v r	|| _        d S t          |          | _        d S N)
superr!   __init__r   r   AppenderQueryr   AppenderMixinmromixin_user_query)
r#   class_keytypecallabledispatchr   r   r   kw	__class__s
            r$   r/   zDynamicAttributeImpl.__init__E   s     	3"D))2Cx	
 	
35	
 	
 	
 +  	=,Dkoo////*D/<<Dr&   c                     |t           j        z  s%|                     |t           j                  j        S |                     | |          S r-   )r   SQL_OK_get_collection_historyPASSIVE_NO_INITIALIZEadded_itemsr   )r#   statedict_passives       r$   getzDynamicAttributeImpl.get\   sM    ** 	1//z7  ##D%000r&   c                     |t           j        z  s|                     ||          j        S |                     ||          }|j        S r-   )r   r;   r<   r>   added_plus_unchanged)r#   r?   r@   	user_datarA   historys         r$   get_collectionz#DynamicAttributeImpl.get_collectiond   sK     ** 	0//w??KK225'BBG//r&   c                 @    t          j        | t           j                  S r-   )r   Event	OP_APPENDr#   s    r$   _append_tokenz"DynamicAttributeImpl._append_tokenq       j&:;;;r&   c                 @    t          j        | t           j                  S r-   )r   rI   	OP_REMOVErK   s    r$   _remove_tokenz"DynamicAttributeImpl._remove_tokenu   rM   r&   c                    ||                      ||          }|                    |           | j        j        D ]} ||||p| j                  }| j        r-|-|                     t          j        |          |d           d S d S d S NT)	_modified_event	add_addedr7   appendrL   trackparentsethasparentr   instance_stater#   r?   r@   value	initiatorcollection_historyfns          r$   fire_append_eventz&DynamicAttributeImpl.fire_append_eventy   s     %!%!5!5eU!C!C$$U+++-& 	F 	FBBueY%D$2DEEEE 	M 1j7>>tLLLLL	M 	M 1 1r&   c                 
   ||                      ||          }|                    |           | j        r+|)|                     t	          j        |          |d           | j        j        D ]} ||||p| j                   d S )NF)	rS   add_removedrV   rW   r   rX   r7   removerP   rY   s          r$   fire_remove_eventz&DynamicAttributeImpl.fire_remove_event   s     %!%!5!5eU!C!C&&u--- 	N 1j7>>uMMM-& 	> 	>BBueY<$*<====	> 	>r&   c                     | j         |j        vrt          | |          |j        | j         <   |                    || t          j                   d|| j         <   |j        | j                  S rR   )r5   committed_stateCollectionHistoryrS   r   	NEVER_SET)r#   r?   r@   s      r$   rS   z$DynamicAttributeImpl._modified_event   sc    85000.?e.L.LE!$(+eT:+?@@@ dh$TX..r&   c	                 `   |r|j         | j         u rd S |r|d S |}	t          |	          }
|j        r(t          j        |                     ||                    }|                     ||          }|j        s|j        }n|                    |j                  }t          j        }|	                    |
          } ||
          
                    |          }|
                    |          }|
D ] }||v r|                     |||d |           !|D ]}|                     |||d |           d S )N)r\   )parent_tokenlisthas_identityr
   IdentitySetrB   rS   r>   unionintersection
differencer^   rb   )r#   r?   r@   rZ   r[   rA   	check_oldpop_adaptiterable
new_valuesold_collectionr\   idset	constants	additionsremovalsmembers                     r$   setzDynamicAttributeImpl.set   s     	/43DDDF 	5=F(^^
 	F!-dhhue.D.DEEN!11%??! 	/;NN+11". N  "//
;;	E*%%00;;	!,,Y7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#   r?   r@   rZ   s       r$   set_committed_valuez(DynamicAttributeImpl.set_committed_value   s    !H
 
 	
r&   c                 V    |                      ||          }|                                S r-   )r<   
as_historyr#   r?   r@   rA   cs        r$   get_historyz DynamicAttributeImpl.get_history   s%    ((88||~~r&   c                 P    |                      ||          }d |j        D             S )Nc                 :    g | ]}t          j        |          |fS r*   )r   rX   ).0xs     r$   
<listcomp>z8DynamicAttributeImpl.get_all_pending.<locals>.<listcomp>   s(    GGGa*1--q1GGGr&   )r<   	all_itemsr   s        r$   get_all_pendingz$DynamicAttributeImpl.get_all_pending   s/     ((88GG1;GGGGr&   c                     | j         |j        v r|j        | j                  }nt          | |          }|j        r!|t          j        z  rt          | ||          S |S )N)apply_to)r5   rd   re   rj   r   INIT_OK)r#   r?   rA   r   s       r$   r<   z,DynamicAttributeImpl._get_collection_history   sf    8u,,,%dh/AA!$..A 	7Z-?#? 	$T51====Hr&   c                 B    || ur|                      ||||           d S d S r-   )r^   r#   r?   r@   rZ   r[   rA   s         r$   rU   zDynamicAttributeImpl.append   7     D  ""5%	BBBBB ! r&   c                 B    || ur|                      ||||           d S d S r-   )rb   r   s         r$   ra   zDynamicAttributeImpl.remove   r   r&   c                 :    |                      |||||           d S )N)rA   )ra   r   s         r$   rp   zDynamicAttributeImpl.pop   s&     	E5%GDDDDDr&   r-   )r'   r(   r)   uses_objectsdefault_accepts_scalar_loadersupports_population
collectionr   r/   r   PASSIVE_OFFrB   r=   rG   r
   memoized_propertyrL   rP   r^   rb   rS   rz   r   r   r   r   r<   rU   ra   rp   __classcell__r9   s   @r$   r!   r!   >   s&       L$)!JG = = = = = =. )3(> 1 1 1 1 00 0 0 0 
< < < 
< < < BFM M M M BF> > > >
/ 
/ 
/" &4 4 4 4l$ $ $
 
 

 1;0F    
 %/$DH H H H 6@5K 	 	 	 	 7A6LC C C C 7A6LC C C C 7A6LE E E E E E E Er&   r!   c                   n     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 )r1   Nc                    t          t          |                               |j        d            |                                x| _        }|| _        t          |          }|j        | j        j	                 }|j
        |j        j        |j
        f| _        |                    |d          | _        | j        j        r| j        j        | _        d S d S )NF)alias_secondary)r.   r1   r/   r   objinstanceattrr   _propsr5   	secondaryr"   
selectable	_from_obj_with_parent
_criterionr   	_order_by)r#   r   r?   r   r"   propr9   s         r$   r/   zAppenderMixin.__init__	  s    mT""++D,>EEE#(99;;.	x((}TY]+>% #k4dnEDN++He+LL9 	0!Y/DNNN	0 	0r&   c                     t          | j                  }|+| j        r$|j        r| j        |v r|                                 t	          j        | j                  sd S |S r-   )r   r   	autoflushflushorm_utilrj   r#   sesss     r$   sessionzAppenderMixin.session  sf    dm,,   %%JJLLL$T]33 	4Kr&   c                     d S r-   r*   )sr   s     r$   <lambda>zAppenderMixin.<lambda>-  s    T r&   c                     | j         }|Nt          | j                            t	          j        | j                  t          j                  j                  S t          | 	                    |                    S r-   )
r   iterr   r<   r   rX   r   r=   r>   _cloner   s     r$   __iter__zAppenderMixin.__iter__/  sl    |<	11-dm<<4  	   D))***r&   c                    | j         }|O| j                            t          j        | j                  t          j                                      |          S |                     |          	                    |          S r-   )
r   r   r<   r   rX   r   r=   indexedr   __getitem__)r#   indexr   s      r$   r   zAppenderMixin.__getitem__;  sm    |<944)$-880  genn
 ;;t$$00777r&   c                     | j         }|Nt          | j                            t	          j        | j                  t          j                  j                  S | 	                    |          
                                S r-   )r   lenr   r<   r   rX   r   r=   r>   r   countr   s     r$   r   zAppenderMixin.countE  sp    |<	11-dm<<4  	   ;;t$$**,,,r&   c                    | j         }|Ht          |          }|7t          j        dt	          j        |          d| j        j        d          | j        r"|                     | j        j	        |          }n|
                    | 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   r5   r   r   queryr   r   r   )r#   r   r   r   s       r$   r   zAppenderMixin._cloneQ  s     =<!(++D|33  ,X6666	G    	8$$TY%<d$KKEEJJty677E?..r&   c                     |D ]M}| j                             t          j        | j                  t          j        | j                  |d            Nd S r-   r   rU   r   rX   r   instance_dict)r#   iteratoritems      r$   extendzAppenderMixin.extendk  s`     	 	DI)$-88(77	   	 	r&   c                     | j                             t          j        | j                  t          j        | j                  |d            d S r-   r   r#   r   s     r$   rU   zAppenderMixin.appendt  L    	%dm44$T]33		
 	
 	
 	
 	
r&   c                     | j                             t          j        | j                  t          j        | j                  |d            d S r-   )r   ra   r   rX   r   r   r   s     r$   ra   zAppenderMixin.remove|  r   r&   r-   )r'   r(   r)   r   r/   r   propertyr   r   r   r   r   rU   ra   r   r   s   @r$   r1   r1     s        K0 0 0 0 0,   hw 1 122G
+ 
+ 
+8 8 8
- 
- 
-   4  
 
 

 
 
 
 
 
 
r&   r1   c                       e Zd ZdZdS )r0   zBA dynamic query that supports basic collection storage operations.N)r'   r(   r)   __doc__r*   r&   r$   r0   r0     s        LLLLr&   r0   c                 J    d| j         z   }t          |t          | fd| i          S )zAReturn a new class with AppenderQuery functionality layered over.Appenderr   )r'   typer1   )clsnames     r$   r3   r3     s*    $D}c*]C,@AAAr&   c                   ^    e Zd ZdZd
dZed             Zed             Zd Zd Z	d Z
d	 ZdS )re   zDOverrides AttributeHistory to receive append/remove events directly.Nc                 b   |r]t          ||                              d          }t          j        |          | _        |j        | _        |j        | _        d| _        d S t          j                    | _        t          j                    | _        t          j                    | _        d| _        d S )NFT)r0   r   r
   OrderedIdentitySetunchanged_itemsr>   deleted_items_reconcile_collection)r#   r   r?   r   colls        r$   r/   zCollectionHistory.__init__  s     
	/ u--77>>D#'#:4#@#@D '3D!)!7D)-D&&&!%!8!:!:D#688D#'#:#<#<D ).D&&&r&   c                 Z    t          | j                            | j                            S r-   )ri   r>   rl   r   rK   s    r$   rD   z&CollectionHistory.added_plus_unchanged  s$    D$**4+?@@AAAr&   c                     t          | j                            | j                                      | j                            S r-   )ri   r>   rl   r   r   rK   s    r$   r   zCollectionHistory.all_items  sA    ""4#788>>" 
 
 	
r&   c                 f   | j         rY| j                            | j                  }| j                            | j                  }| j                            |          }n| j        | j        | j        }}}t          j        t          |          t          |          t          |                    S r-   )	r   r>   rn   r   r   rm   r   Historyri   )r#   addeddeleted	unchangeds       r$   r   zCollectionHistory.as_history  s    % 		$//0DEEE(55d6JKKG,77@@II  $" &9E
 !$u++tIWNNNr&   c                 6    t          | j                  |         S r-   )ri   r>   )r#   r   s     r$   r   zCollectionHistory.indexed  s    D$%%e,,r&   c                 :    | j                             |           d S r-   )r>   addr#   rZ   s     r$   rT   zCollectionHistory.add_added  s    U#####r&   c                     || j         v r| j                             |           d S | j                            |           d S r-   )r>   ra   r   r   r   s     r$   r`   zCollectionHistory.add_removed  sJ    D$$$##E*****""5)))))r&   r-   )r'   r(   r)   r   r/   r   rD   r   r   r   rT   r`   r*   r&   r$   re   re     s        NN/ / / / B B XB 
 
 X
O O O- - -$ $ $* * * * *r&   re   N)r    r   r   r   r   r   r   r   r	   r
   r   r   r   r   class_loggerRelationshipPropertystrategy_forAbstractRelationshipLoaderr   AttributeImplr!   objectr1   r0   r3   re   r*   r&   r$   <module>r      s0                                                                             --9-==
 
 
 
 
6 
 
 >= 
>EE EE EE EE EE:3 EE EE EEP|
 |
 |
 |
 |
F |
 |
 |
~M M M M MM5 M M MB B B3* 3* 3* 3* 3* 3* 3* 3* 3* 3*r&   