Timestamps

Description

How to read created and modified timestamps on Plone content items programmatically

Introduction

Here are some useful timestamps you can extract from content objects and examples how to use them.

Timestamps are part of metadata. For Archetypes, metadata is defined in ExtensibleMetadata.

Zope 2 DateTime date objects are used.

Last modification date

Products.Archetypes.ExtensibleMetadata.modified() function will give the last modification date as Zope DateTime object. This is part of Dublin Core metadata.

Example (Zope console debug mode):

>>> app.yoursite.yourpage.modified()
DateTime('2009/02/04 10:56:25.740 Universal')

Setting modification date explicitly

You might want to manual set modification date

  • When you migrate content
  • When you edit content subobjects and want to update the timestamp of parent object to reflect this changes

Example (Zope console debug mode, assume obj is Archetypes content item):

>>> obj.modified()
>>> DateTime('2009/10/05 16:18:32.813 GMT+2')

>>> import DateTime

>>> now = DateTime.DateTime()
>>> now
>>> DateTime('2010/01/20 12:58:38.033 GMT+2')

>>> obj.setModificationDate(now)
>>> obj.modified()
>>> DateTime('2010/01/20 12:58:38.033 GMT+2')

Viewlet example

Below is an example how to create a custom last modified viewlet.

Viewlet code:

from zope.component import getMultiAdapter
from plone.app.layout.viewlets.common import ViewletBase

class LastModifiedViewlet(ViewletBase):
    """ Viewlet to change the document last modification time.
    """

    def modified(self):
        """

        https://github.com/plone/Products.CMFPlone/blob/master/Products/CMFPlone/browser/ploneview.py

        @return: Last modified as a string, local time format
        """

        # Get Plone helper view
        # which we use to convert the date to local format
        plone = getMultiAdapter((self.context, self.request), name="plone")

        time = self.context.modified()

        return plone.toLocalizedTime(time)

Template (lastmodified.py):

<div id="last-modified">
        Last modified: <span tal:content="view/modified" />
</div>

Viewlet registration:

<!-- Last modification date, register only for contentish context objects -->
<browser:viewlet
    name="yourapp.lastmodified"
    for="Products.CMFCore.interfaces.IContentish"
    manager="plone.app.layout.viewlets.interfaces.IBelowContent"
    template="viewlets/lastmodified.pt"
    class=".common.LastModifiedViewlet"
    permission="zope2.View"
    />

CSS:

#last-modified {
        text-align: right;
        font-size: 80%;
        color: #888;
}

Creation date

Products.Archetypes.ExtensibleMetadata.created() function will give the creation date as Zope DateTime object. This is part of Dublin Core metadata.

Example (Zope console debug mode):

>>> app.yoursite.yourpage.created()
DateTime('2009/02/04 10:56:25.740 Universal')