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

在Plone中,如何修复缺少cmf_uid()注释的原型内容?,plone,Plone,我正在使用Plone 4.3和relstorage,不知何故,我设法丢失了一些内容对象上的cmf\u uid注释。这会阻止collective.iterate签入内容。有没有一种简单的方法让Plone遍历数据库并在缺少的地方重新添加cmf\u uid?已尝试collective.catalogcleanup但无效。以下是一个脚本,用于搜索门户(作为context传递)中包含非唯一cmf\u uid的任何文档。许多文档实际上没有cmf\u-uid,但索引的cmf\u-uid实际上通过采集来自父文件

我正在使用Plone 4.3和relstorage,不知何故,我设法丢失了一些内容对象上的
cmf\u uid
注释。这会阻止
collective.iterate
签入内容。有没有一种简单的方法让Plone遍历数据库并在缺少的地方重新添加
cmf\u uid
?已尝试
collective.catalogcleanup
但无效。

以下是一个脚本,用于搜索门户(作为
context
传递)中包含非唯一
cmf\u uid
的任何
文档。许多文档实际上没有
cmf\u-uid
,但索引的
cmf\u-uid
实际上通过
采集
来自父文件夹。由于问题的表现形式是
plone.app.iterate
无法签入
Document
,因此脚本将唯一的
cmf\u uid
添加到仅具有非唯一
cmf\u uid
但实际上没有
cmf\u uid
文档类型中

尽管这会将
cmf\u 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"
“”“
将缺少的cmf_uid添加到原型内容。
cmf_uid需要签入内容的工作副本。
"""
从Products.CMFUid.UniqueIdHandlerTool导入UniqueIdError
从收购进口aq_内部
从收款进口柜台
def添加缺少的UID(上下文):
"""
上下文:门户
"""
portal\u uidhandler=context.portal\u uidhandler
portal_-uidgenerator=context.portal_-uidgenerator
catalog=context.portal\u目录
brains=catalog.unrestrictedSearchResults()
freq=计数器(x.cmf\u uid表示大脑中的x)
对于大脑中的大脑:
#如果它只使用一次,那么它就足够独特了。否则就是
#可能是通过采集继承其索引cmf_uid。
如果freq[brain.cmf\u uid]<2或brain.portal\u type!='文件':
持续
ob=aq_inner(brain.getObject())
如果不是门户\u uidhandler.queryUid(ob):
打印brain.Type,brain.portal\u Type,brain.getPath()
对于范围(3)中的i:
尝试:
portal\u uidhandler.setUid(ob,portal\u uidgenerator())
ob.reindexObject()
ob.reindexObject(idxs=['modified'])
打破
除唯一错误外:
打印“重试”
其他:
打印“失败”