def get_content_links(obj): refs = set() if ILayoutAware.providedBy(obj): behavior_data = ILayoutAware(obj) # get data from tile data annotations = IAnnotations(obj) for key in annotations.keys(): if key.startswith(ANNOTATIONS_KEY_PREFIX): data = annotations[key] refs |= get_tile_data_links(obj, data) if not behavior_data.contentLayout and behavior_data.content: dom = fromstring(behavior_data.content) for el in dom.cssselect('.mosaic-text-tile .mosaic-tile-content'): links = extractLinks(tostring(el)) refs |= li.getObjectsFromLinks(obj, links) try: # scan more than just this we probably should... value = obj.text.raw links = extractLinks(value) refs |= li.getObjectsFromLinks(obj, links) except AttributeError: pass if getattr(obj, 'image'): if IReferenceNamedImage.providedBy(obj.image): sub_obj = uuidToObject(obj.image.reference) if sub_obj: objid = get_ref(obj) if objid: refs.add(RelationValue(objid)) return refs
def modifiedCoverTile(obj, event): """Ensure link integrity on Rich Text tiles. Keyword arguments: obj -- Dexterity-based object that was modified event -- event fired """ pu = api.portal.get_tool('portal_url') if pu is None: # `getObjectFromLinks` is not possible without access # to `portal_url` return rc = api.portal.get_tool('reference_catalog') if rc is None: # `updateReferences` is not possible without access # to `reference_catalog` return referenceable_parent = IReferenceable(obj.context, None) if referenceable_parent is None: # `updateReferences` is not possible # if parent object isn't referenceable return refs = set() for name, value in obj.data.items(): if isinstance(value, RichTextValue): value = value.raw if not value: continue links = extractLinks(value) refs |= getObjectsFromLinks(obj.context, links) updateReferences(IReferenceable(obj.context), referencedRelationship, refs)
def get_referenced_objects(self): """Get referenced objects from cover object. :returns: a set of objects referenced :rtype: set of objects """ refs = set() for tile_uuid in self.list_tiles(): tile = self.get_tile(tile_uuid) uuid = tile.data.get('uuid', None) if uuid is not None: refs |= set([uuidToObject(uuid)]) if IListTile.providedBy(tile): uuids = tile.data.get('uuids', []) if uuids is None: continue for uuid in uuids: refs |= set([uuidToObject(uuid)]) elif IRichTextTile.providedBy(tile): value = tile.data.get('text') if value is None: continue value = value.raw links = extractLinks(value) refs |= getObjectsFromLinks(self, links) return refs
def modifiedDexterity(obj, event): """ a dexterity based object was modified """ if not check_linkintegrity_dependencies(obj): return retriever = IRetriever(obj, None) if retriever is not None: links = retriever.retrieveLinks() refs = getObjectsFromLinks(obj, links) refs |= getSnippetRefs(obj) updateReferences(obj, refs)
def get_tile_data_links(obj, data): refs = set() if type(data) in (dict, PersistentMapping, PersistentDict): for field_name in ('content', 'video', 'image', 'images', 'audio'): val = data.get(field_name) if isinstance(val, basestring): links = extractLinks(val) refs |= li.getObjectsFromLinks(obj, links) elif isinstance(val, list): # could be list of uids refs |= get_refs_from_uids(val) return refs
def modifiedDexterity(obj, event): """ a dexterity based object was modified """ if not check_linkintegrity_dependencies(obj): return retriever = IRetriever(obj, None) if retriever is not None: links = retriever.retrieveLinks() refs = getObjectsFromLinks(obj, links) refs |= getSnippetRefs(obj) updateReferences(obj, refs) # now, check if THIS object is referenced by others and give user warning if there # are now missing headers that are referenced checkSnippetReferences(obj)