o
    y¬´\w7  ã                   @   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	 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 )z‚Dynamic collection API.

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

é   )Ú
attributes)Úexc)Úobject_mapper)Úobject_session)Ú
properties)Ú
strategies)Úutil)ÚQueryé   )ÚlogÚdynamic)Úlazyc                   @   s   e Zd Zdd„ ZdS )Ú
DynaLoaderc              	   C   sF   d| _ | js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.)Ú	useobjectÚ
impl_classÚtarget_mapperÚorder_byÚquery_class)Úis_class_levelÚuselistr   ÚInvalidRequestErrorÚparent_propertyr   Ú_register_attributeÚDynamicAttributeImplÚmapperr   r   )Úselfr   © r   úH/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/orm/dynamic.pyÚinit_class_attribute   s    þÿ
ù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_ÚkeyÚtypecallableÚdispatchr   r   r   Úkw©Ú	__class__r   r   r$   9   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   ÚgetP   s   
ÿþzDynamicAttributeImpl.getc                 C   s*   |t j@ s|  ||¡jS |  ||¡}|jS r"   )r   r0   r1   r3   Úadded_plus_unchanged)r   r4   r5   Ú	user_datar6   Úhistoryr   r   r   Úget_collectionX   s   
z#DynamicAttributeImpl.get_collectionc                 C   ó   t  | t j¡S r"   )r   ÚEventÚ	OP_APPEND©r   r   r   r   Ú_append_tokene   ó   z"DynamicAttributeImpl._append_tokenc                 C   r<   r"   )r   r=   Ú	OP_REMOVEr?   r   r   r   Ú_remove_tokeni   rA   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,   Úappendr@   ÚtrackparentÚsethasparentr   Úinstance_state©r   r4   r5   ÚvalueÚ	initiatorÚcollection_historyÚfnr   r   r   Úfire_append_eventm   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)	rE   Úadd_removedrH   rI   r   rJ   r,   ÚremoverC   rK   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 rD   )r*   Úcommitted_stateÚCollectionHistoryrE   r   Ú	NEVER_SET)r   r4   r5   r   r   r   rE   ‰   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)rN   )Úparent_tokenÚlistÚhas_identityr   ÚIdentitySetr7   rE   r3   ÚunionÚintersectionÚ
differencerP   rS   )r   r4   r5   rL   rM   r6   Ú	check_oldÚpopÚ_adaptÚiterableÚ
new_valuesÚold_collectionrN   ÚidsetÚ	constantsÚ	additionsÚ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.rj   )r   r4   r5   rL   r   r   r   Úset_committed_valueÎ   s   ÿz(DynamicAttributeImpl.set_committed_valuec                 C   s   |   ||¡}| ¡ S r"   )r1   Ú
as_history©r   r4   r5   r6   Ú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   rJ   )Ú.0Úxr   r   r   Ú
<listcomp>Û   s    z8DynamicAttributeImpl.get_all_pending.<locals>.<listcomp>)r1   Ú	all_itemsrq   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*   rT   rU   rY   r   ÚINIT_OK)r   r4   r6   rr   r   r   r   r1   Ý   s   
z,DynamicAttributeImpl._get_collection_historyc                 C   ó    || ur|   ||||¡ d S d S r"   )rP   ©r   r4   r5   rL   rM   r6   r   r   r   rG   è   ó   ÿzDynamicAttributeImpl.appendc                 C   r{   r"   )rS   r|   r   r   r   rR   î   r}   zDynamicAttributeImpl.removec                 C   s   | j |||||d� d S )N)r6   )rR   r|   r   r   r   r_   ô   s   zDynamicAttributeImpl.popr"   )r   r    r!   Úuses_objectsÚdefault_accepts_scalar_loaderÚsupports_populationÚ
collectionr   r$   r   ÚPASSIVE_OFFr7   r2   r;   r   Úmemoized_propertyr@   rC   rP   rS   rE   ri   rn   ro   rs   rx   r1   rG   rR   r_   Ú__classcell__r   r   r.   r   r   2   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)Úalias_secondary)r#   r&   r$   r   ÚobjÚinstanceÚattrr   Ú_propsr*   Ú	secondaryr   Ú
selectableÚ	_from_objÚ_with_parentÚ
_criterionr   Ú	_order_by)r   rˆ   r4   r‡   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   r‡   Ú	autoflushÚflushÚorm_utilrY   ©r   Úsessr   r   r   Úsession  s   
ÿþ
zAppenderMixin.sessionc                 C   s   d S r"   r   )Úsru   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"   )
r–   Úiterrˆ   r1   r   rJ   r‡   r2   r3   Ú_cloner”   r   r   r   Ú__iter__#  ó   
þüzAppenderMixin.__iter__c                 C   s<   | j }|d u r| j t | j¡tj¡ |¡S |  |¡ 	|¡S r"   )
r–   rˆ   r1   r   rJ   r‡   r2   Úindexedrš   Ú__getitem__)r   Úindexr•   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"   )r–   Úlenrˆ   r1   r   rJ   r‡   r2   r3   rš   Úcountr”   r   r   r   r¡   9  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 )NzŒParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceed)r–   )r‡   r   Úorm_excÚDetachedInstanceErrorr“   Úinstance_strrˆ   r*   r   r   ÚqueryrŽ   rŒ   r�   )r   r•   r‡   r¥   r   r   r   rš   E  s    ýÿzAppenderMixin._clonec                 C   s0   |D ]}| j  t | j¡t | j¡|d ¡ qd S r"   ©rˆ   rG   r   rJ   r‡   Úinstance_dict)r   ÚiteratorÚitemr   r   r   Úextend_  s   

