Renaming content¶
Description
How to programmatically rename Plone content items
Introduction¶
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
Renaming objects¶
OFS interface has facilities to rename objects
- http://svn.zope.org/Zope/trunk/src/OFS/interfaces.py?rev=105745&view=auto
-
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
Warning
Security warning: "Copy or Move" permission is needed on the object by the logged in user.
Warning
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
Warning
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()...