def onObjectMoved(ob, event): """ Reindex paths only, don't update metadata. """ if not (IObjectAddedEvent.providedBy(event) or IObjectRemovedEvent.providedBy(event)): notify(IndexingEvent(ob, 'path', False))
def movedCustomUser(ob, event): """A CustomUser was moved. """ if not IObjectRemovedEvent.providedBy(event): return if not IObjectAddedEvent.providedBy(event): removedCustomUser(ob, event)
def onObjectMoved(ob, event): """ Reindex paths only """ if not (IObjectAddedEvent.providedBy(event) or IObjectRemovedEvent.providedBy(event)): notify(IndexingEvent(ob, idxs='path', triggered_by_zope_event=True))
def test_events(self): from OFS.interfaces import IObjectWillBeAddedEvent from zope.component import adapter from zope.component import provideHandler from zope.container.interfaces import IContainerModifiedEvent from zope.container.interfaces import IObjectAddedEvent from zope.lifecycleevent.interfaces import IObjectCreatedEvent events = [] @adapter(IObjectCreatedEvent) def _handleObjectCreated(event): events.append(event) provideHandler(_handleObjectCreated) @adapter(IObjectWillBeAddedEvent) def _handleObjectWillBeAdded(event): events.append(event) provideHandler(_handleObjectWillBeAdded) @adapter(IObjectAddedEvent) def _handleObjectAdded(event): events.append(event) provideHandler(_handleObjectAdded) @adapter(IContainerModifiedEvent) def _handleContainerModified(event): events.append(event) provideHandler(_handleContainerModified) self.ti.constructInstance(self.f, 'foo') self.assertEqual(len(events), 4) evt = events[0] self.assertTrue(IObjectCreatedEvent.providedBy(evt)) self.assertEqual(evt.object, self.f.foo) evt = events[1] self.assertTrue(IObjectWillBeAddedEvent.providedBy(evt)) self.assertEqual(evt.object, self.f.foo) self.assertEqual(evt.oldParent, None) self.assertEqual(evt.oldName, None) self.assertEqual(evt.newParent, self.f) self.assertEqual(evt.newName, 'foo') evt = events[2] self.assertTrue(IObjectAddedEvent.providedBy(evt)) self.assertEqual(evt.object, self.f.foo) self.assertEqual(evt.oldParent, None) self.assertEqual(evt.oldName, None) self.assertEqual(evt.newParent, self.f) self.assertEqual(evt.newName, 'foo') evt = events[3] self.assertTrue(IContainerModifiedEvent.providedBy(evt)) self.assertEqual(evt.object, self.f)
def log_move(content, event): if content is event.object: if not (IObjectAddedEvent.providedBy(event) or IObjectRemovedEvent.providedBy(event)): detail = 'from %s/%s to %s/%s' % ( get_path(event.oldParent), event.oldName, get_path(event.newParent), event.newName) LoggingEvent('move', content, detail).log()
def movedFile(ob, event): """A File was moved in the storage. """ if not IObjectRemovedEvent.providedBy(event): #raise NotImplementedError # we don't support moving return if not IObjectAddedEvent.providedBy(event): removedFile(ob, event)
def reconfigureChildRegistry(context, event): """ Upon moving or renaming an object, the registry must be reconfigured. Under the hood, this will re-register compoents with the correct paths to prevent errors. """ # Ignore removal, and we already catch added events above if not IObjectRemovedEvent.providedBy(event) \ and not IObjectAddedEvent.providedBy(event): enableChildRegistry(context, event)
def test_events(self): from OFS.interfaces import IObjectWillBeAddedEvent from zope.component import adapter from zope.component import provideHandler from zope.container.interfaces import IContainerModifiedEvent from zope.container.interfaces import IObjectAddedEvent from zope.lifecycleevent.interfaces import IObjectCreatedEvent events = [] @adapter(IObjectCreatedEvent) def _handleObjectCreated(event): events.append(event) provideHandler(_handleObjectCreated) @adapter(IObjectWillBeAddedEvent) def _handleObjectWillBeAdded(event): events.append(event) provideHandler(_handleObjectWillBeAdded) @adapter(IObjectAddedEvent) def _handleObjectAdded(event): events.append(event) provideHandler(_handleObjectAdded) @adapter(IContainerModifiedEvent) def _handleContainerModified(event): events.append(event) provideHandler(_handleContainerModified) self.ti.constructInstance(self.f, 'foo') self.assertEquals(len(events), 4) evt = events[0] self.failUnless(IObjectCreatedEvent.providedBy(evt)) self.assertEquals(evt.object, self.f.foo) evt = events[1] self.failUnless(IObjectWillBeAddedEvent.providedBy(evt)) self.assertEquals(evt.object, self.f.foo) self.assertEquals(evt.oldParent, None) self.assertEquals(evt.oldName, None) self.assertEquals(evt.newParent, self.f) self.assertEquals(evt.newName, 'foo') evt = events[2] self.failUnless(IObjectAddedEvent.providedBy(evt)) self.assertEquals(evt.object, self.f.foo) self.assertEquals(evt.oldParent, None) self.assertEquals(evt.oldName, None) self.assertEquals(evt.newParent, self.f) self.assertEquals(evt.newName, 'foo') evt = events[3] self.failUnless(IContainerModifiedEvent.providedBy(evt)) self.assertEquals(evt.object, self.f)
def handleOpaqueItemEvent(ob, event): """ Event subscriber for (ICallableOpaqueItemEvents, IObjectEvent) events. """ if IObjectAddedEvent.providedBy(event): if event.newParent is not None: ob.manage_afterAdd(ob, event.newParent) elif IObjectClonedEvent.providedBy(event): ob.manage_afterClone(ob) elif IObjectMovedEvent.providedBy(event): if event.newParent is not None: ob.manage_afterAdd(ob, event.newParent) elif IObjectWillBeMovedEvent.providedBy(event): if event.oldParent is not None: ob.manage_beforeDelete(ob, event.oldParent)
def content_moved(content, event): # We only do if the object is the target of the event. if event.object is not content: return # Don't create a link if it's an add or remove event. if IObjectRemovedEvent.providedBy(event) or \ IObjectAddedEvent.providedBy(event): return # The content might not want redirect link. if INoPermanentRedirectLink.providedBy(content): return # The extension is not activated. if not content.service_extensions.is_installed("silva.app.redirectlink"): return container = event.oldParent factory = container.manage_addProduct['silva.app.redirectlink'] factory.manage_addPermanentRedirectLink(event.oldName, content.get_title()) link = getattr(container, event.oldName) link.set_target(content) binding = getUtility(IMetadataService).getMetadata(link) binding.setValues('silva-settings', {'hide_from_tocs': 'hide'})
def handleUidAnnotationEvent(ob, event): """ Event subscriber for (IContentish, IObjectEvent) events """ if IObjectAddedEvent.providedBy(event): if event.newParent is not None: anno_tool = queryUtility(IUniqueIdAnnotationManagement) uid_handler = getToolByName(ob, 'portal_uidhandler', None) if anno_tool is not None: remove_on_add = anno_tool.getProperty('remove_on_add', False) remove_on_clone = anno_tool.getProperty( 'remove_on_clone', False) assign_on_add = anno_tool.getProperty('assign_on_add', False) if (remove_on_add and remove_on_clone) or assign_on_add: try: uid_handler.unregister(ob) except UniqueIdError: # did not have one pass if assign_on_add: # assign new uid uid_handler.register(ob) elif IObjectClonedEvent.providedBy(event): anno_tool = queryUtility(IUniqueIdAnnotationManagement) uid_handler = getToolByName(ob, 'portal_uidhandler', None) if anno_tool is not None: remove_on_clone = anno_tool.getProperty('remove_on_clone', False) assign_on_clone = anno_tool.getProperty('assign_on_clone', False) if remove_on_clone or assign_on_clone: try: uid_handler.unregister(ob) except UniqueIdError: # did not have one pass if assign_on_clone: # assign new uid uid_handler.register(ob)
def handleContentishEvent(ob, event): """ Event subscriber for (IContentish, IObjectEvent) events. """ if IObjectAddedEvent.providedBy(event): ob.notifyWorkflowCreated() ob.indexObject() elif IObjectMovedEvent.providedBy(event): if event.newParent is not None: ob.indexObject() elif IObjectWillBeMovedEvent.providedBy(event): if event.oldParent is not None: ob.unindexObject() elif IObjectCopiedEvent.providedBy(event): if hasattr(aq_base(ob), 'workflow_history'): del ob.workflow_history elif IObjectCreatedEvent.providedBy(event): if hasattr(aq_base(ob), 'addCreator'): ob.addCreator()
def handleUidAnnotationEvent(ob, event): """ Event subscriber for (IContentish, IObjectEvent) events """ if IObjectAddedEvent.providedBy(event): if event.newParent is not None: anno_tool = queryUtility(IUniqueIdAnnotationManagement) uidtool = queryUtility(IUniqueIdHandler) if anno_tool is not None: remove_on_add = anno_tool.getProperty('remove_on_add', False) remove_on_clone = anno_tool.getProperty('remove_on_clone', False) assign_on_add = anno_tool.getProperty('assign_on_add', False) if (remove_on_add and remove_on_clone) or assign_on_add: try: uidtool.unregister(ob) except UniqueIdError: # did not have one pass if assign_on_add: # assign new uid uidtool.register(ob) elif IObjectClonedEvent.providedBy(event): anno_tool = queryUtility(IUniqueIdAnnotationManagement) uidtool = queryUtility(IUniqueIdHandler) if anno_tool is not None: remove_on_clone = anno_tool.getProperty('remove_on_clone', False) assign_on_clone = anno_tool.getProperty('assign_on_clone', False) if remove_on_clone or assign_on_clone: try: uidtool.unregister(ob) except UniqueIdError: # did not have one pass if assign_on_clone: # assign new uid uidtool.register(ob)
def handleContentishEvent(ob, event): """ Event subscriber for (IContentish, IObjectEvent) events. """ if IObjectAddedEvent.providedBy(event): ob.notifyWorkflowCreated() ob.indexObject() elif IObjectMovedEvent.providedBy(event): if event.newParent is not None: if hasattr(aq_base(ob), 'notifyModified'): ob.notifyModified() rid = getattr(ob, '__rid', None) if rid: catalog = api.portal.get_tool('portal_catalog') _catalog = catalog._catalog new_path = '/'.join(ob.getPhysicalPath()) old_path = _catalog.paths[rid] del _catalog.uids[old_path] _catalog.uids[new_path] = rid _catalog.paths[rid] = new_path ob.reindexObject(idxs=[ 'path', 'allowedRolesAndUsers', 'modified', 'id', 'getId' ]) delattr(ob, '__rid') elif event.newParent is not None: # This may happen if "collective.indexing" is installed and an object # is added and renamed/moved in the same transaction (e.g. during the # creation of an object with "plone.api" in a subscriber listening # on "IObjectAddedEvent" as in https://github.com/4teamwork/ftw.events/blob/f1a77440866c6d963961497f68781098c1b4bc8f/ftw/events/configure.zcml#L22). ob.indexObject() elif IObjectWillBeMovedEvent.providedBy(event): from ftw.copymovepatches.utils import getQueue # Prepare Rename if indexing queue is implemented if event.oldParent == event.newParent and getQueue is not None: # The queue needs to be processed, since the `renameObjectsByPaths` # script allows the user to rename the object and also sets a new # title if he wants. # In some circumstances this leads to a inconsistent catalog state. # Mainly if other event handler also triggers a `process` queue by # asking the catalog for something. # The result was for example a "reindex" of a already deleted # object. queue = getQueue() queue.process() # Move/Rename if event.oldParent is not None and event.newParent is not None: catalog = api.portal.get_tool('portal_catalog') ob_path = '/'.join(ob.getPhysicalPath()) if ob_path in catalog._catalog.uids: rid = catalog._catalog.uids[ob_path] setattr(ob, '__rid', rid) else: # This may happen if "collective.indexing" is installed and an object # is added and renamed/moved in the same transaction (e.g. during the # creation of an object with "plone.api" in a subscriber listening # on "IObjectAddedEvent" as in https://github.com/4teamwork/ftw.events/blob/f1a77440866c6d963961497f68781098c1b4bc8f/ftw/events/configure.zcml#L22). return elif event.oldParent is not None: # Delete ob.unindexObject() elif IObjectCopiedEvent.providedBy(event): if hasattr(aq_base(ob), 'workflow_history'): del ob.workflow_history elif IObjectCreatedEvent.providedBy(event): if hasattr(aq_base(ob), 'addCreator'): ob.addCreator()