How to programmatically rename Plone content items
This page tells how to rename Plone content objects and change their ids.
This only concerns URL path ids
Archetypes’ Unique ID (UID) is not affected by the rename operation
Title can be changed using
setTitle()(Archetypes) or related mutator
OFS interface has facilities to rename objects
manage_renameObject(oldid, newid)for one item
manage_renameObject([oldid, oldid2], [newid, newid2])for rename many items
Products.CMFPlone.PloneFolder overrides manage_renameObject() to have hooks to reindex the new object path
Security warning: “Copy or Move” permission is needed on the object by the logged in user.
New id must be a 8-bit string, not unicode. The system might accept values in invalid format.
Example how to rename object lc to have -old suffix:
id = lc.getId() if not lc.cb parent = lc.aq_parent parent.manage_renameObject(id, id + "-old")
These checks performed before rename by the manage_renameObject():
if not lc.cb_userHasCopyOrMovePermission(): print "Does not have needed permission" return if not lc.cb_isMoveable(): # This makes sanity checks whether the object is # properly connected to the database print "Object problem" return
Testing warning: Rename mechanism relies of Persistent attribute called _p_jar to be present on the content object. By default, this is not the case on unit tests. You need to call transaction.savepoint() to make _p_jar appear on persistent objects.
If you don’t do this, you’ll receive a “CopyError” when calling manage_renameObjects that the operation is not supported.
Unit testing example:
import transaction self.portal.invokeFactory("Document", doc") doc = self.portal.doc # Make sure all persistent objects have _p_jar attribute transaction.savepoint(optimistic=True) # Call manage_renameCode()...