a
    [gX&                     @  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 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rd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d#ed$Z.G d%d& d&ee. Z/G d'd( d(eZ0ej1j2d)d*G d+d, d,eZ3G d-d. d.ee. Z4G d/d0 d0e4e. ee. Z5d1d2d3d4d5Z6d6S )7zDynamic 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)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                   @  s$   e Zd Zd
dddddddd	ZdS )DynamicCollectionHistoryNDynamicAttributeImplInstanceState[_T]r   z&Optional[DynamicCollectionHistory[_T]]None)attrstatepassiveapply_toreturnc                 C  s`   |r8t ||d}t|| _|j| _|j| _d| _n$t | _t | _t | _d| _d S )NFT)AppenderQuery	autoflushr   ZOrderedIdentitySetZunchanged_itemsadded_itemsZdeleted_itemsZ_reconcile_collection)selfr)   r*   r+   r,   Zcoll r2   d/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/orm/dynamic.py__init__>   s    


z!DynamicCollectionHistory.__init__)N)__name__
__module____qualname__r4   r2   r2   r2   r3   r%   =   s    r%   c                
   @  s@   e Zd ZU dZee Zded< dddddd	d
dddddZdS )r&   TzType[AppenderMixin[Any]]query_classNz#Union[Type[Any], AliasedClass[Any]]strz"_Dispatch[QueryableAttribute[Any]]z
Mapper[_T]r   z!Optional[Type[AppenderMixin[_T]]]r   r(   )class_keydispatchtarget_mapperorder_byr8   kwr-   c                 K  s^   t jj| ||d |fi | || _|r0t|| _|s<t| _nt|	 v rP|| _n
t
|| _d S N)r   ZAttributeImplr4   r=   tupler>   r.   r8   AppenderMixinmromixin_user_query)r1   r:   r;   r<   r=   r>   r8   r?   r2   r2   r3   r4   W   s    


zDynamicAttributeImpl.__init__)N)	r5   r6   r7   Z_supports_dynamic_iterationr%   r   Zcollection_history_cls__annotations__r4   r2   r2   r2   r3   r&   R   s
   
	 r&   Zdynamic)Zlazyc                   @  s   e Zd ZeZdS )
DynaLoaderN)r5   r6   r7   r&   Z
impl_classr2   r2   r2   r3   rF   o   s   rF   c                      s  e Zd ZU dZdZded< ded< ddd	d
 fddZeddddZej	dd	dddZddddZ
erddddZdddddZddd d!Zd4dd"d#d$d%Zd&d	d'd(d)Zd*d	d+d,d-Zd&d	d'd.d/Zd*d	d+d0d1Zd*d	d+d2d3Z  ZS )5rB   zTA mixin that expects to be mixing in a Query class with
    AbstractAppender.


    NzOptional[Type[Query[_T]]]r8   zTuple[ColumnElement[Any], ...]_order_by_clausesr&   r'   r(   )r)   r*   r-   c                   s"   t | |jd  t || d S r@   )r   r4   r=   super)r1   r)   r*   	__class__r2   r3   r4   ~   s    zAppenderMixin.__init__zOptional[Session])r-   c                 C  sB   t | j}|d ur*|jr*| j|v r*|  t| js:d S |S d S r@   )r   instancer/   flushorm_utilZhas_identityr1   sessr2   r2   r3   session   s    
zAppenderMixin.sessionr   )rP   r-   c                 C  s
   || _ d S r@   )rO   )r1   rP   r2   r2   r3   rP      s    z1Union[result.ScalarResult[_T], result.Result[_T]]c                 C  s   | j }|d u rpt| j}|jr4tdt|  t	j
t	| jjjgt| jt| jtjjdd S | | S d S )NzInstance %s is detached, dynamic relationship cannot return a correct result.   This warning will become a DetachedInstanceError in a future release.T)Z_source_supports_scalars)rP   r   instance_staterK   Zdetachedr   warnrM   	state_strr   ZIteratorResultZSimpleResultMetaDatar)   r:   r5   iter_get_collection_historyr   PASSIVE_NO_INITIALIZEr0   Zscalars	_generate_iter)r1   rO   r*   r2   r2   r3   rX      s(    

zAppenderMixin._iterzIterator[_T]c                 C  s   d S r@   r2   )r1   r2   r2   r3   __iter__       zAppenderMixin.__iter__r   zUnion[_T, List[_T]])indexr-   c                 C  s@   | j }|d u r,| jt| jtj|S | 	|
|S d S r@   )rP   r)   rU   r   rQ   rK   r   rV   ZindexedrW   __getitem__)r1   r[   rO   r2   r2   r3   r\      s    
zAppenderMixin.__getitem__intc                 C  s>   | j }|d u r,t| jt| jtjj	S | 
| S d S r@   )rP   lenr)   rU   r   rQ   rK   r   rV   r0   rW   countrN   r2   r2   r3   r_      s    
zAppenderMixin.countz	Query[_T])rO   r-   c                 C  s~   | j }|d u r:t|}|d u r:tdt|| jjf | jrT| 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)rP   )rK   r   orm_excZDetachedInstanceErrorrM   Zinstance_strr)   r;   r8   r=   queryZ_where_criteriaZ	_from_objrG   )r1   rO   rK   ra   r2   r2   r3   rW      s     zAppenderMixin._generatezIterable[_T])iteratorr-   c                 C  s   |  | dS )a~  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Z_add_all_implr1   rb   r2   r2   r3   add_all   s    zAppenderMixin.add_allr#   )itemr-   c                 C  s   |  |g dS )ap  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

        Nrc   r1   rf   r2   r2   r3   add   s    zAppenderMixin.addc                 C  s   |  | dS )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.

        Nrc   rd   r2   r2   r3   extend  s    zAppenderMixin.extendc                 C  s   |  |g dS )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.

        Nrc   rg   r2   r2   r3   append  s    zAppenderMixin.appendc                 C  s   |  | dS )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)Z_remove_implrg   r2   r2   r3   remove  s    zAppenderMixin.remove)N)r5   r6   r7   __doc__r8   rE   r4   propertyrP   setterrX   r
   rY   r\   r_   rW   re   rh   ri   rj   rk   __classcell__r2   r2   rI   r3   rB   t   s(   

	
 		rB   c                   @  s   e Zd ZdZdS )r.   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.


    N)r5   r6   r7   rl   r2   r2   r2   r3   r.     s   r.   r   ztype[AppenderMixin[Any]])clsr-   c                 C  s   d| j  }t|t| fd| iS )zAReturn a new class with AppenderQuery functionality layered over.ZAppenderr8   )r5   typerB   )rp   namer2   r2   r3   rD   )  s    
rD   N)7rl   
__future__r   typingr   r   r   r   r   r   r	   r
   r   r    r   r   r`   r   r   rM   baser   ra   r   rP   r   Z	writeonlyr   r   r   r   Zenginer   r   Zmapperr   r   r   r*   r   r    eventr!   Zsql.elementsr"   r#   r%   r&   ZRelationshipPropertyZstrategy_forrF   rB   r.   rD   r2   r2   r2   r3   <module>	   sT    +