Ñò ‰„[Jc @s0dZddklZlZddkiZddklZl Z lZ l Z ddk l Z ddklZlZddklZlZde ifd „ƒYZeieƒd eifd „ƒYZd efd „ƒ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ÿÿÿÿ(tlogtutilN(t attributestobject_sessionRt strategies(tQuery(t_state_has_identityt has_identity(Rt collectionst DynaLoadercBseZd„Zd„ZRS(c CsMt|_ti||dtdtd|iid|iid|iiƒdS(Nt useobjectt impl_classt target_mappertorder_byt query_class( tTruetis_class_levelRt_register_attributetDynamicAttributeImpltparent_propertytmapperR R(tselfR((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytinit_class_attributes    cCsdS(N(NN(tNone(Rt selectcontexttpathRtrowtadapter((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytcreate_row_processor%s(t__name__t __module__RR(((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR s RcBs¤eZeZeZd d„Zed„Zd ed„Z d„Z d„Z d„Z d„Z d d„Zd„Zed „Zed „Zed „Zed „ZRS(cKsxtt|ƒi||||||_||_|p t|_n0t|iƒjo ||_nt |ƒ|_dS(N( tsuperRt__init__R R t AppenderQueryRt AppenderMixintmrotmixin_user_query(Rtclass_tkeyt typecallableR R Rtkwargs((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR .s    cCs2|o|i|dtƒiS|i||ƒSdS(Ntpassive(t_get_collection_historyRt added_itemsR(Rtstatetdict_R)((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytget:scCsE|o|i|d|ƒiS|i|d|ƒ}|i|iSdS(NR)(R*R+tunchanged_items(RR,R-t user_dataR)thistory((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytget_collection@scCsˆ|i||ƒ}|ii|ƒx+|iD] }|i|||p|ƒq,W|io*|dj o|iti|ƒt ƒndS(N( t_modified_eventR+tappendt extensionst trackparentRt sethasparentRtinstance_stateR(RR,R-tvaluet initiatortcollection_historytext((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytfire_append_eventGs cCsˆ|i||ƒ}|ii|ƒ|io*|dj o|iti|ƒtƒnx+|i D] }|i |||p|ƒq`WdS(N( R3t deleted_itemsR4R6RR7RR8tFalseR5tremove(RR,R-R9R:R;R<((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytfire_remove_eventQs cCsm|i|ijot||ƒ|i|i(RR,R-R)tc((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyt get_history|scCsY|i|ijo|i|i}nt||ƒ}|pt||d|ƒS|SdS(Ntapply_to(R&RBRC(RR,R)RS((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR*€s cCs+||j o|i||||ƒndS(N(R=(RR,R-R9R:R)((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR4‹s cCs+||j o|i||||ƒndS(N(RA(RR,R-R9R:R)((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR@s N(RRRt uses_objectsR?taccepts_scalar_loaderRR R.R2R=RAR3RHRGRQRTR*R4R@(((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR*s     RKcBsJeZdZd„Zd„Zdd„Zdd„Zd„Zd„Z RS(s9the dynamic analogue to orm.collections.CollectionAdaptercCs||_||_||_dS(N(tattrR,tdata(RRXt owner_stateRY((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR –s  cCs t|iƒS(N(titerRY(R((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyt__iter__›scCs&|ii|i|ii||ƒdS(N(RXR4R,tdict(RtitemR:((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytappend_with_eventžscCs&|ii|i|ii||ƒdS(N(RXR@R,R](RR^R:((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytremove_with_event¡scCsdS(N((RR^((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytappend_without_event¤scCsdS(N((RR^((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytremove_without_event§sN( RRt__doc__R R\RR_R`RaRb(((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyRK“s     R"cBsteZd Zd„Zd„Zd„Zeed„ƒZd„Zd„Z d„Z d d„Z d„Z d „Z RS( cCs2ti||idƒ|iƒ|_||_dS(N(RR R RtobjtinstanceRX(RRXR,((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR ­scCskt|iƒ}|dj o2|io(|io|i|jo|iƒnt|iƒpdS|SdS(N(RReRt autoflushtflushR(Rtsess((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyt __session²s 1cCs |iƒS(N(t_AppenderMixin__session(R((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pytsession»scCsdS(N(R(tstx((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyt½scCs\|iƒ}|djo,t|iiti|iƒdtƒi ƒSt|i |ƒƒSdS(NR)( RjRR[RXR*RR8ReRR+t_clone(RRh((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR\¿s    cCsb|iƒ}|djo/|iiti|iƒdtƒii |ƒS|i |ƒi |ƒSdS(NR)( RjRRXR*RR8ReRR+t __getitem__Ro(RtindexRh((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyRpÈs    cCs\|iƒ}|djo,t|iiti|iƒdtƒi ƒS|i |ƒi ƒSdS(NR)( RjRtlenRXR*RR8ReRR+Rotcount(RRh((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyRsÑs    cCsß|i}|djoIt|ƒ}|djo,tidti|ƒ|iifƒ‚q_n|i o|i |ii d|ƒ}n|i |ii ƒ}|i ||iiƒ}|ii o|i |ii ƒ}n|S(NsŒParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceedRk(ReRRtsa_exctUnboundExecutionErrort mapperutilt instance_strRXR&RR tqueryt with_parentR (RRhReRx((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyRoÚs    '  cCs5|iiti|iƒti|iƒ|dƒdS(N(RXR4RR8Ret instance_dictR(RR^((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR4òscCs5|iiti|iƒti|iƒ|dƒdS(N(RXR@RR8ReRzR(RR^((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR@õsN(RRRRR RjRktpropertyR\RpRsRoR4R@(((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR"ªs    R!cBseZdZRS(sBA dynamic query that supports basic collection storage operations.(RRRc(((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR!ùscCs*d|i}t|t|fh|d6ƒS(sAReturn a new class with AppenderQuery functionality layered over.tAppenderR(RttypeR"(tclstname((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR$ýs RCcBseZdZdd„ZRS(sDOverrides AttributeHistory to receive append/remove events directly.c Cs³|oti|iƒ}|i}t||ƒitƒ}g}ti|ƒD]}||jo ||qNqN~|_|i|_|i|_ng|_g|_g|_dS(N(Rt IdentitySetR>R+R!RfR?R/( RRXR,RUtdeletedtaddedtcollt_[1]to((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyR s >   N(RRRcRR (((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyRCs(Rct sqlalchemyRRtsqlalchemy.exceptionst exceptionsRttsqlalchemy.ormRRRvRtsqlalchemy.orm.queryRtsqlalchemy.orm.utilRRRtAbstractRelationLoaderR t class_loggert AttributeImplRtobjectRKR"R!R$RC(((s:/usr/lib/python2.6/site-packages/sqlalchemy/orm/dynamic.pyt s" iO