o
    [hK9                     @   s
  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jddG dd de	jZG dd dejZG dd deZG dd deeZdd ZG d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)Zlazyc                   @   s   e Zd Zdd ZdS )
DynaLoaderc              	   C   sj   d| _ | jstd| j | jjtjtjfvr t	
d| j  tj| j|dt| jj| jj| jjd 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.)Z	useobjectZ
impl_classtarget_mapperorder_byquery_class)Zis_class_levelZuselistr   ZInvalidRequestErrorZparent_property	directionr   Z	ONETOMANYZ
MANYTOMANYr	   warnr   Z_register_attributeDynamicAttributeImplmapperr   r   )selfr    r   }/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/sqlalchemy/orm/dynamic.pyinit_class_attribute    s2   
zDynaLoader.init_class_attributeN)__name__
__module____qualname__r   r   r   r   r   r      s    r   c                       s  e Zd ZdZdZdZdZdZ	d& fdd	Ze	j
fddZde	jfdd	Zejd
d Zejdd Z	d&ddZ	d&ddZdd Zde	j
dddfddZdd Zdd Ze	j
fddZe	jfddZe	j
fddZe	j
fd d!Ze	j
fd"d#Ze	j
fd$d%Z  ZS )'r   TFNc           	         s\   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_keyZtypecallabledispatchr   r   r   kw	__class__r   r   r   E   s   


zDynamicAttributeImpl.__init__c                 C   s&   |t j@ s| |t jjS | | |S r   )r   SQL_OK_get_collection_historyPASSIVE_NO_INITIALIZEadded_itemsr   )r   statedict_passiver   r   r   get\   s   
zDynamicAttributeImpl.getc                 C   s*   |t j@ s| ||jS | ||}|jS r   )r   r*   r+   r-   added_plus_unchanged)r   r.   r/   	user_datar0   historyr   r   r   get_collectiond   s   
z#DynamicAttributeImpl.get_collectionc                 C      t | t jS r   )r   EventZ	OP_APPENDr   r   r   r   _append_tokenq      z"DynamicAttributeImpl._append_tokenc                 C   r6   r   )r   r7   Z	OP_REMOVEr8   r   r   r   _remove_tokenu   r:   z"DynamicAttributeImpl._remove_tokenc                 C   sl   |d u r
|  ||}|| | jjD ]}||||p| j}q| jr2|d ur4| t||d d S d S d S NT)	_modified_event	add_addedr&   appendr9   trackparentsethasparentr   instance_stater   r.   r/   value	initiatorcollection_historyfnr   r   r   fire_append_eventy   s   
z&DynamicAttributeImpl.fire_append_eventc                 C   sd   |d u r
|  ||}|| | jr |d ur | t||d | jjD ]}||||p-| j q$d S )NF)	r=   add_removedr@   rA   r   rB   r&   remover;   rC   r   r   r   fire_remove_event   s   
z&DynamicAttributeImpl.fire_remove_eventc                 C   sD   | j |jvrt| ||j| j < ||| tj d|| j < |j| j  S r<   )r%   committed_stateCollectionHistoryr=   r   Z	NEVER_SET)r   r.   r/   r   r   r   r=      s
   
z$DynamicAttributeImpl._modified_eventc	                 C   s   |r
|j | j u r
d S |r|d u rd S |}	t|	}
|jr$t| ||}| ||}|js1|j}n||j}tj}|	|
}||

