Skip to content

Commit 9d18aea

Browse files
committed
handle target workflows in send_event
1 parent ac2d8f3 commit 9d18aea

File tree

3 files changed

+26
-18
lines changed

3 files changed

+26
-18
lines changed

SpiffWorkflow/bpmn/util/subworkflow.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
from SpiffWorkflow import Workflow
2121
from SpiffWorkflow.exceptions import TaskNotFoundException
22+
from .task import BpmnTaskIterator
2223

2324
class BpmnBaseWorkflow(Workflow):
2425

@@ -31,6 +32,9 @@ def __init__(self, spec, **kwargs):
3132
def data_objects(self):
3233
return self.data.get('data_objects', {})
3334

35+
def get_tasks_iterator(self, first_task=None, **kwargs):
36+
return BpmnTaskIterator(first_task or self.task_tree, **kwargs)
37+
3438

3539
class BpmnSubWorkflow(BpmnBaseWorkflow):
3640

SpiffWorkflow/bpmn/util/task.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ def _catches_event(task):
4141

4242
class BpmnTaskIterator(TaskIterator):
4343

44-
def __init__(self, task, end_at_spec=None, max_depth=1000, depth_first=True, task_filter=None, **kwargs):
44+
def __init__(self, task, end_at_spec=None, max_depth=1000, depth_first=True, skip_subpprocesses=False, task_filter=None, **kwargs):
4545

4646
task_filter = task_filter or BpmnTaskFilter(**kwargs)
4747
super().__init__(task, end_at_spec, max_depth, depth_first, task_filter)
48+
self.skip_subpprocesses = skip_subpprocesses
4849

4950
def _next(self):
5051

@@ -61,7 +62,11 @@ def _next(self):
6162
task.task_spec.name != self.end_at_spec,
6263
]):
6364
# Do not descend into a completed subprocess to look for unfinished tasks.
64-
if subprocess is None or (task.state >= TaskState.FINISHED_MASK and self.task_filter.state <= TaskState.FINISHED_MASK):
65+
if (
66+
subprocess is None
67+
or self.skip_subpprocesses
68+
or (task.state >= TaskState.FINISHED_MASK and self.task_filter.state <= TaskState.FINISHED_MASK)
69+
):
6570
subprocess_tasks = []
6671
else:
6772
subprocess_tasks = [subprocess.task_tree]

SpiffWorkflow/bpmn/workflow.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from SpiffWorkflow.bpmn.specs.control import BoundaryEventSplit
2929

3030
from SpiffWorkflow.bpmn.util.subworkflow import BpmnBaseWorkflow, BpmnSubWorkflow
31-
from SpiffWorkflow.bpmn.util.task import BpmnTaskIterator
3231

3332
from .script_engine.python_engine import PythonScriptEngine
3433

@@ -79,9 +78,6 @@ def parent_workflow(self):
7978
def depth(self):
8079
return 0
8180

82-
def get_tasks_iterator(self, first_task=None, **kwargs):
83-
return BpmnTaskIterator(first_task or self.task_tree, **kwargs)
84-
8581
def create_subprocess(self, my_task, spec_name):
8682
# This creates a subprocess for an existing task
8783
subprocess = BpmnSubWorkflow(
@@ -114,30 +110,33 @@ def catch(self, event):
114110
115111
:param event: the thrown event
116112
"""
117-
if event.target is None:
113+
if event.target is not None:
114+
# This limits results to tasks in the specified workflow
115+
tasks = event.target.get_tasks(skip_subpprocesses=True, state=TaskState.NOT_FINISHED_MASK, catches_event=event)
116+
else:
118117
self.update_collaboration(event)
119118
tasks = self.get_tasks(state=TaskState.NOT_FINISHED_MASK, catches_event=event)
120119
# Figure out if we need to create an external event
121120
if len(tasks) == 0:
122121
self.bpmn_events.append(event)
123-
else:
124-
tasks = self.get_tasks(state=TaskState.NOT_FINISHED_MASK, catches_event=event)
125122

126123
for task in tasks:
127124
task.task_spec.catch(task, event)
128-
129-
self.refresh_waiting_tasks()
125+
if len(tasks) > 0:
126+
self.refresh_waiting_tasks()
130127

131128
def send_event(self, event):
132129
"""Allows this workflow to catch an externally generated event."""
133130

134-
tasks = self.get_tasks(state=TaskState.NOT_FINISHED_MASK, catches_event=event)
135-
if len(tasks) == 0:
136-
raise WorkflowException(f"This process is not waiting for {event.event_definition.name}")
137-
for task in tasks:
138-
task.task_spec.catch(task, event)
139-
140-
self.refresh_waiting_tasks()
131+
if event.target is not None:
132+
self.catch(event)
133+
else:
134+
tasks = self.get_tasks(state=TaskState.NOT_FINISHED_MASK, catches_event=event)
135+
if len(tasks) == 0:
136+
raise WorkflowException(f"This process is not waiting for {event.event_definition.name}")
137+
for task in tasks:
138+
task.task_spec.catch(task, event)
139+
self.refresh_waiting_tasks()
141140

142141
def get_events(self):
143142
"""Returns the list of events that cannot be handled from within this workflow."""

0 commit comments

Comments
 (0)