[Erp5-report] r14961 - in /erp5/trunk/products/CMFActivity: ./ Activity/ skins/activity/ te...

nobody at svn.erp5.org nobody at svn.erp5.org
Tue Jun 26 10:52:06 CEST 2007


Author: aurel
Date: Tue Jun 26 10:52:05 2007
New Revision: 14961

URL: http://svn.erp5.org?rev=14961&view=rev
Log:
add parameter group_id to SQLDict, it's used to segregate activity
with the same group_method_id

Modified:
    erp5/trunk/products/CMFActivity/ActiveObject.py
    erp5/trunk/products/CMFActivity/Activity/SQLDict.py
    erp5/trunk/products/CMFActivity/skins/activity/SQLDict_readUidList.zsql
    erp5/trunk/products/CMFActivity/tests/testCMFActivity.py

Modified: erp5/trunk/products/CMFActivity/ActiveObject.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/ActiveObject.py?rev=14961&r1=14960&r2=14961&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/ActiveObject.py (original)
+++ erp5/trunk/products/CMFActivity/ActiveObject.py Tue Jun 26 10:52:05 2007
@@ -122,6 +122,11 @@
         if k not in kw:
           kw[k] = v
 
+    if kw.get('group_id', '') is None:
+      raise ValueError, "Cannot defined a group_id with value None"
+    elif kw.get('group_method_id') is None and kw.get('group_id') is not None:
+      raise ValueError, "Cannot defined a group_id without group_method_id"
+    
     activity_tool = getToolByName(self, 'portal_activities', None)
     if activity_tool is None: return self # Do nothing if no portal_activities
     # activate returns an ActiveWrapper

Modified: erp5/trunk/products/CMFActivity/Activity/SQLDict.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/Activity/SQLDict.py?rev=14961&r1=14960&r2=14961&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/Activity/SQLDict.py (original)
+++ erp5/trunk/products/CMFActivity/Activity/SQLDict.py Tue Jun 26 10:52:05 2007
@@ -42,7 +42,7 @@
 except ImportError:
   pass
 
-from zLOG import LOG, TRACE, WARNING, ERROR
+from zLOG import LOG, TRACE, WARNING, ERROR, INFO
 
 MAX_PRIORITY = 5
 MAX_GROUPED_OBJECTS = 500
@@ -70,7 +70,8 @@
                                           broadcast = m.activity_kw.get('broadcast', 0),
                                           message = self.dumpMessage(m),
                                           date = m.activity_kw.get('at_date', DateTime()),
-                                          group_method_id = m.activity_kw.get('group_method_id', ''),
+                                          group_method_id = '\0'.join([m.activity_kw.get('group_method_id', ''),
+                                                                      m.activity_kw.get('group_id', '')]),
                                           tag = m.activity_kw.get('tag', ''),
                                           order_validation_text = self.getOrderValidationText(m))
                                           # Also store uid of activity
@@ -89,7 +90,8 @@
       dumped_message_list = [self.dumpMessage(message) for message in registered_message_list]
       datetime = DateTime()
       date_list = [message.activity_kw.get('at_date', datetime) for message in registered_message_list]
-      group_method_id_list = [message.activity_kw.get('group_method_id', '') for message in registered_message_list]
+      group_method_id_list = ['\0'.join([message.activity_kw.get('group_method_id', ''), message.activity_kw.get('group_id', '')])
+                              for message in registered_message_list]
       tag_list = [message.activity_kw.get('tag', '') for message in registered_message_list]
       order_validation_text_list = [self.getOrderValidationText(message) for message in registered_message_list]
       uid_list = activity_tool.getPortalObject().portal_ids.generateNewLengthIdList(id_group='portal_activity', id_count=len(registered_message_list))
@@ -172,10 +174,12 @@
       line = result[0]
       path = line.path
       method_id = line.method_id
