diff --git a/product/CMFActivity/ActivityTool.py b/product/CMFActivity/ActivityTool.py index 8491308821a67c80a57301ba6f049feaee4cc5c8..164a1a58b80dd507008e474b00a184ada6d3719e 100644 --- a/product/CMFActivity/ActivityTool.py +++ b/product/CMFActivity/ActivityTool.py @@ -558,41 +558,43 @@ class ActivityTool (Folder, UniqueObject): if not acquired: return - old_sm = getSecurityManager() try: + old_sm = getSecurityManager() try: - # get owner of portal_catalog, so normally we should be able to - # have the permission to invoke all activities - user = self.portal_catalog.getWrappedOwner() - newSecurityManager(self.REQUEST, user) - - currentNode = self.getCurrentNode() - self.registerNode(currentNode) - processing_node_list = self.getNodeList(role=ROLE_PROCESSING) - - # only distribute when we are the distributingNode or if it's empty - if (self.getDistributingNode() == currentNode): - self.distribute(len(processing_node_list)) - - # SkinsTool uses a REQUEST cache to store skin objects, as - # with TimerService we have the same REQUEST over multiple - # portals, we clear this cache to make sure the cache doesn't - # contains skins from another portal. - stool = getToolByName(self, 'portal_skins', None) - if stool is not None: - stool.changeSkin(None) - - # call tic for the current processing_node - # the processing_node numbers are the indices of the elements in the node tuple +1 - # because processing_node starts form 1 - if currentNode in processing_node_list: - self.tic(processing_node_list.index(currentNode)+1) - except: - # Catch ALL exception to avoid killing timerserver. - LOG('ActivityTool', ERROR, 'process_timer received an exception', error=sys.exc_info()) + try: + # get owner of portal_catalog, so normally we should be able to + # have the permission to invoke all activities + user = self.portal_catalog.getWrappedOwner() + newSecurityManager(self.REQUEST, user) + + currentNode = self.getCurrentNode() + self.registerNode(currentNode) + processing_node_list = self.getNodeList(role=ROLE_PROCESSING) + + # only distribute when we are the distributingNode or if it's empty + if (self.getDistributingNode() == currentNode): + self.distribute(len(processing_node_list)) + + # SkinsTool uses a REQUEST cache to store skin objects, as + # with TimerService we have the same REQUEST over multiple + # portals, we clear this cache to make sure the cache doesn't + # contains skins from another portal. + stool = getToolByName(self, 'portal_skins', None) + if stool is not None: + stool.changeSkin(None) + + # call tic for the current processing_node + # the processing_node numbers are the indices of the elements in the node tuple +1 + # because processing_node starts form 1 + if currentNode in processing_node_list: + self.tic(processing_node_list.index(currentNode)+1) + except: + # Catch ALL exception to avoid killing timerserver. + LOG('ActivityTool', ERROR, 'process_timer received an exception', error=sys.exc_info()) + finally: + setSecurityManager(old_sm) finally: timerservice_lock.release() - setSecurityManager(old_sm) security.declarePublic('distribute') def distribute(self, node_count=1):