From: Godefroid C. <svn...@pl...> - 2011-08-31 10:39:35
|
Author: gotcha Date: Wed Aug 31 10:38:25 2011 New Revision: 51858 Modified: plone.app.linkintegrity/branches/gotcha-improve-reusability/plone/app/linkintegrity/handlers.py Log: chop into pieces to improve readability and reusability Modified: plone.app.linkintegrity/branches/gotcha-improve-reusability/plone/app/linkintegrity/handlers.py ============================================================================== --- plone.app.linkintegrity/branches/gotcha-improve-reusability/plone/app/linkintegrity/handlers.py (original) +++ plone.app.linkintegrity/branches/gotcha-improve-reusability/plone/app/linkintegrity/handlers.py Wed Aug 31 10:38:25 2011 @@ -49,11 +49,13 @@ scheme, host, path, query, frag = urlsplit(url) for link in links: s, h, path, q, f = urlsplit(link) - if (not s and not h) or (s == scheme and h == host): # relative or local url + # relative or local url + if (not s and not h) or (s == scheme and h == host): obj, extra = findObject(base, path) if obj: if IOFSImage.providedBy(obj): - obj = aq_parent(obj) # use atimage object for scaled images + # use atimage object for scaled images + obj = aq_parent(obj) objects.add(obj) return objects @@ -70,33 +72,41 @@ accessor = field.getAccessor(obj) links = extractLinks(accessor()) refs = refs.union(getObjectsFromLinks(obj, links)) - for ref in refs.difference(existing): # add new references and... + updateReferences(obj, referencedRelationship, refs, existing) + + +def updateReferences(obj, relationship, newrefs, existing): + for ref in newrefs.difference(existing): # add new references and... try: - obj.addReference(ref, relationship=referencedRelationship) + obj.addReference(ref, relationship=relationship) except ReferenceException: pass - for ref in existing.difference(refs): # removed leftovers + for ref in existing.difference(newrefs): # removed leftovers try: - obj.deleteReference(ref, relationship=referencedRelationship) + obj.deleteReference(ref, relationship=relationship) except ReferenceException: - try: - # try to get rid of the dangling reference, but let's not - # have this attempt to clean up break things otherwise... - # iow, the `try..except` is there, because internal methods - # of the reference catalog are being used directly here. any - # changes regarding these shouldn't break things over here, - # though... - refcat = getToolByName(obj, 'reference_catalog') - uid, dummy = refcat._uidFor(obj) - brains = refcat._queryFor(uid, None, relationship=referencedRelationship) - objs = refcat._resolveBrains(brains) - for obj in objs: - refcat._deleteReference(obj) - except ConflictError: - raise - except: - getLogger(__name__).warning('dangling "linkintegrity" ' - 'reference to %r could not be removed.', obj) + removeDanglingReference(obj, relationship) + + +def removeDanglingReference(obj, relationship): + # try to get rid of the dangling reference, but let's not + # have this attempt to clean up break things otherwise... + # iow, the `try..except` is there, because internal methods + # of the reference catalog are being used directly here. any + # changes regarding these shouldn't break things over here, + # though... + try: + refcat = getToolByName(obj, 'reference_catalog') + uid, dummy = refcat._uidFor(obj) + brains = refcat._queryFor(uid, None, relationship=relationship) + objs = refcat._resolveBrains(brains) + for obj in objs: + refcat._deleteReference(obj) + except ConflictError: + raise + except: + getLogger(__name__).warning('dangling "linkintegrity" ' + 'reference to %r could not be removed.', obj) def referenceRemoved(obj, event): @@ -112,9 +122,10 @@ if not request: return storage = ILinkIntegrityInfo(request) - breaches = storage.getIntegrityBreaches() - breaches.setdefault(obj.getTargetObject(), set()).add(obj.getSourceObject()) - storage.setIntegrityBreaches(breaches) + all_breaches = storage.getIntegrityBreaches() + obj_breaches = all_breaches.setdefault(obj.getTargetObject(), set()) + obj_breaches.add(obj.getSourceObject()) + storage.setIntegrityBreaches(all_breaches) def referencedObjectRemoved(obj, event): |