+      group_method_id = line.group_method_id
       order_validation_text = line.order_validation_text
       uid_list = activity_tool.SQLDict_readUidList(path=path, method_id=method_id,
                                                    processing_node=None, to_date=now_date,
-                                                   order_validation_text=order_validation_text)
+                                                   order_validation_text=order_validation_text,
+                                                   group_method_id=group_method_id)
       uid_list = [x.uid for x in uid_list]
       uid_list_list = [uid_list]
       priority_list = [line.priority]
@@ -196,15 +200,14 @@
         if not self.validateMessage(activity_tool, m, uid_list, line.priority, processing_node):
           return 0
 
-        group_method_id = m.activity_kw.get('group_method_id')
-        if group_method_id is not None:
+        if group_method_id not in (None, '', '\0'):
           # Count the number of objects to prevent too many objects.
           if m.hasExpandMethod():
             count = len(m.getObjectList(activity_tool))
           else:
             count = 1
-
-          group_method = activity_tool.getPortalObject().restrictedTraverse(group_method_id)
+          
+          group_method = activity_tool.getPortalObject().restrictedTraverse(group_method_id.split('\0')[0])
 
           if count < MAX_GROUPED_OBJECTS:
             # Retrieve objects which have the same group method.
@@ -255,12 +258,15 @@
           # Release locks before starting a potentially long calculation
           get_transaction().commit()
 
+        # Remove group_id parameter from group_method_id
+        if group_method_id is not None:
+          group_method_id = group_method_id.split('\0')[0]
         # Try to invoke
-        if group_method_id is not None:
-          LOG('SQLDict', TRACE,
+        if group_method_id not in (None, ""):
+          LOG('SQLDict', INFO,
               'invoking a group method %s with %d objects '\
               ' (%d objects in expanded form)' % (
-              group_method_id, len(message_list), count))
+            group_method_id, len(message_list), count))
           activity_tool.invokeGroup(group_method_id, message_list)
         else:
           activity_tool.invoke(message_list[0])
@@ -304,7 +310,7 @@
               error=sys.exc_info())
           raise
         return 0
-
+      
       try:
         for i in xrange(len(message_list)):
           m = message_list[i]
@@ -501,7 +507,8 @@
             broadcast_list = [1] * (node_count - 1)
             message_list = [self.dumpMessage(message)] * (node_count - 1)
             date_list = [message.activity_kw.get('at_date', now_date)] * (node_count - 1)
