Modification dates of Archetypes objects are set automatically to the current
date and time when an object is reindexed. Usually this is useful behaviour but if
,for example, you’re importing content from elsewhere into a Plone site and you’d
like to set the modification date to be some time in the past then it’s a problem.
Heres a method that sets the standard dates of an Archetypes content type ‘obj’
to DateTime ‘dt’.
def setObjDate(obj, dt):
"""Prevent update of modification date
od = obj.__dict__
od['notifyModified'] = lambda *args: None
The trick, based on migration code found in the plone.app.blob package, is
to mask the ‘notifyModified’ class method with a no-op lambda on our
instance, call the reindex, then drop the mask so that the class method is visible
I’ve used this successfully for importing data into a Plone 4 instance but it should work at least as far back as Plone 2.5.
I recently had the problem of finding out if a content type in Plone implemented a certain interface, but only given the name of the content type rather than an instantiated object or its class. Whilst it’s easy to create an instance given a content type name, using the Portal Type Tool, creating an instance to test and then deleting it felt wrong. Unfortunately the Types Tool seems to provide no easy way of determining the class of a given type.
The solution comes from a combination of the Portal Types Tool’s type information and the Archetypes Tool’s information about the implementation:
from Products.CMFCore.utils import getToolByName
def has_interface(portal, typeName, interface):
""" Portal is the root portal object, typeName is a
string such as 'MyDocumentType' and interface
is the interface class to be tested against. """
pt = getToolByName(portal, 'portal_types')
at = getToolByName(portal, 'archetype_tool')
typeinfo = pt.get(typeName)
package = typeinfo.product
type = at.lookupType(package, typeName)
klass = type['klass']