Source code for waeup.kofa.objecthistory

## $Id: 11068 2014-02-11 07:34:30Z henrik $
## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
## 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
## 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
import grok
from datetime import datetime
from persistent.list import PersistentList
from zope.component import getUtility
from zope.i18n import translate
from zope.annotation.interfaces import IAnnotations
from waeup.kofa.interfaces import IObjectHistory, IKofaObject, IKofaUtils
from waeup.kofa.utils.helpers import get_current_principal, now

from waeup.kofa.interfaces import MessageFactory as _

[docs]class ObjectHistory(grok.Adapter): """A history for objects. For any object implementing `IKofaObject` which is annotatable, we provide histories. A history for such an object can be obtained by adapting it to `IObjectHistory`. """ grok.context(IKofaObject) grok.implements(IObjectHistory) history_key = 'waeup.history'
[docs] def __init__(self, context): from import removeSecurityProxy self.context = removeSecurityProxy(context) self._annotations = IAnnotations(self.context)
[docs] def _getMessages(self): return self._annotations.get(self.history_key, PersistentList())
@property def messages(self): """Get all messages as a persistent list of strings. """ return self._getMessages()
[docs] def addMessage(self, msg, user=None): """Add the message (history entry) in msg. Any message will be stored with a timestamp and the current user (principal) if user parameter is None. """ msgs = self._getMessages() tz = getUtility(IKofaUtils).tzinfo timestamp = now(tz).strftime("%Y-%m-%d %H:%M:%S %Z") portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE msg = translate(msg,'waeup.kofa',target_language=portal_language) by = translate(_('by'),'waeup.kofa',target_language=portal_language) if user == None: user = get_current_principal() if user is None: usertitle = 'system' elif == 'zope.anybody': usertitle = 'Anonymous' else: usertitle = getattr(user, 'public_name', None) if not usertitle: usertitle = user.title msg = u'%s - %s %s %s' % (timestamp, msg, by, usertitle) elif user == 'undisclosed': msg = u'%s - %s' % (timestamp, msg) else: msg = u'%s - %s %s %s' % (timestamp, msg, by, user) msgs.append(msg) self._annotations[self.history_key] = msgs return
[docs] def modifyMessages(self, old, new): """Replaces history messages. Substring 'old' will be replaced by 'new' in all messages. """ old_msgs = self._getMessages() new_msgs = PersistentList() for msg in old_msgs: new_msg = msg.replace(old, new) new_msgs.append(new_msg) self._annotations[self.history_key] = new_msgs return
[docs] def removeMessage(self, number): """Removes a single history message. """ msgs = self._getMessages() if not isinstance(number, int): return False, 'Not a number' try: line = msgs[number] except IndexError: return False, 'Number out of range' msgs.pop(number) self._annotations[self.history_key] = msgs return True, line