[1005] | 1 | from Acquisition import aq_base |
---|
| 2 | from Products.CMFCore.utils import getToolByName |
---|
| 3 | from Products.ZCatalog.ProgressHandler import ZLogHandler |
---|
| 4 | from plone.app.linkintegrity.handlers import referencedRelationship as li_relation |
---|
| 5 | |
---|
| 6 | portal_catalog = None |
---|
| 7 | portal_repository = None |
---|
| 8 | uid_catalog = None |
---|
| 9 | reference_catalog = None |
---|
| 10 | |
---|
| 11 | def fix_archivest(ob): |
---|
| 12 | ''' Fix #7334 bug of CMFEdition. |
---|
| 13 | Fixed in CMFEdition v1.1.5+ |
---|
| 14 | ''' |
---|
| 15 | if portal_repository.isVersionable(ob): |
---|
| 16 | portal_repository.save(obj=ob, comment="") |
---|
| 17 | |
---|
| 18 | def fix_catalog(ob): |
---|
| 19 | ob.reindexObject() |
---|
| 20 | |
---|
| 21 | def fix_linkintegrity(ob): |
---|
| 22 | """Fix losed references.""" |
---|
| 23 | uobject = aq_base(ob) |
---|
| 24 | if reference_catalog.isReferenceable(uobject): |
---|
| 25 | ob_li_refs = reference_catalog.getReferences(ob, relationship=li_relation) |
---|
| 26 | if ob_li_refs: |
---|
| 27 | annotations = ob._getReferenceAnnotations() |
---|
| 28 | uniqueUIDs = uid_catalog.uniqueValuesFor('UID') |
---|
| 29 | # delete references to non-existent objects |
---|
| 30 | [annotations._delObject(ref.id) for ref in ob_li_refs \ |
---|
| 31 | if not ref.targetUID in uniqueUIDs] |
---|
| 32 | |
---|
| 33 | def fix_all(ob): |
---|
| 34 | """ Recursive function for perform registered |
---|
| 35 | actions for all internal objects |
---|
| 36 | """ |
---|
| 37 | [a(ob) for a in perobject_actions] |
---|
| 38 | |
---|
| 39 | if getattr(ob, 'is_folderish', None): |
---|
| 40 | [fix_all(o) for o in ob.objectValues()] |
---|
| 41 | |
---|
| 42 | perobject_actions = [fix_archivest, fix_catalog, fix_linkintegrity] |
---|
| 43 | |
---|
| 44 | def fix(context): |
---|
| 45 | ''' Main fix function: fix defects of importing: |
---|
| 46 | imported objects - absence in catalogs, some other issues''' |
---|
| 47 | global portal_repository, portal_catalog |
---|
| 48 | global uid_catalog, reference_catalog |
---|
| 49 | portal_catalog = getToolByName(context,'portal_catalog') |
---|
| 50 | portal_repository = getToolByName(context,'portal_repository') |
---|
| 51 | uid_catalog = getToolByName(context,'uid_catalog') |
---|
| 52 | reference_catalog = getToolByName(context,'reference_catalog') |
---|
| 53 | |
---|
| 54 | fix_all(context) |
---|