ÿØÿà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@sxdZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z d Z d e fd YZ d e fd YZ de fdYZde fdYZde efdYZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZd S(!sThe internals for the unit of work system. The session's flush() process passes objects to a contextual object here, which assembles flush tasks based on mappers and their properties, organizes them in order of dependency, and executes. i(t attributes(texc(t persistence(tutili(tevent(t topologicalcs|jfd}fd}fd}tj|d|dtdttj|d|dtdttj|d|dtdtd S( s\Establish event listeners on object attributes which handle cascade-on-set/append. cs|dkrdS|j}|r|jr8|jdn|jjj}tj|}|j j r|j s~|j kr|j | r|j|qn|S(Nscollection append(tNonetsessiont_warn_on_eventst_flush_warningtmanagertmappert_propsRtinstance_statet_cascadet save_updatetcascade_backrefstkeyt_contains_statet_save_or_update_state(tstatetitemt initiatortsesstpropt item_state(R(sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytappend s    cs|dkrdS|j}|jjj}|rZ|jrZ|j|jrPdndn|dk r|tj k r|tj k r|j j rtj |}|jj|r|r||jkr|j|qt|_qndS(Nscollection removesrelated attribute delete(RRR R R RR tuselistRt NEVER_SETtPASSIVE_NO_RESULTRt delete_orphanR t _is_orphant_newtexpungetTruet_orphaned_outside_of_session(RRRRRR(R(sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytremove6s"     cs-||kr|S|j}|r)|jr8|jdn|jjj}|dk rtj|}|j j r|j s|j kr|j | r|j|qn|dk r)|tjk r)|tjk r)|j jr)tj|}||jkr&|jj|r&|j|q&q)n|S(Nsrelated attribute set(RRR R R R RRR RRRRRRRRRR RR!(RtnewvaluetoldvalueRRRtnewvalue_statetoldvalue_state(R(sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytset_Xs,        RtrawtretvalR$tsetN(RRtlistenR"(t descriptorRRR$R)((RsL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyttrack_cascade_eventss "%tUOWTransactioncBseZdZedZdZdZdZdZe j dZ dZ dZ eeeddd Zd Zd Zejd Zd ZdZdZdZdZRS(cCsv||_i|_tjt|_tjt|_i|_i|_t|_ i|_ tjd|_ dS(NcSsttfS(N(R,(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytt( RRRt defaultdictR,tdepstmapperstpresort_actionstpostsort_actionst dependencieststatestpost_update_states(tselfR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyt__init__s      cCs t|jS(N(tboolR9(R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pythas_workscCsR|jrNy|j|tjWqNtjk rJ|jj|gtSXnt S(sVreturn true if the given state is expired and was deleted previously. ( texpiredt _load_expiredRt PASSIVE_OFFtorm_exctObjectDeletedErrorRt_remove_newly_deletedR"tFalse(R;R((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytwas_already_deleteds cCs||jko|j|dS(sWreturn true if the given state is marked as deleted within this uowtransaction.i(R9(R;R((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyt is_deletedscCs6||jkr|j|S||j|<}|SdS(N(R(R;Rt callable_tret((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytmemos cCs(|j|d}|tf|j|wsiiN(R"REtlistR6tvaluestexecuteRt find_cyclesR8R7tcyclesRQRtdisabledt issupersetR$RdR,t difference(R;RItactionRtconverttedgeRwta((R;sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyt_generate_actions^s:  %   !(.cCs|j}|jraxvtj|j|D]/}x&|rY|j}|j||q4Wq+Wn-x*tj|j|D]}|j|qwWdS(N( RRRtsort_as_subsetsR8tpoptexecute_aggregatetsortR(R;R7R)tnR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs    cCs|js dSt|j}td|jjD}|j|}|rc|jj|n|r||jj|ndS(smark processed objects as clean / deleted after a successful flush(). this method is called within the flush() method after the execute() method has succeeded and the transaction has been committed. Ncss'|]\}\}}|r|VqdS(N((RR}RKRe((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pys s(R9R,titemsRRRDt_register_persistent(R;R9tisdeltother((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pytfinalize_flush_changess N(t__name__t __module__R<tpropertyR>RFRGRJRLRtPASSIVE_NO_INITIALIZERYR[R^RERRhRmRcRtmemoized_propertyR{R~RRRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR0s, -   .        4 tIterateMappersMixincBseZdZRS(cs@jr/tfdjjjDSjjjSdS(Nc3s+|]!}j|jfr|VqdS(N(R{tdependency_processor(Rtm(R;tuow(sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pys s(R]titerRtparentRR (R;R((R;RsL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyt_mapperss  (RRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRsR\cBs eZdZdZdZRS(RR]t processedtsetup_flush_actionscCs+||_||_t|_t|_dS(N(RR]R,RRER(R;RR]((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<s   cCsUt}t}xz|j|D]i}x`|j|j|jD]E}|j|\}}|sB|rw|j|q|j|qBqBWq"W|r|jj|||jj |n|r|jj |||jj |n|s|rM|j rI|jj ||t s-|jj ||trI|jj|t |_ nt StSdS(N(R,RR5RRR9RdRtpresort_deletesRjt presort_savesRtprop_has_changesR"REtper_property_flush_actions(R;Rt delete_statest save_statesR RRKRe((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs2        (RR]RR(RRt __slots__R<R(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR\s  t PostSortReccBs eZdZdZdZRS(RcGsR|f|}||jkr'|j|Stj||j|<}t|_|SdS(N(R7tobjectt__new__RER(tclsRtargsRRI((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs    cCs|j|dS(N(R(R;Rtrecs((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs(R(RRRRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs t ProcessAllcBs;eZdZdZdZdZdZdZRS( RRKR]cCs9||_||_||_|j|jjj|dS(N(RRKR]R4RRiRd(R;RRRKR]((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<s    cCsE|j|}|jr.|jj||n|jj||dS(N(t _elementsRKRtprocess_deletest process_saves(R;RR9((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs cCs tgS(N(R(R;R((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRscCsd|jj|j|jfS(Ns%s(%s, isdelete=%s)(t __class__RRRK(R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyt__repr__%s ccsgx`|j|D]O}xF|j|D]7}|j|\}}||jkr$| r$|Vq$q$WqWdS(N(RR5R9RK(R;RR RRKRe((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR,s (RRKR](RRRR<RRRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR s     t PostUpdateAllcBs eZdZdZdZRS(R RKcCs||_||_dS(N(R RK(R;RR RK((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<7s cCsf|j|j\}}g|D]&}|j|d|jkr|^q}tj|j|||dS(Ni(R:R R9RKRt post_update(R;RR9RlR}((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR;s3(R RK(RRRR<R(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR4s RncBs2eZdZdZdZdZdZRS(R cCs"||_||jkstdS(N(R RitAssertionError(R;RR ((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<Es cCs,tj|j|j|jtt|dS(N(Rtsave_objR RRE(R;R((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRIsc cst|j|jtt}|jj}t||}x8|D]0}t||}|jj||f|Vq@Wx=|j |jD]+}|j ||}|j ||tqWdS(N( RRR RERiRotSaveUpdateStateR8RdR4R~R( R;RR9Rit delete_allRRRwtstates_for_prop((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRPs   cCsd|jj|jfS(Ns%s(%s)(RRR (R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRas(R (RRRR<RRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRnBs    RocBs2eZdZdZdZdZdZRS(R cCs"||_||jkstdS(N(R RiR(R;RR ((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<hs cCs,tj|j|j|jtt|dS(N(Rt delete_objR RR"RE(R;R((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRlsc cst|j|jtt}|jj}t||}x8|D]0}t||}|jj ||f|Vq@Wx=|j |jD]+}|j ||}|j ||tqWdS(N( RRR R"RERiRnt DeleteStateR8RdR4R~R( R;RR9Ritsave_allRRRwR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRss   cCsd|jj|jfS(Ns%s(%s)(RRR (R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs(R (RRRR<RRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRoes    t ProcessStatecBs)eZdZdZdZdZRS(RRKRcCs||_||_||_dS(N(RRKR(R;RRRKR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<s  c Cs|j}|j}|j}g|D]9}|j|kr"|j|kr"|j|kr"|^q"}|j||jgg|D]}|j^q~}|r|j||n|j||dS(N(RRRKtdifference_updateRRR( R;RRtcls_RRKtrtour_recsR9((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs     &cCs,d|jj|jtj|j|jfS(Ns%s(%s, %s, delete=%s)(RRRRat state_strRRK(R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs  (RRKR(RRRR<RR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs  RcBs)eZdZdZdZdZRS(RR cCs||_|jj|_dS(N(RR Ri(R;RR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<s cCs|j}|j}g|D]*}|j|kr|j|kr|^q}|j|tj||jgg|D]}|j^qo|dS(N(RR RRRR(R;RRRR RR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs   7 cCs d|jjtj|jfS(Ns%s(%s)(RRRaRR(R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs (RR (RRRR<RR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs  RcBs)eZdZdZdZdZRS(RR cCs||_|jj|_dS(N(RR Ri(R;RR((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyR<s c Cs|j}|j}g|D]*}|j|kr|j|kr|^q}|j||jgg|D]}|j^qf}tj|g|D]}|j|dr|^q|dS(Ni(RR RRRRR9( R;RRRR RRR9R}((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs  7 &cCs d|jjtj|jfS(Ns%s(%s)(RRRaRR(R;((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs (RR (RRRR<RR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyRs  N(t__doc__R2RRRBRRRaRRR/RR0RR\RRRRnRoRRR(((sL/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/orm/unitofwork.pyts( i= 2(###