## $Id: objecthistory.py 7690 2012-02-23 15:41:42Z 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
## 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., 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.sirp.interfaces import IObjectHistory, ISIRPObject, ISIRPUtils
from waeup.sirp.utils.helpers import get_current_principal

from waeup.sirp.interfaces import MessageFactory as _

class ObjectHistory(grok.Adapter):
    """A history for objects.

    For any object implementing `ISIRPObject` which is annotatable,
    we provide histories. A history for such an object can be obtained
    by adapting it to `IObjectHistory`.
    """
    grok.context(ISIRPObject)
    grok.implements(IObjectHistory)

    history_key = 'waeup.history'

    def __init__(self, context):
        from zope.security.proxy import removeSecurityProxy
        self.context = removeSecurityProxy(context)
        self._annotations = IAnnotations(self.context)

    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()

    def addMessage(self, msg):
        """Add the message (history entry) in msg.

        Any message will be stored with a timestamp and the current
        user (principal).
        """
        msgs = self._getMessages()
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        user = get_current_principal()
        if user is None:
            user = 'system'
        elif user.id == 'zope.anybody':
            user = 'Anonymous'
        else:
            user = user.title
        portal_language = getUtility(ISIRPUtils).PORTAL_LANGUAGE
        by = 'by'
        if portal_language != 'en':
            by = translate(_('by'),'waeup.sirp',target_language=portal_language)
            msg = translate(msg,'waeup.sirp',target_language=portal_language)
        msg = u'%s - %s %s %s' % (timestamp, msg, by, user)
        msgs.append(msg)
        self._annotations[self.history_key] = msgs
        return
