[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