diff --git a/product/CMFActivity/ActiveObject.py b/product/CMFActivity/ActiveObject.py index a212118909c7c8b4b08108416de155c4b01abf5c..52bcafb1ee6db66d7a80bef14fb39c19dd6b1d0c 100644 --- a/product/CMFActivity/ActiveObject.py +++ b/product/CMFActivity/ActiveObject.py @@ -128,8 +128,12 @@ class ActiveObject(ExtensionClass.Base): 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) + + portal = self.getPortalObject() + if isinstance(active_process, basestring): + active_process = portal.unrestrictedTraverse(active_process) + + activity_tool = getattr(portal, 'portal_activities', None) if activity_tool is None: return self # Do nothing if no portal_activities # activate returns an ActiveWrapper # a queue can be provided as well as extra parameters diff --git a/product/CMFActivity/Activity/SQLDict.py b/product/CMFActivity/Activity/SQLDict.py index c1329e494fc15d803c42beb43c30b0229463be3e..b027c038e4c38ef2d570f846782320e5c8534bfe 100644 --- a/product/CMFActivity/Activity/SQLDict.py +++ b/product/CMFActivity/Activity/SQLDict.py @@ -514,7 +514,10 @@ class SQLDict(RAMDict, SQLBase): def hasActivity(self, activity_tool, object, method_id=None, only_valid=None, active_process_uid=None): hasMessage = getattr(activity_tool, 'SQLDict_hasMessage', None) if hasMessage is not None: - my_object_path = '/'.join(object.getPhysicalPath()) + if object is None: + my_object_path = None + else: + my_object_path = '/'.join(object.getPhysicalPath()) result = hasMessage(path=my_object_path, method_id=method_id, only_valid=only_valid, active_process_uid=active_process_uid) if len(result) > 0: return result[0].message_count > 0 diff --git a/product/CMFActivity/Activity/SQLQueue.py b/product/CMFActivity/Activity/SQLQueue.py index 3648839aac3537b71871af3b23bb3cabac7b3ed7..790c488378659729bc664a8282e9227f59fe4ca1 100644 --- a/product/CMFActivity/Activity/SQLQueue.py +++ b/product/CMFActivity/Activity/SQLQueue.py @@ -360,7 +360,10 @@ class SQLQueue(RAMQueue, SQLBase): def hasActivity(self, activity_tool, object, method_id=None, only_valid=None, active_process_uid=None): hasMessage = getattr(activity_tool, 'SQLQueue_hasMessage', None) if hasMessage is not None: - my_object_path = '/'.join(object.getPhysicalPath()) + if object is None: + my_object_path = None + else: + my_object_path = '/'.join(object.getPhysicalPath()) result = hasMessage(path=my_object_path, method_id=method_id, only_valid=only_valid, active_process_uid=active_process_uid) if len(result) > 0: return result[0].message_count > 0 diff --git a/product/CMFActivity/ActivityTool.py b/product/CMFActivity/ActivityTool.py index 413b9f5d15b4e4f35ee62067565237594a78cb51..fb82548cd449c038bcad43b557f2daad78695bc2 100644 --- a/product/CMFActivity/ActivityTool.py +++ b/product/CMFActivity/ActivityTool.py @@ -159,6 +159,7 @@ class Message: Message instances are stored in an activity queue, inside the Activity Tool. """ + active_process = None active_process_uid = None def __init__(self, obj, active_process, activity_kw, method_id, args, kw): @@ -168,11 +169,7 @@ class Message: else: self.object_path = obj.getPhysicalPath() activity_creation_trace = obj.getPortalObject().portal_activities.activity_creation_trace - if type(active_process) is StringType: - self.active_process = active_process.split('/') - elif active_process is None: - self.active_process = None - else: + if active_process is not None: self.active_process = active_process.getPhysicalPath() self.active_process_uid = active_process.getUid() if activity_kw.get('serialization_tag', False) is None: diff --git a/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql b/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql index 310774d3b84b5a2b9bdfd2cdf08fc76fb2d5f047..02d4f0688f4e1ac1f69c225514be1892fb2d5022 100644 --- a/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql +++ b/product/CMFActivity/skins/activity/SQLDict_hasMessage.zsql @@ -13,8 +13,8 @@ active_process_uid only_valid</params> SELECT count(path) as message_count FROM message -WHERE -path = <dtml-sqlvar path type="string"> +WHERE 1 = 1 +<dtml-if expr="path is not None">AND path = <dtml-sqlvar path type="string"> </dtml-if> <dtml-if expr="method_id is not None">AND method_id = <dtml-sqlvar method_id type="string"></dtml-if> <dtml-if expr="only_valid">AND processing_node > -2</dtml-if> <dtml-if expr="active_process_uid is not None"> AND active_process_uid = <dtml-sqlvar active_process_uid type="int"> </dtml-if> diff --git a/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql b/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql index b1b515cd0e0ff042bc6497e52edd834847a591ab..e6b4522a26fb9541b00516fd98e3fd99c0af6543 100644 --- a/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql +++ b/product/CMFActivity/skins/activity/SQLQueue_hasMessage.zsql @@ -13,8 +13,8 @@ active_process_uid only_valid</params> SELECT count(path) as message_count FROM message_queue -WHERE -path = <dtml-sqlvar path type="string"> +WHERE 1 = 1 +<dtml-if expr="path is not None">AND path = <dtml-sqlvar path type="string"> </dtml-if> <dtml-if expr="method_id is not None"> AND method_id = <dtml-sqlvar method_id type="string"> </dtml-if> <dtml-if expr="only_valid"> AND processing_node > -2 </dtml-if> <dtml-if expr="active_process_uid is not None"> AND active_process_uid = <dtml-sqlvar active_process_uid type="int"> </dtml-if> diff --git a/product/CMFActivity/tests/testCMFActivity.py b/product/CMFActivity/tests/testCMFActivity.py index 2ab167d2043597703530c734313444482d886bd0..2c3932d9a00c5e98337c014d9f5f569fb84809d2 100644 --- a/product/CMFActivity/tests/testCMFActivity.py +++ b/product/CMFActivity/tests/testCMFActivity.py @@ -3251,19 +3251,28 @@ class TestCMFActivity(ERP5TypeTestCase): finally: delattr(Organisation, 'waitingActivity') Queue.tic = original_queue_tic - - def test_active_object_hasActivity(self): + + def test_hasActivity(self): active_object = self.portal.organisation_module.newContent( portal_type='Organisation') + active_process = self.portal.portal_activities.newActiveProcess() get_transaction().commit() self.tic() + self.assertFalse(active_object.hasActivity()) - for activity in ('SQLDict', 'SQLQueue'): - active_object.activate(activity=activity).getTitle() - get_transaction().commit() - self.assertTrue(active_object.hasActivity(), activity) - self.tic() - self.assertFalse(active_object.hasActivity(), activity) + self.assertFalse(active_process.hasActivity()) + + def test(obj, **kw): + for activity in ('SQLDict', 'SQLQueue'): + active_object.activate(activity=activity, **kw).getTitle() + get_transaction().commit() + self.assertTrue(obj.hasActivity(), activity) + self.tic() + self.assertFalse(obj.hasActivity(), activity) + + test(active_object) + test(active_process, active_process=active_process) + test(active_process, active_process=active_process.getPath()) def test_active_object_hasActivity_does_not_catch_exceptions(self): """