From 85bc613d0469db4a251629d0ce8dc128716b14c4 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Thu, 24 Aug 2017 04:51:10 -0400 Subject: [PATCH] Improve event trigger workflow selection. Fix duplicate transitions trigger. Signed-off-by: Roberto Rosario --- mayan/apps/document_states/handlers.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/mayan/apps/document_states/handlers.py b/mayan/apps/document_states/handlers.py index d47852e28e..a32b04947b 100644 --- a/mayan/apps/document_states/handlers.py +++ b/mayan/apps/document_states/handlers.py @@ -18,6 +18,9 @@ def handler_index_document(sender, **kwargs): def handler_trigger_transition(sender, **kwargs): action = kwargs['instance'] + Document = apps.get_model( + app_label='documents', model_name='Document' + ) WorkflowInstance = apps.get_model( app_label='document_states', model_name='WorkflowInstance' ) @@ -25,12 +28,23 @@ def handler_trigger_transition(sender, **kwargs): app_label='document_states', model_name='WorkflowTransition' ) - for transition in WorkflowTransition.objects.filter(trigger_events__event_type__name=kwargs['instance'].verb): - for workflow_instance in WorkflowInstance.objects.filter(workflow__transitions=transition, document=action.target): - workflow_instance.do_transition( - comment=_('Event trigger: %s') % Event.get(name=action.verb).label, - transition=transition - ) + trigger_transitions = WorkflowTransition.objects.filter(trigger_events__event_type__name=kwargs['instance'].verb) + + if isinstance(action.target, Document): + workflow_instances = WorkflowInstance.objects.filter(workflow__transitions__in=trigger_transitions, document=action.target).distinct() + elif isinstance(action.action_object, Document): + workflow_instances = WorkflowInstance.objects.filter(workflow__transitions__in=trigger_transitions, document=action.action_object).distinct() + else: + workflow_instances = WorkflowInstance.objects.none() + + for workflow_instance in workflow_instances: + # Select the first transition that is valid for this workflow state + transition = list(set(trigger_transitions) & set(workflow_instance.get_transition_choices()))[0] + + workflow_instance.do_transition( + comment=_('Event trigger: %s') % Event.get(name=action.verb).label, + transition=transition + ) def launch_workflow(sender, instance, created, **kwargs):