我正在使用带有relstorage的Plone 4.3,并且我已经设法在某些内容对象上丢失了cmf_uid
注释。这可以防止collective.iterate
检入内容。是否有一种简单的方法让Plone遍历数据库并重新添加cmf_uid
缺少的地方?已经尝试collective.catalogcleanup
无济于事。
答案 0 :(得分:2)
以下是一个脚本,用于搜索具有非唯一context
的任何Document
的门户网站(作为cmf_uid
传递)。其中许多文档实际上没有cmf_uid
,但索引cmf_uid
实际上来自父文件夹Acquisition
。由于问题的表现是plone.app.iterate
无法检入Document
,因此该脚本仅向cmf_uid
类型添加了一个唯一的Document
类型,这些类型似乎具有非唯一性cmf_uid
但实际上没有cmf_uid
。
虽然这会将cmf_uid
添加到所有Document
,但仅将属性添加到结帐中当前正在编辑的文档可能就足够了。
"""
Add missing cmf_uid to Archetypes content.
cmf_uid is required to check in working copies of content.
"""
from Products.CMFUid.UniqueIdHandlerTool import UniqueIdError
from Acquisition import aq_inner
from collections import Counter
def add_missing_uids(context):
"""
context: the portal
"""
portal_uidhandler = context.portal_uidhandler
portal_uidgenerator = context.portal_uidgenerator
catalog = context.portal_catalog
brains = catalog.unrestrictedSearchResults()
freq = Counter(x.cmf_uid for x in brains)
for brain in brains:
# If it's only in use once then it's unique enough. Otherwise it's
# probably inheriting its indexed cmf_uid via Acquisition.
if freq[brain.cmf_uid] < 2 or brain.portal_type != 'Document':
continue
ob = aq_inner(brain.getObject())
if not portal_uidhandler.queryUid(ob):
print brain.Type, brain.portal_type, brain.getPath()
for i in range(3):
try:
portal_uidhandler.setUid(ob, portal_uidgenerator())
ob.reindexObject()
ob.reindexObject(idxs=['modified'])
break
except UniqueIdError:
print "RETRY"
else:
print "FAIL"