def testCopyEvents(self): cp = self.reflecto.manage_copyObjects(('foo',)) self.reflecto.manage_pasteObjects(cp) events = getEvents() self.assertEqual(len(events), 3) self.assertTrue(IObjectCopiedEvent.providedBy(events[0])) self.assertEqual(events[0].original.getId(), 'foo') self.assertEqual(events[0].object.getId(), 'copy_of_foo') self.assertTrue(IObjectClonedEvent.providedBy(events[1])) self.assertEqual(events[1].object.getId(), 'copy_of_foo') self.assertTrue(IContainerModifiedEvent.providedBy(events[2])) self.assertTrue(events[2].object is self.reflecto)
def testCopyEvents(self): cp = self.reflecto.manage_copyObjects(('foo', )) self.reflecto.manage_pasteObjects(cp) events = getEvents() self.assertEqual(len(events), 3) self.assertTrue(IObjectCopiedEvent.providedBy(events[0])) self.assertEqual(events[0].original.getId(), 'foo') self.assertEqual(events[0].object.getId(), 'copy_of_foo') self.assertTrue(IObjectClonedEvent.providedBy(events[1])) self.assertEqual(events[1].object.getId(), 'copy_of_foo') self.assertTrue(IContainerModifiedEvent.providedBy(events[2])) self.assertTrue(events[2].object is self.reflecto)
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 handleContentishEvent(ob, event): """ Event subscriber for (IContentish, IObjectEvent) events. """ if IObjectAddedEvent.providedBy(event): if event.newParent is not None: ob.indexObject() elif IObjectClonedEvent.providedBy(event): ob.notifyWorkflowCreated() elif IObjectMovedEvent.providedBy(event): if event.newParent is not None: ob.indexObject() elif IObjectWillBeMovedEvent.providedBy(event): if event.oldParent is not None: ob.unindexObject()
def handleUidAnnotationEvent(ob, event): """ Event subscriber for (IUniqueIdAnnotation, 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 handleUidAnnotationEvent(ob, event): """ Event subscriber for (IUniqueIdAnnotation, 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 __call__(self): req = getRequest() if req.environ.get('disable.auditlog', False): return True event = self.event obj = event.object # order of those checks is important since some interfaces # base off the others rule = inspect.stack()[1][0].f_locals.get('self', None) registry = getUtility(IRegistry) trackWorkingCopies = registry['collective.auditlog.interfaces.IAuditLogSettings.trackworkingcopies'] # noqa if not self.canExecute(rule, req): return True # cut out early, we can't do this event data = { 'info': '' } if IPloneFormGenField.providedBy(obj): # if ploneformgen field, use parent object for modified data data['field'] = obj.getId() obj = aq_parent(obj) # the order of those interface checks matters since some interfaces # inherit from others if IObjectRemovedEvent.providedBy(event): # need to keep track of removed events so it doesn't get called # more than once for each object action = 'removed' elif (IObjectInitializedEvent.providedBy(event) or IObjectCreatedEvent.providedBy(event) or IObjectAddedEvent.providedBy(event)): action = 'added' elif IObjectMovedEvent.providedBy(event): # moves can also be renames. Check the parent object if event.oldParent == event.newParent: if rule is None or 'Rename' in rule.rule.title: info = {'previous_id': event.oldName} data['info'] = json.dumps(info) action = 'rename' else: # cut out here, double action for this event return True else: if rule is None or 'Moved' in rule.rule.title: parent_path = '/'.join(event.oldParent.getPhysicalPath()) previous_location = parent_path + '/' + event.oldName info = {'previous_location': previous_location} data['info'] = json.dumps(info) action = 'moved' else: # step out immediately since this could be a double action return True elif IObjectModifiedEvent.providedBy(event): action = 'modified' elif IActionSucceededEvent.providedBy(event): info = {'transition': event.action, 'comments': self.get_history_comment()} data['info'] = json.dumps(info) action = 'workflow' elif IObjectClonedEvent.providedBy(event): action = 'copied' elif ICheckinEvent.providedBy(event): info = {'message': event.message} data['info'] = json.dumps(info) action = 'checked in' req.environ['disable.auditlog'] = True data['working_copy'] = '/'.join(obj.getPhysicalPath()) obj = event.baseline elif IBeforeCheckoutEvent.providedBy(event): action = 'checked out' req.environ['disable.auditlog'] = True elif ICancelCheckoutEvent.providedBy(event): action = 'cancel check out' req.environ['disable.auditlog'] = True data['working_copy'] = '/'.join(obj.getPhysicalPath()) obj = event.baseline elif IUserLoggedInEvent.providedBy(event): action = 'logged in' info = {'user': event.object.getUserName()} data['info'] = json.dumps(info) elif IUserLoggedOutEvent.providedBy(event): action = 'logged out' else: logger.warn('no action matched') return True if IWorkingCopy.providedBy(obj): # if working copy, iterate, check if Track Working Copies is # enabled if trackWorkingCopies: # if enabled in control panel, use original object and move # working copy path to working_copy data['working_copy'] = '/'.join(obj.getPhysicalPath()) relationships = obj.getReferences( WorkingCopyRelation.relationship) # check relationships, if none, something is wrong, not logging # action if len(relationships) > 0: obj = relationships[0] else: return True else: # if not enabled, we only care about checked messages if 'check' not in action: return True data.update(getObjectInfo(obj)) data['action'] = action addLogEntry(obj, data) return True
def getLogEntry(self): ''' Get's a log entry for your action ''' event = self.event obj = event.object data = {'info': ''} # order of those checks is important since some interfaces # base off the others if IPloneFormGenField.providedBy(obj): # if ploneformgen field, use parent object for modified data data['field'] = obj.getId() obj = aq_parent(obj) # the order of those interface checks matters since some interfaces # inherit from others if IObjectRemovedEvent.providedBy(event): # need to keep track of removed events so it doesn't get called # more than once for each object action = 'removed' elif (IObjectInitializedEvent.providedBy(event) or IObjectCreatedEvent.providedBy(event) or IObjectAddedEvent.providedBy(event)): action = 'added' elif IObjectMovedEvent.providedBy(event): # moves can also be renames. Check the parent object if event.oldParent == event.newParent: if 'Rename' not in self.rule.rule.title: # cut out here, double action for this event return {} data['info'] = 'previous id: %s' % event.oldName action = 'rename' else: if 'Moved' not in self.rule.rule.title: # step out immediately since this could be a double action return {} data['info'] = 'previous location: %s/%s' % ( '/'.join(event.oldParent.getPhysicalPath()), event.oldName, ) action = 'moved' elif IObjectModifiedEvent.providedBy(event): action = 'modified' elif IActionSucceededEvent.providedBy(event): data['info'] = 'workflow transition: %s; comments: %s' % ( event.action, self.get_history_comment(), ) action = 'workflow' elif IObjectClonedEvent.providedBy(event): action = 'copied' elif ICheckinEvent.providedBy(event): data['info'] = event.message action = 'checked in' self.request.environ['disable.auditlog'] = True data['working_copy'] = '/'.join(obj.getPhysicalPath()) obj = event.baseline elif IBeforeCheckoutEvent.providedBy(event): action = 'checked out' self.request.environ['disable.auditlog'] = True elif ICancelCheckoutEvent.providedBy(event): action = 'cancel check out' self.request.environ['disable.auditlog'] = True data['working_copy'] = '/'.join(obj.getPhysicalPath()) obj = event.baseline else: logger.warn('no action matched') return {} if IWorkingCopy.providedBy(obj): # if working copy, iterate, check if Track Working Copies is # enabled if not self.trackWorkingCopies: # if not enabled, we only care about checked messages if 'check' not in action: return {} # if enabled in control panel, use original object and move # working copy path to working_copy data['working_copy'] = '/'.join(obj.getPhysicalPath()) relationships = obj.getReferences(WorkingCopyRelation.relationship) # check relationships, if none, something is wrong, not logging # action if len(relationships) <= 0: return {} obj = relationships[0] data.update(self._getObjectInfo(obj)) data['action'] = action return data
def getLogEntry(self): ''' Get's a log entry for your action ''' event = self.event obj = event.object data = {'info': ''} # order of those checks is important since some interfaces # base off the others if IPloneFormGenField.providedBy(obj): # if ploneformgen field, use parent object for modified data data['field'] = obj.getId() obj = aq_parent(obj) # the order of those interface checks matters since some interfaces # inherit from others if IObjectRemovedEvent.providedBy(event): # need to keep track of removed events so it doesn't get called # more than once for each object action = 'removed' elif ( IObjectInitializedEvent.providedBy(event) or IObjectCreatedEvent.providedBy(event) or IObjectAddedEvent.providedBy(event) ): action = 'added' elif IObjectMovedEvent.providedBy(event): # moves can also be renames. Check the parent object if event.oldParent == event.newParent: if 'Rename' not in self.rule.rule.title: # cut out here, double action for this event return {} data['info'] = 'previous id: %s' % event.oldName action = 'rename' else: if 'Moved' not in self.rule.rule.title: # step out immediately since this could be a double action return {} data['info'] = 'previous location: %s/%s' % ( '/'.join(event.oldParent.getPhysicalPath()), event.oldName, ) action = 'moved' elif IObjectModifiedEvent.providedBy(event): action = 'modified' elif IActionSucceededEvent.providedBy(event): data['info'] = 'workflow transition: %s; comments: %s' % ( event.action, self.get_history_comment(), ) action = 'workflow' elif IObjectClonedEvent.providedBy(event): action = 'copied' elif ICheckinEvent.providedBy(event): data['info'] = event.message action = 'checked in' self.request.environ['disable.auditlog'] = True data['working_copy'] = '/'.join(obj.getPhysicalPath()) obj = event.baseline elif IBeforeCheckoutEvent.providedBy(event): action = 'checked out' self.request.environ['disable.auditlog'] = True elif ICancelCheckoutEvent.providedBy(event): action = 'cancel check out' self.request.environ['disable.auditlog'] = True data['working_copy'] = '/'.join(obj.getPhysicalPath()) obj = event.baseline else: logger.warn('no action matched') return {} if IWorkingCopy.providedBy(obj): # if working copy, iterate, check if Track Working Copies is # enabled if not self.trackWorkingCopies: # if not enabled, we only care about checked messages if 'check' not in action: return {} # if enabled in control panel, use original object and move # working copy path to working_copy data['working_copy'] = '/'.join(obj.getPhysicalPath()) relationships = obj.getReferences( WorkingCopyRelation.relationship) # check relationships, if none, something is wrong, not logging # action if len(relationships) <= 0: return {} obj = relationships[0] data.update(self._getObjectInfo(obj)) data['action'] = action return data