σ ΓΜ4]c@shdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z d dlmZd d lmZd d lm Z ejejjd dƒde jfd„ƒYƒƒZdejfd„ƒYZdefd„ƒYZdee fd„ƒYZd„Zdefd„ƒYZdS(s‚Dynamic collection API. Dynamic collections act like Query() objects for read operations and support basic add/delete mutation. i(t attributes(texc(t interfaces(t object_mapper(tobject_session(t properties(t strategies(tutil(tQueryi(tlogtlazytdynamict DynaLoadercBseZd„ZRS(c Cs§t|_|js+tjd|jƒ‚n5|jjtjtj fkr`t j d|jƒnt j |j|dtdtd|jjd|jjd|jjƒdS(NstOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.s¬On 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.t useobjectt impl_classt target_mappertorder_byt query_class(tTruetis_class_leveltuselistRtInvalidRequestErrortparent_propertyt directionRt ONETOMANYt MANYTOMANYRtwarnRt_register_attributetDynamicAttributeImpltmapperRR(tselfR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytinit_class_attribute s&     (t__name__t __module__R(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR sRcBseZeZeZeZeZeZdd„Z e j d„Z de jd„Zejd„ƒZejd„ƒZdd„Zdd„Zd„Zde j deed„Zd „Zd „Ze j d „Ze jd „Ze j d „Ze j d„Ze j d„Ze j d„ZRS(c Kswtt|ƒj|||||||_||_|sFt|_n-t|jƒkrd||_nt |ƒ|_dS(N( tsuperRt__init__RRt AppenderQueryRt AppenderMixintmrotmixin_user_query( Rtclass_tkeyt typecallabletdispatchRRRtkw((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR#Es     cCs7|tj@s#|j|tjƒjS|j||ƒSdS(N(RtSQL_OKt_get_collection_historytPASSIVE_NO_INITIALIZEt added_itemsR(Rtstatetdict_tpassive((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytget\s cCs=|tj@s |j||ƒjS|j||ƒ}|jSdS(N(RR-R.R0tadded_plus_unchanged(RR1R2t user_dataR3thistory((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytget_collectionds cCstj|tjƒS(N(RtEventt OP_APPEND(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt _append_tokenqscCstj|tjƒS(N(RR9t OP_REMOVE(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt _remove_tokenuscCs˜|dkr!|j||ƒ}n|j|ƒx/|jjD]!}||||pV|jƒ}q;W|jr”|dk r”|jtj |ƒ|t ƒndS(N( tNonet_modified_eventt add_addedR+tappendR;t trackparentt sethasparentRtinstance_stateR(RR1R2tvaluet initiatortcollection_historytfn((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytfire_append_eventys  cCs–|dkr!|j||ƒ}n|j|ƒ|jrb|dk rb|jtj|ƒ|tƒnx-|jj D]}||||pŠ|j ƒqoWdS(N( R>R?t add_removedRBRCRRDtFalseR+tremoveR=(RR1R2RERFRGRH((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytfire_remove_event‡s  cCs_|j|jkr.t||ƒ|j|jtlistt has_identityRt IdentitySetR4R?R0tuniont intersectiont differenceRIRM(RR1R2RERFR3t check_oldtpopt_adapttiterablet new_valuestold_collectionRGtidsett constantst additionstremovalstmember((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytset‘s@          cOs tƒ‚dS(N(tNotImplementedError(Rtargstkwargs((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytdeleteΧscCstdƒ‚dS(Ns7Dynamic attributes don't support collection population.(Rd(RR1R2RE((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytset_committed_valueΪscCs|j||ƒ}|jƒS(N(R.t as_history(RR1R2R3tc((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt get_historyίscCs;|j||ƒ}g|jD]}tj|ƒ|f^qS(N(R.t all_itemsRRD(RR1R2R3Rjtx((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytget_all_pendingγscCse|j|jkr%|j|j}nt||ƒ}|jr]|tj@r]t||d|ƒS|SdS(Ntapply_to(R)RNRORSRtINIT_OK(RR1R3Rj((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR.ιs cCs)||k r%|j||||ƒndS(N(RI(RR1R2RERFR3((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRAτs cCs)||k r%|j||||ƒndS(N(RM(RR1R2RERFR3((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRLϊs cCs |j||||d|ƒdS(NR3(RL(RR1R2RERFR3((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRYsN( R R!Rt uses_objectsRKtdefault_accepts_scalar_loadertsupports_populationt collectionR R>R#Rt PASSIVE_OFFR4R/R8Rtmemoized_propertyR;R=RIRMR?RcRgRhRkRnR.RARLRY(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR>s6     -   R%cBsteZd Zd„Zd„Zeed„ƒZd„Zd„Zd„Z d d„Z d„Z d„Z d „Z RS( cCs»tt|ƒj|jdƒ|jƒ|_}||_t|ƒ}|j |jj }|j dk r|j j |j f|_n|j|dtƒ|_|jjr·|jj|_ndS(Ntalias_secondary(R"R%R#RR>tobjtinstancetattrRt_propsR)t secondaryRt selectablet _from_objt _with_parentRKt _criterionRt _order_by(RRzR1RyRtprop((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR# s   cCsgt|jƒ}|dk rI|jrI|jrI|j|krI|jƒntj|jƒs_dS|SdS(N(RRyR>t autoflushtflushtorm_utilRS(Rtsess((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytsessions    cCsdS(N(R>(tsRm((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt-tcCsW|j}|dkr@t|jjtj|jƒtjƒj ƒSt|j |ƒƒSdS(N( R‡R>titerRzR.RRDRyR/R0t_clone(RR†((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt__iter__/s   cCsZ|j}|dkr@|jjtj|jƒtjƒj|ƒS|j |ƒj |ƒSdS(N( R‡R>RzR.RRDRyR/tindexedRŒt __getitem__(RtindexR†((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR;s    cCsW|j}|dkr@t|jjtj|jƒtjƒj ƒS|j |ƒj ƒSdS(N( R‡R>tlenRzR.RRDRyR/R0RŒtcount(RR†((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR’Es   cCsΏ|j}|dkr[t|ƒ}|dkr[tjdtj|ƒ|jjfƒ‚q[n|j r‚|j |jj d|ƒ}n|j |jj ƒ}|j |_ |j |_ |j|_|S(NsŒParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceedR‡(RyR>Rtorm_exctDetachedInstanceErrorR…t instance_strRzR)RRtqueryR€R~R(RR†RyR–((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRŒQs    %    cCsFx?|D]7}|jjtj|jƒtj|jƒ|dƒqWdS(N(RzRARRDRyt instance_dictR>(Rtiteratortitem((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytextendks   cCs5|jjtj|jƒtj|jƒ|dƒdS(N(RzRARRDRyR—R>(RR™((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRAts  cCs5|jjtj|jƒtj|jƒ|dƒdS(N(RzRLRRDRyR—R>(RR™((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRL|s  N(R R!R>RR#R‡tpropertyRRR’RŒRšRARL(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR%s    R$cBseZdZRS(sBA dynamic query that supports basic collection storage operations.(R R!t__doc__(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR$…scCs*d|j}t|t|fi|d6ƒS(sAReturn a new class with AppenderQuery functionality layered over.tAppenderR(R ttypeR%(tclstname((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR'‰s ROcBs\eZdZdd„Zed„ƒZed„ƒZd„Zd„Z d„Z d„Z RS( sDOverrides AttributeHistory to receive append/remove events directly.cCsŽ|rTt||ƒjtƒ}tj|ƒ|_|j|_|j|_t|_ n6tjƒ|_tjƒ|_tjƒ|_t|_ dS(N( R$RƒRKRtOrderedIdentitySettunchanged_itemsR0t deleted_itemsRt_reconcile_collection(RRzR1Rotcoll((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR#’s   cCst|jj|jƒƒS(N(RRR0RUR’(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR5ŸscCs%t|jj|jƒj|jƒƒS(N(RRR0RUR’R£(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRl£scCsŠ|jrH|jj|jƒ}|jj|jƒ}|jj|ƒ}n|j|j|j}}}tjt|ƒt|ƒt|ƒƒS(N( R€R0RWR’R£RVRtHistoryRR(Rtaddedtdeletedt unchanged((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRi«s cCst|jƒ|S(N(RRR0(RR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRŽΈscCs|jj|ƒdS(N(R0tadd(RRE((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR@»scCs6||jkr"|jj|ƒn|jj|ƒdS(N(R0RLR£Rͺ(RRE((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRJΎsN( R R!RœR>R#R›R5RlRiRŽR@RJ(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyROs   N(RœRŠRRR“RRRRRRR…R–RR t class_loggertRelationshipPropertyt strategy_fortAbstractRelationshipLoaderR t AttributeImplRtobjectR%R$R'RO(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt s(Θ