mò .á¸Ec@s5dZdkZdkZdkZdklZdklZdklZlZdk l Z l Z dk l Z dklZdklZd klZd efd „ƒYZd efd „ƒYZdfd„ƒYZd„Zdefd„ƒYZdeifd„ƒYZeeƒd„Zd„Zd„ZdS(sFObject Histories $Id: History.py 67805 2006-05-01 15:44:10Z chrisw $ N(sInitializeClass(sDateTime(sImplicitsaq_base(spacksunpack(sescape(sRedirect(sClassSecurityInfo(s view_historytTemporalParadoxcBstZRS(N(t__name__t __module__(((t*/data/zmath/zope/lib/python/OFS/History.pyRstHistorySelectionErrorcBstZRS(N(RR(((RRst HystoryJarcBs<tZdZd„Zd„Zd„Zd„ZeZZRS(sgA ZODB Connection-like object that provides access to data but prevents history from being changed.cCs ||_dS(N(tbasetselft__base__(RR((Rt__init__#scCst|i|ƒS(N(tgetattrRRtname(RR ((Rt __getattr__&scCs|io td‚ndS(NsYou can't change history!(tobjectt _p_changedR(RR t transaction((Rtcommit)s cOsdS(N((targstkw((Rtabort-s( RRt__doc__R R RRt tpc_begint tpc_finish(((RRs     cCse|ii||ƒ}|iiƒ}t|iƒ|_|i |_ ||_ |i |ƒd|_ |S(Ni( Rt_p_jartoldstatetserialtstatet __class__t __basicnew__trevRt_p_oidt _p_serialt __setstate__R(RRRR((RthistoricalRevision1s    t HistoriancBs tZdZd„Zd„ZRS(sPAn Historian's job is to find hysterical revisions of objects, given a time.cCsk|i}ttdttt|idƒƒƒƒ}||i jo|Snt ||ƒ}|i |iƒS(Ns>HHHHt.(s>HHHH(Rt aq_parenttapplytpackttupletmaptinttkeytsplitRRR!Rt__of__(RR*RR((Rt __getitem__?s  +cCst|dd‚dS(s7We aren't real, so we delegate to that that spawned us!tURL2s/manage_change_history_pageN(tRedirecttREQUEST(RR0((Rtmanage_workspaceJs(RRRR-R1(((RR";s  t Historicalc Bs tZdZeƒZeƒZhdd<dd<ddHHHHttidR*(tfirsttlastR RtNonetrequesttgetRtdbthistoryRtrtdtDateTimetjoinR(tstrtunpack(RR@RGRBRFR?((RR<js !  -cCsdS(N((R((Rtmanage_beforeHistoryCopyscCs|p td‚nt|ƒdjo td‚n|d}ttd ttt|i dƒƒƒƒ}||i joY|i ƒ|ii||ƒ}t|ƒ}|iƒ|i|ƒt|_|iƒn|dj o"|dj o|i|dƒndS( s'Copy a selected revision to the presents'No historical revision was selected.

is=Only one historical revision can be copied to the present.

is>HHHHR#s/manage_workspaceN(s>HHHH(tkeysRtlenR*R%R&R'R(R)R+RRRRLRRRtaq_baseRt _p_activateR tTrueRtmanage_afterHistoryCopytRESPONSERAtURL1tredirect(RRMRSRTRRR*R((Rtmanage_historyCopys"   +     cCsdS(N((R((RRR›ssdtml/historyComparetmanagement_viewtmanage_historyComparetc Cs@t|iƒ}t|iƒ}|i||d|d|d|ƒS(Ntdt1tdt2thistoryComparisonResults( RHtrev1t_p_mtimeRZtrev2R[Rt_manage_historyComparePageR0R\(RR]R_R0R\R[RZ((RRX¡s   tmanage_historicalComparisoncCsà|p td‚nt|ƒdjo td‚nttd ttt|didƒƒƒƒ}t ||ƒ}t|ƒdjoBttd ttt|didƒƒƒƒ}t ||ƒ}n|}|i|||ƒS( sCompare two selected revisionss'No historical revision was selected.

is/Only two historical revision can be compared

s>HHHHiÿÿÿÿR#iN(s>HHHH(s>HHHH(RMRRNR%R&R'R(R)R+RR!RR]R_RXR0(RR0RMR]RR_((RRa«s  /)(R8s History.stx(RRRtClassSecurityInfotsecurityR"tHistoricalRevisionstmanage_optionstdeclareProtectedt view_historytGlobalstDTMLFiletglobalsR6R<RLRARVRRR`RXRa(((RR2Ns$   $    cCswg}g}x5t||ƒD]$}|i|ƒ|i||ƒqW|iddi |ƒt di |ƒƒfƒdS(Ns=

%s
%s
s ( tr1tr2txrangetlothititappendttagtxRFRItescape(RrRsRnRoRFRkRlRp((RtdumpÃs c CsÙg}g} x5t||ƒD]$}|idƒ| i||ƒqWg} g} x5t||ƒD]$}| idƒ| i||ƒq`W|iddi|ƒdi| ƒtdi| ƒƒtdi| ƒƒfƒdS(Nt-t+sC
%s
%s
%s
%s
s (trx1trx2RmtxlotxhiRpRqRstry1try2tylotyhityRFRIRt( RsRzR{R€R~RRFRpRxRyR}R|((RtreplaceÏs  c Cs3|idƒ}|idƒ}tiƒ} | i||ƒdg} xÓ| i ƒD]Å\}}}}}|djo t||||||| ƒqP|djotd|||| ƒqP|djotd|||| ƒqP|djotd |||| ƒqPtd | ‚qPW| id ƒdi| ƒS( Ns sRtdeleteRvtinsertRwtequalt s unknown tag s
(ts1R+tats2tbtdifflibtSequenceMatchertcrunchertset_seqsRFt get_opcodesRrtalotahitblotbhiRRut ValueErrorRqRI( R†RˆR‡RR’R‰RRrR‘RFRŒ((Rt html_diffås$         (RRhtExtensionClassRŠtInitializeClassRHt AcquisitiontImplicitROtstructR&RKtcgiRtt zExceptionsR/t AccessControlRbtAccessControl.PermissionsRgt ExceptionRRRR!R"tBaseR2RuRR”(R/RRuR"RHRtRR”R!R˜RORbR–R2RRKRgR•RŠRRhR&((Rt?s&       s