1
我正在使用Plone 4.3與relstorage,我設法在我的一些內容對象上丟失了cmf_uid
註解。這可以防止collective.iterate
能夠檢入內容。是否有一種簡單的方法讓Plone遍歷數據庫並重新添加cmf_uid
缺失的地方?已經嘗試collective.catalogcleanup
無濟於事。在Plone中,如何修復缺少cmf_uid()註釋的Archetypes內容?
我正在使用Plone 4.3與relstorage,我設法在我的一些內容對象上丟失了cmf_uid
註解。這可以防止collective.iterate
能夠檢入內容。是否有一種簡單的方法讓Plone遍歷數據庫並重新添加cmf_uid
缺失的地方?已經嘗試collective.catalogcleanup
無濟於事。在Plone中,如何修復缺少cmf_uid()註釋的Archetypes內容?
這是一個腳本,用於搜索門戶網站(傳遞爲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"