diff --git a/product/CMFActivity/ActivityTool.py b/product/CMFActivity/ActivityTool.py index b24965caaeb70854d3aecfa6b649759446818ca7..0293f6114c34ecd164915e010f2012631d5693c6 100755 --- a/product/CMFActivity/ActivityTool.py +++ b/product/CMFActivity/ActivityTool.py @@ -598,7 +598,7 @@ class ActivityTool (Folder, UniqueObject): def invoke(self, message): message(self) - + def invokeGroup(self, method_id, message_list): # Invoke a group method. object_list = [] @@ -608,6 +608,8 @@ class ActivityTool (Folder, UniqueObject): # Filter the list of messages. If an object is not available, ignore such a message. # In addition, expand an object if necessary, and make sure that no duplication happens. for m in message_list: + # alternate method is used to segregate objects which cannot be grouped. + alternate_method_id = m.activity_kw.get('alternate_method_id') try: obj = m.getObject(self) i = len(new_message_list) # This is an index of this message in new_message_list. @@ -616,12 +618,32 @@ class ActivityTool (Folder, UniqueObject): path = subobj.getPath() if path not in path_dict: path_dict[path] = i - expanded_object_list.append(subobj) + if alternate_method_id is not None \ + and hasattr(aq_base(subobj), alternate_method_id): + # if this object is alternated, generate a new single active object. + activity_kw = m.activity_kw.copy() + if 'group_method_id' in activity_kw: + del activity_kw['group_method_id'] + active_obj = subobj.activate(**activity_kw) + #LOG('ActivityTool', 0, 'sub object %r has an alternate method %r, so invoking separately' % (subobj, alternate_method_id)) + getattr(active_obj, alternate_method_id)(*m.args, **m.kw) + else: + expanded_object_list.append(subobj) else: path = obj.getPath() if path not in path_dict: path_dict[path] = i - expanded_object_list.append(obj) + if alternate_method_id is not None \ + and hasattr(aq_base(obj), alternate_method_id): + # if this object is alternated, generate a new single active object. + activity_kw = m.activity_kw.copy() + if 'group_method_id' in activity_kw: + del activity_kw['group_method_id'] + active_obj = obj.activate(**activity_kw) + #LOG('ActivityTool', 0, 'object %r has an alternate method %r, so invoking separately' % (obj, alternate_method_id)) + getattr(active_obj, alternate_method_id)(*m.args, **m.kw) + else: + expanded_object_list.append(obj) object_list.append(obj) new_message_list.append(m) except: @@ -629,7 +651,7 @@ class ActivityTool (Folder, UniqueObject): m.exc_type = sys.exc_info()[0] LOG('WARNING ActivityTool', 0, 'Could not call method %s on object %s' % (m.method_id, m.object_path), error=sys.exc_info()) - + if len(expanded_object_list) > 0: try: method = self.unrestrictedTraverse(method_id) @@ -659,7 +681,7 @@ class ActivityTool (Folder, UniqueObject): m = new_message_list[i] if i in failed_message_dict: m.is_executed = 0 - LOG('WARNING ActivityTool', 0, + LOG('ActivityTool', WARNING, 'the method %s partially failed on object %s' % (m.method_id, m.object_path,)) else: try: @@ -668,7 +690,7 @@ class ActivityTool (Folder, UniqueObject): except: m.is_executed = 0 m.exc_type = sys.exc_info()[0] - LOG('WARNING ActivityTool', 0, + LOG('ActivityTool', WARNING, 'Could not call method %s on object %s' % (m.method_id, m.object_path), error=sys.exc_info()) def newMessage(self, activity, path, active_process, activity_kw, method_id, *args, **kw):