49 lines
2.1 KiB
Python
Raw Normal View History

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)