spiff-arena/SpiffWorkflow/bpmn/serializer/task_spec_converters.py
burnettk 71a2a3ec0e Squashed 'SpiffWorkflow/' changes from 46d3de27f..ffb168675
ffb168675 Option to run tests in parallel (#271)
062eaf15d another hot match -- assure hit policy is correctly passed through.
c79ee8407 Quick patch the DMN hit policy to fix a dump mistake.
36dd1b23a Fix ResourceWarning: unclosed file BpmnParser.py:60 (#270)
bba7ddf54 Merge pull request #268 from sartography/feature/multiple-event-definition
8cf770985 remove unused import
9d31e035e make multiple throw events work with start events
890c4b921 add throw support for multiple events
c1fc55660 add support for catching parallel multiple event definitions
511830b67 add event based gateway
56bd858dc add event type for multiple events

git-subtree-dir: SpiffWorkflow
git-subtree-split: ffb1686757f944065580dd2db8def73d6c1f0134
2022-12-10 23:39:00 -05:00

321 lines
10 KiB
Python

from uuid import UUID
from .bpmn_converters import BpmnTaskSpecConverter
from ...specs.StartTask import StartTask
from ...specs.Simple import Simple
from ...specs.LoopResetTask import LoopResetTask
from ..specs.BpmnProcessSpec import _EndJoin
from ..specs.BpmnSpecMixin import _BpmnCondition
from ..specs.NoneTask import NoneTask
from ..specs.UserTask import UserTask
from ..specs.ManualTask import ManualTask
from ..specs.ScriptTask import ScriptTask
from ..specs.SubWorkflowTask import CallActivity, TransactionSubprocess
from ..specs.ExclusiveGateway import ExclusiveGateway
from ..specs.InclusiveGateway import InclusiveGateway
from ..specs.ParallelGateway import ParallelGateway
from ..specs.events.StartEvent import StartEvent
from ..specs.events.EndEvent import EndEvent
from ..specs.events.IntermediateEvent import BoundaryEvent, EventBasedGateway, IntermediateCatchEvent, IntermediateThrowEvent
from ..specs.events.IntermediateEvent import _BoundaryEventParent, SendTask, ReceiveTask
from ..workflow import BpmnWorkflow
class SimpleTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(Simple, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class StartTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(StartTask, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class LoopResetTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(LoopResetTask, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
# Maybe I should add this to the base task converter, but I'm trying to keep it free of
# anything but task related conversions
dct['destination_id'] = str(spec.destination_id)
dct['destination_spec_name'] = spec.destination_spec_name
return dct
def from_dict(self, dct):
spec = self.task_spec_from_dict(dct)
spec.destination_id = UUID(spec.destination_id)
return spec
class EndJoinConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(_EndJoin, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class NoneTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(NoneTask, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class UserTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(UserTask, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class ManualTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(ManualTask, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class ScriptTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(ScriptTask, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct['script'] = spec.script
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class CallActivityTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(CallActivity, data_converter, typename)
self.wf_class = BpmnWorkflow
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct.update(self.get_subworkflow_attributes(spec))
return dct
def from_dict(self, dct):
dct['subworkflow_spec'] = dct.pop('spec')
return self.task_spec_from_dict(dct)
class TransactionSubprocessTaskConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(TransactionSubprocess, data_converter, typename)
self.wf_class = BpmnWorkflow
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct.update(self.get_subworkflow_attributes(spec))
return dct
def from_dict(self, dct):
dct['subworkflow_spec'] = dct.pop('spec')
return self.task_spec_from_dict(dct)
class ExclusiveGatewayConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(ExclusiveGateway, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct['default_task_spec'] = spec.default_task_spec
dct['cond_task_specs'] = [ self.bpmn_condition_to_dict(cond) for cond in spec.cond_task_specs ]
dct['choice'] = spec.choice
return dct
def from_dict(self, dct):
conditions = dct.pop('cond_task_specs')
default_task_spec = dct.pop('default_task_spec')
spec = self.task_spec_from_dict(dct)
spec.cond_task_specs = [ self.bpmn_condition_from_dict(cond) for cond in conditions ]
spec.default_task_spec = default_task_spec
return spec
def bpmn_condition_from_dict(self, dct):
return (_BpmnCondition(dct['condition']), dct['task_spec'])
def bpmn_condition_to_dict(self, condition):
expr, task_spec = condition
return {
'condition': expr.args[0],
'task_spec': task_spec
}
class InclusiveGatewayConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(InclusiveGateway, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct.update(self.get_join_attributes(spec))
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class ParallelGatewayConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(ParallelGateway, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct.update(self.get_join_attributes(spec))
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class EventConverter(BpmnTaskSpecConverter):
def __init__(self, spec_class, data_converter, typename):
super().__init__(spec_class, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct['event_definition'] = self.convert(spec.event_definition)
return dct
def from_dict(self, dct):
dct['event_definition'] = self.restore(dct['event_definition'])
return self.task_spec_from_dict(dct)
class StartEventConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(StartEvent, data_converter, typename)
class EndEventConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(EndEvent, data_converter, typename)
class IntermediateCatchEventConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(IntermediateCatchEvent, data_converter, typename)
class ReceiveTaskConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(ReceiveTask, data_converter, typename)
class IntermediateThrowEventConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(IntermediateThrowEvent, data_converter, typename)
class SendTaskConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(SendTask, data_converter, typename)
class BoundaryEventConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(BoundaryEvent, data_converter, typename)
def to_dict(self, spec):
dct = super().to_dict(spec)
dct['cancel_activity'] = spec.cancel_activity
return dct
class BoundaryEventParentConverter(BpmnTaskSpecConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(_BoundaryEventParent, data_converter, typename)
def to_dict(self, spec):
dct = self.get_default_attributes(spec)
dct.update(self.get_bpmn_attributes(spec))
dct['main_child_task_spec'] = spec.main_child_task_spec.name
return dct
def from_dict(self, dct):
return self.task_spec_from_dict(dct)
class EventBasedGatewayConverter(EventConverter):
def __init__(self, data_converter=None, typename=None):
super().__init__(EventBasedGateway, data_converter, typename)