-            group_method_id_list = [message.activity_kw.get('group_method_id', '')] * (node_count - 1)
+            group_method_id_list = ['\0'.join([message.activity_kw.get('group_method_id', ''),
+                                              message.activity_kw.get('group_id', '')])] * (node_count - 1)
             tag_list = [message.activity_kw.get('tag', '')] * (node_count - 1)
             order_validation_text_list = [message.order_validation_text] * (node_count - 1)
             activity_tool.SQLDict_writeMessageList(uid_list=uid_list,

Modified: erp5/trunk/products/CMFActivity/skins/activity/SQLDict_readUidList.zsql
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/skins/activity/SQLDict_readUidList.zsql?rev=14961&r1=14960&r2=14961&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/skins/activity/SQLDict_readUidList.zsql (original)
+++ erp5/trunk/products/CMFActivity/skins/activity/SQLDict_readUidList.zsql Tue Jun 26 10:52:05 2007
@@ -11,7 +11,8 @@
 method_id
 path
 to_date
-order_validation_text</params>
+order_validation_text
+group_method_id</params>
 SELECT uid FROM
     message
 WHERE
@@ -21,3 +22,4 @@
 <dtml-if path> AND path = <dtml-sqlvar path type="string"> </dtml-if>
 <dtml-if to_date> AND date <= <dtml-sqlvar to_date type="datetime"> </dtml-if>
 <dtml-if order_validation_text> AND order_validation_text = <dtml-sqlvar order_validation_text type="string"> </dtml-if>
+<dtml-if group_method_id> AND group_method_id = <dtml-sqlvar group_method_id type="string"> </dtml-if>

Modified: erp5/trunk/products/CMFActivity/tests/testCMFActivity.py
URL: http://svn.erp5.org/erp5/trunk/products/CMFActivity/tests/testCMFActivity.py?rev=14961&r1=14960&r2=14961&view=diff
==============================================================================
--- erp5/trunk/products/CMFActivity/tests/testCMFActivity.py (original)
+++ erp5/trunk/products/CMFActivity/tests/testCMFActivity.py Tue Jun 26 10:52:05 2007
@@ -1794,6 +1794,80 @@
     abortTransactionSynchronously()
     getattr(organisation, 'uid')
 
+
+  def test_80_CallWithGroupIdParamater(self, quiet=0, run=run_all_test):
+    """
+    Test that group_id parameter is used to separate execution of the same method
+    """
+    if not run: return
+    if not quiet:
+      message = '\nTest Activity with group_id parameter'
+      ZopeTestCase._print(message)
+      LOG('Testing... ',0,message)
+
+    portal = self.getPortal()    
+    organisation =  portal.organisation._getOb(self.company_id)
+    # Defined a group method
+    def setFoobar(self, object_list, number=1):
+      for obj in object_list:
+        if getattr(obj,'foobar', None) is not None:
+          obj.foobar = obj.foobar + number
+        else:
+          obj.foobar = number
+      object_list[:] = []
+    from Products.ERP5Type.Document.Folder import Folder
+    Folder.setFoobar = setFoobar    
+
+    def getFoobar(self):
+      return (getattr(self,'foobar',0))
+    Organisation.getFoobar = getFoobar
+
+    organisation.foobar = 0
+    self.assertEquals(0,organisation.getFoobar())
+
+    # Test group_method_id is working without group_id
+    for x in xrange(5):
+      organisation.activate(activity='SQLDict', group_method_id="organisation_module/setFoobar").reindexObject(number=1)
+      get_transaction().commit()      
+
+    message_list = portal.portal_activities.getMessageList()
+    self.assertEquals(len(message_list),5)
+    portal.portal_activities.distribute()
+    portal.portal_activities.tic()
+    self.assertEquals(1, organisation.getFoobar())
+
+
+    # Test group_method_id is working with one group_id defined
+    for x in xrange(5):
+      organisation.activate(activity='SQLDict', group_method_id="organisation_module/setFoobar", group_id="1").reindexObject(number=1)
+      get_transaction().commit()      
+
+    message_list = portal.portal_activities.getMessageList()
+    self.assertEquals(len(message_list),5)
+    portal.portal_activities.distribute()
+    portal.portal_activities.tic()
+    self.assertEquals(2, organisation.getFoobar())
+
+    # Test group_method_id is working with many group_id defined
+    for x in xrange(5):
+      organisation.activate(activity='SQLDict', group_method_id="organisation_module/setFoobar", group_id="1").reindexObject(number=1)
+      get_transaction().commit()      
+      organisation.activate(activity='SQLDict', group_method_id="organisation_module/setFoobar", group_id="2").reindexObject(number=3)
+      get_transaction().commit()
+      organisation.activate(activity='SQLDict', group_method_id="organisation_module/setFoobar", group_id="1").reindexObject(number=1)
+      get_transaction().commit()
+      organisation.activate(activity='SQLDict', group_method_id="organisation_module/setFoobar", group_id="3").reindexObject(number=5)
+      get_transaction().commit()
+
+    message_list = portal.portal_activities.getMessageList()
+    self.assertEquals(len(message_list),20)
+    portal.portal_activities.distribute()
+    portal.portal_activities.tic()
+    self.assertEquals(11, organisation.getFoobar())
+    message_list = portal.portal_activities.getMessageList()
+    self.assertEquals(len(message_list), 0)
+    
+
 if __name__ == '__main__':
     framework()
 else:




More information about the Erp5-report mailing list