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