mirror of
https://github.com/status-im/spiff-arena.git
synced 2025-02-11 09:16:45 +00:00
49 lines
2.1 KiB
Python
49 lines
2.1 KiB
Python
|
from SpiffWorkflow.bpmn.specs.events.event_definitions import MessageEventDefinition
|
||
|
|
||
|
class MessageEventDefinition(MessageEventDefinition):
|
||
|
"""
|
||
|
Message Events have both a name and a payload.
|
||
|
"""
|
||
|
|
||
|
# It is not entirely clear how the payload is supposed to be handled, so I have
|
||
|
# deviated from what the earlier code did as little as possible, but I believe
|
||
|
# this should be revisited: for one thing, we're relying on some Camunda-specific
|
||
|
# properties.
|
||
|
|
||
|
def __init__(self, name, correlation_properties=None, payload=None, result_var=None):
|
||
|
|
||
|
super(MessageEventDefinition, self).__init__(name, correlation_properties)
|
||
|
self.payload = payload
|
||
|
self.result_var = result_var
|
||
|
|
||
|
# The BPMN spec says that Messages should not be used within a process; however
|
||
|
# our camunda workflows depend on it
|
||
|
self.internal = True
|
||
|
|
||
|
def throw(self, my_task):
|
||
|
# We need to evaluate the message payload in the context of this task
|
||
|
result = my_task.workflow.script_engine.evaluate(my_task, self.payload)
|
||
|
# We can't update our own payload, because if this task is reached again
|
||
|
# we have to evaluate it again so we have to create a new event
|
||
|
event = MessageEventDefinition(self.name, payload=result, result_var=self.result_var)
|
||
|
self._throw(event, my_task.workflow, my_task.workflow.outer_workflow)
|
||
|
|
||
|
def update_internal_data(self, my_task, event_definition):
|
||
|
if event_definition.result_var is None:
|
||
|
result_var = f'{my_task.task_spec.name}_Response'
|
||
|
else:
|
||
|
result_var = event_definition.result_var
|
||
|
# Prevent this from conflicting
|
||
|
my_task.internal_data[self.name] = {
|
||
|
'payload': event_definition.payload,
|
||
|
'result_var': result_var
|
||
|
}
|
||
|
|
||
|
def update_task_data(self, my_task):
|
||
|
event_data = my_task.internal_data.get(self.name)
|
||
|
my_task.data[event_data['result_var']] = event_data['payload']
|
||
|
|
||
|
def reset(self, my_task):
|
||
|
my_task.internal_data.pop('result_var', None)
|
||
|
super(MessageEventDefinition, self).reset(my_task)
|