|}|
|}|
D ]}||v r]| j|||d |d qM|D ]}| j|||d |d q`d S )N)rF   )Zparent_tokenlisthas_identityr	   ZIdentitySetr1   r=   r-   unionintersection
differencerH   rK   )r   r.   r/   rD   rE   r0   Z	check_oldpopZ_adaptiterable
new_valuesZold_collectionrF   Zidset	constants	additionsZremovalsmemberr   r   r   set   sJ   

zDynamicAttributeImpl.setc                 O   s   t  r   NotImplementedError)r   argskwargsr   r   r   delete   s   zDynamicAttributeImpl.deletec                 C   s   t d)Nz7Dynamic attributes don't support collection population.rZ   )r   r.   r/   rD   r   r   r   set_committed_value   s   z(DynamicAttributeImpl.set_committed_valuec                 C   s   |  ||}| S r   )r+   
as_historyr   r.   r/   r0   cr   r   r   get_history   s   z DynamicAttributeImpl.get_historyc                 C   s   |  ||}dd |jD S )Nc                 S   s   g | ]	}t ||fqS r   )r   rB   ).0xr   r   r   
<listcomp>   s    z8DynamicAttributeImpl.get_all_pending.<locals>.<listcomp>)r+   	all_itemsra   r   r   r   get_all_pending   s   z$DynamicAttributeImpl.get_all_pendingc                 C   sF   | j |jv r|j| j  }nt| |}|jr!|tj@ r!t| ||dS |S )N)apply_to)r%   rL   rM   rO   r   ZINIT_OK)r   r.   r0   rb   r   r   r   r+      s   
z,DynamicAttributeImpl._get_collection_historyc                 C       || ur|  |||| d S d S r   )rH   r   r.   r/   rD   rE   r0   r   r   r   r?         zDynamicAttributeImpl.appendc                 C   rj   r   )rK   rk   r   r   r   rJ      rl   zDynamicAttributeImpl.removec                 C   s   | j |||||d d S )N)r0   )rJ   rk   r   r   r   rS      s   zDynamicAttributeImpl.popr   )r   r   r   Zuses_objectsZdefault_accepts_scalar_loaderZsupports_populationZ
collectionr   r   r   ZPASSIVE_OFFr1   r,   r5   r	   Zmemoized_propertyr9   r;   rH   rK   r=   rY   r^   r_   rc   rh   r+   r?   rJ   rS   __classcell__r   r   r(   r   r   >   sN    






6


r   c                       sp   e Zd ZdZ fddZdd Zeedd Zdd	 Zd
d Zdd Z	dddZ
dd Zdd Zdd Z  ZS )r!   Nc                    s   t t| |jd  |  | _}|| _t|}|j| jj	 }|j
d ur,|jj|j
f| _|j|dd| _| jjr?| jj| _d S d S )NF)Zalias_secondary)r   r!   r   r   objinstanceattrr   Z_propsr%   Z	secondaryr   Z
selectable	_from_objZ_with_parent
_criterionr   	_order_by)r   rp   r.   ro   r   propr(   r   r   r   	  s   
zAppenderMixin.__init__c                 C   sD   t | j}|d ur| jr|jr| j|v r|  t| js d S |S r   )r   ro   	autoflushflushorm_utilrO   r   sessr   r   r   session  s   

zAppenderMixin.sessionc                 C   s   d S r   r   )sre   r   r   r   <lambda>-  s    zAppenderMixin.<lambda>c                 C   s:   | j }|d u rt| jt| jtjjS t| 	|S r   )
rz   iterrp   r+   r   rB   ro   r,   r-   _clonerx   r   r   r   __iter__/     
zAppenderMixin.__iter__c                 C   s<   | j }|d u r| jt| jtj|S | |	|S r   )
rz   rp   r+   r   rB   ro   r,   indexedr~   __getitem__)r   indexry   r   r   r   r   ;  s   
zAppenderMixin.__getitem__c                 C   s:   | j }|d u rt| jt| jtjjS | 	|
 S r   )rz   lenrp   r+   r   rB   ro   r,   r-   r~   countrx   r   r   r   r   E  r   zAppenderMixin.countc                 C   s~   | j }|d u rt|}|d u rtdt|| jjf | jr*| j| jj	|d}n|
| jj	}| j|_| j|_| j|_|S )NzParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed)rz   )ro   r   orm_excZDetachedInstanceErrorrw   Zinstance_strrp   r%   r   r   queryrr   rq   rs   )r   ry   ro   r   r   r   r   r~   Q  s    zAppenderMixin._clonec                 C   s0   |D ]}| j t| jt| j|d  qd S r   rp   r?   r   rB   ro   instance_dict)r   iteratoritemr   r   r   extendk  s   

zAppenderMixin.extendc                 C   &   | j t| jt| j|d  d S r   r   r   r   r   r   r   r?   t     

zAppenderMixin.appendc                 C   r   r   )rp   rJ   r   rB   ro   r   r   r   r   r   rJ   |  r   zAppenderMixin.remover   )r   r   r   r   r   rz   propertyr   r   r   r~   r   r?   rJ   rm   r   r   r(   r   r!     s    

	r!   c                   @   s   e Zd ZdZdS )r    zBA dynamic query that supports basic collection storage operations.N)r   r   r   __doc__r   r   r   r   r      s    r    c                 C   s   d| j  }t|t| fd| iS )zAReturn a new class with AppenderQuery functionality layered over.ZAppenderr   )r   typer!   )clsnamer   r   r   r#     s   
r#   c                   @   sR   e Zd ZdZdddZedd Zedd Zd	d
 Zdd Z	dd Z
dd ZdS )rM   zDOverrides AttributeHistory to receive append/remove events directly.Nc                 C   sb   |rt ||d}t|| _|j| _|j| _d| _d S t | _t | _t | _d| _d S )NFT)r    ru   r	   ZOrderedIdentitySetunchanged_itemsr-   deleted_items_reconcile_collection)r   rp   r.   ri   Zcollr   r   r   r     s   




zCollectionHistory.__init__c                 C   s   t | j| jS r   )rN   r-   rP   r   r8   r   r   r   r2     s   z&CollectionHistory.added_plus_unchangedc                 C   s   t | j| j| jS r   )rN   r-   rP   r   r   r8   r   r   r   rg     s
   zCollectionHistory.all_itemsc                 C   s`   | j r| j| j}| j| j}| j|}n| j| j| j}}}tt|t|t|S r   )	r   r-   rR   r   r   rQ   r   ZHistoryrN   )r   addedZdeletedZ	unchangedr   r   r   r`     s   
zCollectionHistory.as_historyc                 C   s   t | j| S r   )rN   r-   )r   r   r   r   r   r     s   zCollectionHistory.indexedc                 C   s   | j | d S r   )r-   addr   rD   r   r   r   r>     s   zCollectionHistory.add_addedc                 C   s*   || j v r| j | d S | j| d S r   )r-   rJ   r   r   r   r   r   r   rI     s   
zCollectionHistory.add_removedr   )r   r   r   r   r   r   r2   rg   r`   r   r>   rI   r   r   r   r   rM     s    


rM   N)r    r   r   r   r   r   r   r   r   r	   rw   r   r
   r   Zclass_loggerZRelationshipPropertyZstrategy_forZAbstractRelationshipLoaderr   ZAttributeImplr   objectr!   r    r#   rM   r   r   r   r   <module>   s,    I