ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ 4]c@shdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd l m Z d dlmZd d lmZd d lm Z ejejjd dde jfdYZdejfdYZdefdYZdee fdYZdZdefdYZdS(sDynamic 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 DynaLoadercBseZdZRS(c Cst|_|js+tjd|jn5|jjtjtj fkr`t j d|jnt j |j|dtdtd|jjd|jjd|jjdS(NstOn relationship %s, 'dynamic' loaders cannot be used with many-to-one/one-to-one relationships and/or uselist=False.sOn 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 sRcBseZeZeZeZeZeZddZ e j dZ de jdZejdZejdZddZddZdZde j deedZd Zd Ze j d Ze jd Ze j d Ze j dZe j dZe j dZRS(c Kswtt|j|||||||_||_|sFt|_n-t|jkrd||_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|tjjS|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|tjS(N(RtEventt OP_APPEND(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt _append_tokenqscCstj|tjS(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||tnx-|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_events  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.pytsets@          cOs tdS(N(tNotImplementedError(Rtargstkwargs((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytdeletescCstddS(Ns7Dynamic attributes don't support collection population.(Rd(RR1R2RE((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytset_committed_valuescCs|j||}|jS(N(R.t as_history(RR1R2R3tc((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt get_historyscCs;|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_pendingscCse|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.pyRAs cCs)||k r%|j||||ndS(N(RM(RR1R2RERFR3((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRLs 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 ZdZdZeedZdZdZdZ d dZ dZ dZ d Z RS( cCstt|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|jntj|js_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|jtjj St|j |SdS(N( RR>titerRzR.RRDRyR/R0t_clone(RR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt__iter__/s   cCsZ|j}|dkr@|jjtj|jtjj|S|j |j |SdS(N( RR>RzR.RRDRyR/tindexedRt __getitem__(RtindexR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR;s    cCsW|j}|dkr@t|jjtj|jtjj S|j |j SdS(N( RR>tlenRzR.RRDRyR/R0Rtcount(RR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyREs   cCs|j}|dkr[t|}|dkr[tjdtj||jjfq[n|j r|j |jj d|}n|j |jj }|j |_ |j |_ |j|_|S(NsParent instance %s is not bound to a Session, and no contextual session is established; lazy load operation of attribute '%s' cannot proceedR(RyR>Rtorm_exctDetachedInstanceErrorRt instance_strRzR)RRtqueryRR~R(RRRyR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRQs    %    cCsFx?|D]7}|jjtj|jtj|j|dqWdS(N(RzRARRDRyt instance_dictR>(Rtiteratortitem((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pytextendks   cCs5|jjtj|jtj|j|ddS(N(RzRARRDRyRR>(RR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRAts  cCs5|jjtj|jtj|j|ddS(N(RzRLRRDRyRR>(RR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRL|s  N(R R!R>RR#RtpropertyRRRRRRARL(((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|d6S(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\eZdZddZedZedZdZdZ dZ dZ RS( sDOverrides AttributeHistory to receive append/remove events directly.cCs|rTt||jt}tj||_|j|_|j|_t|_ n6tj|_tj|_tj|_t|_ dS(N( R$RRKRtOrderedIdentitySettunchanged_itemsR0t deleted_itemsRt_reconcile_collection(RRzR1Rotcoll((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR#s   cCst|jj|jS(N(RRR0RUR(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyR5scCs%t|jj|jj|jS(N(RRR0RURR(R((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRlscCs|jrH|jj|j}|jj|j}|jj|}n|j|j|j}}}tjt|t|t|S(N( RR0RWRRRVRtHistoryRR(Rtaddedtdeletedt unchanged((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRis cCst|j|S(N(RRR0(RR((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRscCs|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(R0RLRR(RRE((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyRJsN( R R!RR>R#RR5RlRiRR@RJ(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyROs   N(RRRRRRRRRRRRRRR t class_loggertRelationshipPropertyt strategy_fortAbstractRelationshipLoaderR t AttributeImplRtobjectR%R$R'RO(((sI/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/dynamic.pyt s(