From 35311b335b426d05cd684dcd92df182c036d974e Mon Sep 17 00:00:00 2001 From: Yoshinori Okuji <yo@nexedi.com> Date: Fri, 23 Dec 2005 20:41:37 +0000 Subject: [PATCH] Keep active objects when clearing the tables. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@4877 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/CMFActivity/Activity/SQLDict.py | 10 +++ product/CMFActivity/Activity/SQLQueue.py | 10 +++ product/CMFActivity/ActivityTool.py | 61 +++++++++++++++---- .../activity/SQLDict_dumpMessageList.zsql | 14 +++++ .../activity/SQLQueue_dumpMessageList.zsql | 17 ++++++ product/CMFActivity/tests/.cvsignore | 2 + 6 files changed, 103 insertions(+), 11 deletions(-) create mode 100755 product/CMFActivity/skins/activity/SQLDict_dumpMessageList.zsql create mode 100755 product/CMFActivity/skins/activity/SQLQueue_dumpMessageList.zsql create mode 100755 product/CMFActivity/tests/.cvsignore diff --git a/product/CMFActivity/Activity/SQLDict.py b/product/CMFActivity/Activity/SQLDict.py index 0f01730855..e09a0e4994 100755 --- a/product/CMFActivity/Activity/SQLDict.py +++ b/product/CMFActivity/Activity/SQLDict.py @@ -428,6 +428,16 @@ class SQLDict(RAMDict): message_list.append(m) return message_list + def dumpMessageList(self, activity_tool): + # Dump all messages in the table. + message_list = [] + if hasattr(activity_tool, 'SQLDict_dumpMessageList'): + result = activity_tool.SQLDict_dumpMessageList() + for line in result: + m = self.loadMessage(line.message, uid = line.uid) + message_list.append(m) + return message_list + def distribute(self, activity_tool, node_count): processing_node = 1 if hasattr(activity_tool,'SQLDict_readMessageList'): diff --git a/product/CMFActivity/Activity/SQLQueue.py b/product/CMFActivity/Activity/SQLQueue.py index ba754d29ec..2261506bf7 100755 --- a/product/CMFActivity/Activity/SQLQueue.py +++ b/product/CMFActivity/Activity/SQLQueue.py @@ -212,6 +212,16 @@ class SQLQueue(RAMQueue): message_list.append(m) return message_list + def dumpMessageList(self, activity_tool): + # Dump all messages in the table. + message_list = [] + if hasattr(activity_tool, 'SQLQueue_dumpMessageList'): + result = activity_tool.SQLQueue_dumpMessageList() + for line in result: + m = self.loadMessage(line.message, uid = line.uid) + message_list.append(m) + return message_list + def distribute(self, activity_tool, node_count): processing_node = 1 if hasattr(activity_tool,'SQLQueue_readMessageList'): diff --git a/product/CMFActivity/ActivityTool.py b/product/CMFActivity/ActivityTool.py index 33620ab8f2..3829e092b2 100755 --- a/product/CMFActivity/ActivityTool.py +++ b/product/CMFActivity/ActivityTool.py @@ -47,7 +47,7 @@ import sys from ZODB.POSException import ConflictError from OFS.Traversable import NotFound -from zLOG import LOG, INFO +from zLOG import LOG, INFO, WARNING try: from Products.TimerService import getTimerService @@ -136,16 +136,18 @@ class Message: try: # LOG('WARNING ActivityTool', 0, # 'Trying to call method %s on object %s' % (self.method_id, self.object_path)) - object = self.getObject(activity_tool) + obj = self.getObject(activity_tool) # Change user if required (TO BE DONE) # We will change the user only in order to execute this method current_user = str(_getAuthenticatedUser(self)) user = self.changeUser(self.user_name, activity_tool) - result = getattr(object, self.method_id)(*self.args, **self.kw) - # Use again the previous user - if user is not None: - self.changeUser(current_user, activity_tool) - self.activateResult(activity_tool, result, object) + try: + result = getattr(obj, self.method_id)(*self.args, **self.kw) + finally: + # Use again the previous user + if user is not None: + self.changeUser(current_user, activity_tool) + self.activateResult(activity_tool, result, obj) self.is_executed = 1 except: self.is_executed = 0 @@ -176,6 +178,21 @@ Method: %s activity_tool.MailHost.send( mail_text ) #LOG('notifyUser send', 0, '') + def reactivate(self, activity_tool): + # Reactivate the original object. + obj= self.getObject(activity_tool) + # Change user if required (TO BE DONE) + # We will change the user only in order to execute this method + current_user = str(_getAuthenticatedUser(self)) + user = self.changeUser(self.user_name, activity_tool) + try: + active_obj = obj.activate(**self.activity_kw) + getattr(active_obj, self.method_id)(*self.args, **self.kw) + finally: + # Use again the previous user + if user is not None: + self.changeUser(current_user, activity_tool) + class Method: def __init__(self, passive_self, activity, active_process, kw, method_id): @@ -674,6 +691,17 @@ class ActivityTool (Folder, UniqueObject): """ folder = getToolByName(self, 'portal_skins').activity + # Obtain all pending messages. + message_list = [] + for activity in activity_list: + if hasattr(activity, 'dumpMessageList'): + try: + message_list.extend(activity.dumpMessageList(self)) + except ConflictError: + raise + except: + LOG('ActivityTool', WARNING, 'could not dump messages from %s' % (activity,), error=sys.exc_info()) + if hasattr(folder, 'SQLDict_createMessageTable'): try: folder.SQLDict_dropMessageTable() @@ -681,8 +709,8 @@ class ActivityTool (Folder, UniqueObject): raise except: LOG('CMFActivities', - 0, - 'WARNING: could not drop the message table', + WARNING, + 'could not drop the message table', error=sys.exc_info()) folder.SQLDict_createMessageTable() @@ -693,11 +721,22 @@ class ActivityTool (Folder, UniqueObject): raise except: LOG('CMFActivities', - 0, - 'WARNING: could not drop the message queue table', + WARNING, + 'could not drop the message queue table', error=sys.exc_info()) folder.SQLQueue_createMessageTable() + # Reactivate the messages. + for m in message_list: + try: + m.reactivate(self) + except ConflictError: + raise + except: + LOG('ActivityTool', WARNING, + 'could not reactivate the message %r, %r' % (m.object_path, m.method_id), + error=sys.exc_info()) + if REQUEST is not None: return REQUEST.RESPONSE.redirect('%s/%s' % (self.absolute_url(), 'manageActivitiesAdvanced?manage_tabs_message=Activities%20Cleared')) diff --git a/product/CMFActivity/skins/activity/SQLDict_dumpMessageList.zsql b/product/CMFActivity/skins/activity/SQLDict_dumpMessageList.zsql new file mode 100755 index 0000000000..69210d84de --- /dev/null +++ b/product/CMFActivity/skins/activity/SQLDict_dumpMessageList.zsql @@ -0,0 +1,14 @@ +<dtml-comment> +title: +connection_id:cmf_activity_sql_connection +max_rows:0 +max_cache:0 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params></params> +SELECT * FROM + message +ORDER BY + uid diff --git a/product/CMFActivity/skins/activity/SQLQueue_dumpMessageList.zsql b/product/CMFActivity/skins/activity/SQLQueue_dumpMessageList.zsql new file mode 100755 index 0000000000..e0ef83717e --- /dev/null +++ b/product/CMFActivity/skins/activity/SQLQueue_dumpMessageList.zsql @@ -0,0 +1,17 @@ +<dtml-comment> +title: +connection_id:cmf_activity_sql_connection +max_rows:0 +max_cache:0 +cache_time:0 +class_name: +class_file: +</dtml-comment> +<params>path +method_id +processing_node +priority</params> +SELECT * FROM + message_queue +ORDER BY + uid diff --git a/product/CMFActivity/tests/.cvsignore b/product/CMFActivity/tests/.cvsignore new file mode 100755 index 0000000000..d0743b7da6 --- /dev/null +++ b/product/CMFActivity/tests/.cvsignore @@ -0,0 +1,2 @@ +.AppleDouble +*.pyc -- 2.30.9