2015-04-28 52 views

回答

2

這是一個腳本,用於搜索門戶網站(傳遞爲context)的任何Document,它具有非唯一cmf_uid。其中許多文件實際上沒有cmf_uid,但索引cmf_uid實際上是通過Acquisition來自父文件夾。由於問題的表現是plone.app.iterate無法在Document中檢查,因此該腳本會添加一個唯一的cmf_uidDocument類型,該類型似乎具有非唯一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"