üÿzAppenderMixin.extendc                 C   ó&   | j  t | j¡t | j¡|d ¡ d S r"   r¦   ©r   r©   r   r   r   rG   h  ó   

üzAppenderMixin.appendc                 C   r«   r"   )rˆ   rR   r   rJ   r‡   r§   r¬   r   r   r   rR   p  r­   zAppenderMixin.remover"   )r   r    r!   r   r$   r–   Úpropertyr›   rž   r¡   rš   rª   rG   rR   r„   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%   y  s    r%   c                 C   s   d| j  }t|t| fd| iƒS )zAReturn a new class with AppenderQuery functionality layered over.Ú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 )rU   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%   r‘   r   ÚOrderedIdentitySetÚunchanged_itemsr3   Údeleted_itemsÚ_reconcile_collection)r   rˆ   r4   ry   Úcollr   r   r   r$   †  s   




zCollectionHistory.__init__c                 C   s   t | j | j¡ƒS r"   )rX   r3   r[   rµ   r?   r   r   r   r8   “  s   z&CollectionHistory.added_plus_unchangedc                 C   s   t | j | j¡ | j¡ƒS r"   )rX   r3   r[   rµ   r¶   r?   r   r   r   rw   —  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·   r3   r]   rµ   r¶   r\   r   ÚHistoryrX   )r   ÚaddedÚdeletedÚ	unchangedr   r   r   rp   Ÿ  s   
ýzCollectionHistory.as_historyc                 C   s   t | jƒ| S r"   )rX   r3   )r   rŸ   r   r   r   r�   ¬  s   zCollectionHistory.indexedc                 C   s   | j  |¡ d S r"   )r3   Úadd©r   rL   r   r   r   rF   ¯  s   zCollectionHistory.add_addedc                 C   s*   || j v r| j  |¡ d S | j |¡ d S r"   )r3   rR   r¶   r½   r¾   r   r   r   rQ   ²  s   
zCollectionHistory.add_removedr"   )r   r    r!   r¯   r$   r®   r8   rw   rp   r�   rF   rQ   r   r   r   r   rU   ƒ  s    


rU   N)r¯   Ú r   r   r¢   r   r   r   r   r   r“   r¥   r	   r   Úclass_loggerÚRelationshipPropertyÚstrategy_forÚAbstractRelationshipLoaderr   ÚAttributeImplr   Úobjectr&   r%   r(   rU   r   r   r   r   Ú<module>   s*    I