在Plone中,如何修复缺少cmf_uid()注释的Archetypes内容?

时间:2015-04-28 18:03:59

标签: plone

我正在使用带有relstorage的Plone 4.3,并且我已经设法在某些内容对象上丢失了cmf_uid注释。这可以防止collective.iterate检入内容。是否有一种简单的方法让Plone遍历数据库并重新添加cmf_uid缺少的地方?已经尝试collective.catalogcleanup无济于事。

1 个答案:

答案 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"