o znhJ9@s dZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z d dlmZd d lmZd d lm Z ejejjd dGddde jZGdddejZGdddeZGdddee ZddZGdddeZdS)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)logdynamic)lazyc@seZdZddZdS) DynaLoaderc Csjd|_|jstd|j|jjtjtjfvr t d|jt j |j|dt |jj|jj|jjddS)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_mapperorder_by query_class)is_class_leveluselistrInvalidRequestErrorparent_property directionr ONETOMANY MANYTOMANYr warnr_register_attributeDynamicAttributeImplmapperrr)selfrr!A/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/dynamic.pyinit_class_attribute s2 zDynaLoader.init_class_attributeN)__name__ __module__ __qualname__r#r!r!r!r"rs rcseZdZdZdZdZdZdZ d&fdd Ze j fddZ de j fdd Z ejd d Zejd d Z d&ddZ d&ddZddZde j dddfddZddZddZe j fddZe j fddZe j fddZe j fd d!Ze j fd"d#Ze j fd$d%ZZS)'rTFNc  s\tt|j||||fi|||_||_|st|_dSt|vr'||_dSt ||_dSN) superr__init__rr AppenderQueryr AppenderMixinmromixin_user_query) r class_key typecallabledispatchrrrkw __class__r!r"r)Es    zDynamicAttributeImpl.__init__cCs&|tj@s ||tjjS|||Sr')rSQL_OK_get_collection_historyPASSIVE_NO_INITIALIZE added_itemsr)r statedict_passiver!r!r"get\s  zDynamicAttributeImpl.getcCs*|tj@s |||jS|||}|jSr')rr5r6r8added_plus_unchanged)r r9r: user_datar;historyr!r!r"get_collectionds  z#DynamicAttributeImpl.get_collectioncCt|tjSr')rEvent OP_APPENDr r!r!r" _append_tokenqz"DynamicAttributeImpl._append_tokencCrAr')rrB OP_REMOVErDr!r!r" _remove_tokenurFz"DynamicAttributeImpl._remove_tokencCsl|dur |||}|||jjD] }||||p|j}q|jr2|dur4|t||ddSdSdSNT) _modified_event add_addedr1appendrE trackparent sethasparentrinstance_stater r9r:value initiatorcollection_historyfnr!r!r"fire_append_eventys   z&DynamicAttributeImpl.fire_append_eventcCsd|dur |||}|||jr |dur |t||d|jjD] }||||p-|jq$dS)NF) rJ add_removedrMrNrrOr1removerHrPr!r!r"fire_remove_events   z&DynamicAttributeImpl.fire_remove_eventcCsD|j|jvrt|||j|j<|||tjd||j<|j|jSrI)r/committed_stateCollectionHistoryrJr NEVER_SET)r r9r:r!r!r"rJs   z$DynamicAttributeImpl._modified_eventc Cs|r |j|jur dS|r|durdS|} t| } |jr$t|||} |||} |js1| j} n| | j} tj} | | }| |  |}| |}| D]}||vr]|j |||d| dqM|D] }|j |||d| dq`dS)N)rS) parent_tokenlist has_identityr IdentitySetr<rJr8union intersection differencerUrX)r r9r:rQrRr; check_oldpop_adaptiterable new_valuesold_collectionrSidset constants additionsremovalsmemberr!r!r"setsJ     zDynamicAttributeImpl.setcOstr'NotImplementedError)r argskwargsr!r!r"deleteszDynamicAttributeImpl.deletecCstd)Nz7Dynamic attributes don't support collection population.ro)r r9r:rQr!r!r"set_committed_valuesz(DynamicAttributeImpl.set_committed_valuecCs|||}|Sr')r6 as_historyr r9r:r;cr!r!r" get_historys z DynamicAttributeImpl.get_historycCs|||}dd|jDS)NcSsg|] }t||fqSr!)rrO).0xr!r!r" sz8DynamicAttributeImpl.get_all_pending..)r6 all_itemsrvr!r!r"get_all_pendings z$DynamicAttributeImpl.get_all_pendingcCsF|j|jvr |j|j}nt||}|jr!|tj@r!t|||dS|S)N)apply_to)r/rYrZr^rINIT_OK)r r9r;rwr!r!r"r6s  z,DynamicAttributeImpl._get_collection_historycC ||ur|||||dSdSr')rUr r9r:rQrRr;r!r!r"rLzDynamicAttributeImpl.appendcCrr')rXrr!r!r"rWrzDynamicAttributeImpl.removecCs|j|||||ddS)N)r;)rWrr!r!r"rdszDynamicAttributeImpl.popr')r$r%r& uses_objectsdefault_accepts_scalar_loadersupports_population collectionr r)r PASSIVE_OFFr<r7r@r memoized_propertyrErHrUrXrJrnrsrtrxr}r6rLrWrd __classcell__r!r!r3r"r>sN        6   rcspeZdZdZfddZddZeeddZdd Zd d Zd d Z dddZ ddZ ddZ ddZ ZS)r+Ncstt||jd||_}||_t|}|j|jj }|j dur,|j j |j f|_ |j|dd|_|jjr?|jj|_dSdS)NF)alias_secondary)r(r+r)robjinstanceattrr_propsr/ secondaryr selectable _from_obj _with_parent _criterionr _order_by)r rr9rrpropr3r!r"r) s zAppenderMixin.__init__cCsDt|j}|dur|jr|jr|j|vr|t|js dS|Sr')rr autoflushflushorm_utilr^r sessr!r!r"sessions   zAppenderMixin.sessioncCsdSr'r!)srzr!r!r"-szAppenderMixin.cCs:|j}|durt|jt|jtjjSt| |Sr') riterrr6rrOrr7r8_clonerr!r!r"__iter__/ zAppenderMixin.__iter__cCs<|j}|dur|jt|jtj|S|| |Sr') rrr6rrOrr7indexedr __getitem__)r indexrr!r!r"r;s zAppenderMixin.__getitem__cCs:|j}|durt|jt|jtjjS| | Sr') rlenrr6rrOrr7r8rcountrr!r!r"rErzAppenderMixin.countcCs~|j}|durt|}|durtdt||jjf|jr*|j|jj |d}n| |jj }|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)r)rrorm_excDetachedInstanceErrorr instance_strrr/rrqueryrrr)r rrrr!r!r"rQs zAppenderMixin._clonecCs0|D]}|jt|jt|j|dqdSr'rrLrrOr instance_dict)r iteratoritemr!r!r"extendks  zAppenderMixin.extendcC&|jt|jt|j|ddSr'rr rr!r!r"rLt   zAppenderMixin.appendcCrr')rrWrrOrrrr!r!r"rW|rzAppenderMixin.remover')r$r%r&rr)rpropertyrrrrrrLrWrr!r!r3r"r+s    r+c@seZdZdZdS)r*zBA dynamic query that supports basic collection storage operations.N)r$r%r&__doc__r!r!r!r"r*sr*cCsd|j}t|t|fd|iS)zAReturn a new class with AppenderQuery functionality layered over.Appenderr)r$typer+)clsnamer!r!r"r-s r-c@sReZdZdZdddZeddZeddZd d Zd d Z d dZ ddZ dS)rZzDOverrides AttributeHistory to receive append/remove events directly.NcCsb|rt||d}t||_|j|_|j|_d|_dSt|_t|_t|_d|_dS)NFT)r*rr OrderedIdentitySetunchanged_itemsr8 deleted_items_reconcile_collection)r rr9r~collr!r!r"r)s      zCollectionHistory.__init__cCst|j|jSr')r]r8r`rrDr!r!r"r=sz&CollectionHistory.added_plus_unchangedcCst|j|j|jSr')r]r8r`rrrDr!r!r"r|s zCollectionHistory.all_itemscCs`|jr|j|j}|j|j}|j|}n |j|j|j}}}tt|t|t|Sr') rr8rbrrrarHistoryr])r addeddeleted unchangedr!r!r"rus zCollectionHistory.as_historycCst|j|Sr')r]r8)r rr!r!r"rszCollectionHistory.indexedcCs|j|dSr')r8addr rQr!r!r"rKszCollectionHistory.add_addedcCs*||jvr |j|dS|j|dSr')r8rWrrrr!r!r"rVs zCollectionHistory.add_removedr') r$r%r&rr)rr=r|rurrKrVr!r!r!r"rZs     rZN)rrrrrrrrrr rrr r class_loggerRelationshipProperty strategy_forAbstractRelationshipLoaderr AttributeImplrobjectr+r*r-rZr!r!r!r"s,             I