--- /dev/null
+# -*- coding: utf-8 -*-
+#######################################################################################
+# Plinn - http://plinn.org #
+# Copyright © 2005-2009 Benoît PIN <benoit.pin@ensmp.fr> #
+# #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License #
+# as published by the Free Software Foundation; either version 2 #
+# of the License, or (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the Free Software #
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #
+#######################################################################################
+"""
+Module to manage history of contents (comparisons, copy to present).
+
+
+
+"""
+
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+from ExtensionClass import Base
+import Acquisition
+from zope.interface import implements
+from OFS.History import historicalRevision
+from Products.PluginIndexes.common import safe_callable
+from interfaces import IContentHistory
+from Products.CMFCore.permissions import ModifyPortalContent
+from permissions import ViewHistory
+from struct import pack, unpack
+from DateTime import DateTime
+
+class ContentHistory(Base, Acquisition.Implicit) :
+ """ Utility to manage historical entries of a content
+ """
+ implements(IContentHistory)
+ security = ClassSecurityInfo()
+
+ def __init__(self, content) :
+ self._content = content
+
+ security.declareProtected(ViewHistory, 'listEntries')
+ def listEntries(self, first=0, last=20):
+ oid = self._content._p_oid
+ db = self._content._p_jar.db()
+ r = db.history(oid, size=last)
+
+ if r is None:
+ # storage doesn't support history
+ return ()
+
+ r=r[first:]
+
+ for d in r:
+ d['time']=DateTime(d['time'])
+ d['key']='.'.join(map(str, unpack(">HHHH", d['tid'])))
+
+ return r
+
+ security.declareProtected(ViewHistory, 'getHistoricalRevisionByKey')
+ def getHistoricalRevisionByKey(self, key, withContext=False):
+
+ serial = apply(pack, ('>HHHH',) + tuple(map(int, key.split('.'))))
+ content = self._content
+ rev = historicalRevision(content, serial)
+ rev = rev.__of__(content.aq_parent)
+ if withContext is False :
+ return rev, DateTime(rev._p_mtime)
+ else :
+ ctx = {}
+ if isinstance(withContext, int) :
+ first = max(withContext-1, 0)
+ entries = self.listEntries(first=first, last=withContext+2)
+
+ if len(entries) == 3 :
+ ctx['next'], ctx['current'], ctx['previous'] = entries
+ elif len(entries) == 2 :
+ serials = [e['tid'] for e in entries]
+ i = serials.index(serial)
+ if i == 0 :
+ # last (newest) transaction
+ ctx['current'], ctx['previous'] = entries
+ else :
+ ctx['next'], ctx['current'] = entries
+ elif len(entries) == 1 :
+ ctx['current'] = entries[0]
+ return rev, ctx
+
+
+ security.declareProtected(ViewHistory, 'compare')
+ def compare(self, leftkey, rightkey):
+ raise NotImplementedError
+
+
+ security.declareProtected(ModifyPortalContent, 'restore')
+ def restore(self, key):
+ raise NotImplementedError
+
+InitializeClass(ContentHistory)
\ No newline at end of file