added subprocess and call activity to task data bpmn file and the test is passing now
This commit is contained in:
parent
513871ad21
commit
66a6c0449a
|
@ -1047,6 +1047,7 @@ class ProcessInstanceProcessor:
|
|||
bpmn_process_dict: dict,
|
||||
bpmn_process_parent: Optional[BpmnProcessModel] = None,
|
||||
bpmn_process_guid: Optional[str] = None,
|
||||
add_tasks_if_new_bpmn_process: bool = True,
|
||||
) -> BpmnProcessModel:
|
||||
tasks = bpmn_process_dict.pop("tasks")
|
||||
bpmn_process_data = bpmn_process_dict.pop("data")
|
||||
|
@ -1059,7 +1060,9 @@ class ProcessInstanceProcessor:
|
|||
elif self.process_instance_model.bpmn_process_id is not None:
|
||||
bpmn_process = self.process_instance_model.bpmn_process
|
||||
|
||||
bpmn_process_is_new = False
|
||||
if bpmn_process is None:
|
||||
bpmn_process_is_new = True
|
||||
bpmn_process = BpmnProcessModel(guid=bpmn_process_guid)
|
||||
|
||||
bpmn_process.properties_json = bpmn_process_dict
|
||||
|
@ -1087,6 +1090,8 @@ class ProcessInstanceProcessor:
|
|||
bpmn_process.parent_process_id = bpmn_process_parent.id
|
||||
db.session.add(bpmn_process)
|
||||
|
||||
if bpmn_process_is_new and add_tasks_if_new_bpmn_process:
|
||||
# if True:
|
||||
for task_id, task_properties in tasks.items():
|
||||
task_data_dict = task_properties.pop("data")
|
||||
state_int = task_properties["state"]
|
||||
|
@ -1115,7 +1120,6 @@ class ProcessInstanceProcessor:
|
|||
Expects the save method to commit it.
|
||||
"""
|
||||
bpmn_dict = json.loads(self.serialize())
|
||||
# with open('tmp2.json', 'w') as f: f.write(json.dumps(bpmn_dict)
|
||||
bpmn_dict_keys = ("spec", "subprocess_specs", "serializer_version")
|
||||
process_instance_data_dict = {}
|
||||
bpmn_spec_dict = {}
|
||||
|
@ -1132,10 +1136,13 @@ class ProcessInstanceProcessor:
|
|||
# FIXME: Update tasks in the did_complete_task instead to set the final info.
|
||||
# We will need to somehow cache all tasks initially though before each task is run.
|
||||
# Maybe always do this for first run - just need to know it's the first run.
|
||||
if self.process_instance_model.bpmn_process_id is None:
|
||||
# import pdb; pdb.set_trace()
|
||||
# if self.process_instance_model.bpmn_process_id is None:
|
||||
subprocesses = process_instance_data_dict.pop("subprocesses")
|
||||
bpmn_process_parent = self._add_bpmn_process(process_instance_data_dict)
|
||||
for subprocess_task_id, subprocess_properties in subprocesses.items():
|
||||
# import pdb; pdb.set_trace()
|
||||
print(f"subprocess_task_id: {subprocess_task_id}")
|
||||
self._add_bpmn_process(
|
||||
subprocess_properties,
|
||||
bpmn_process_parent,
|
||||
|
@ -1693,6 +1700,7 @@ class ProcessInstanceProcessor:
|
|||
secondary_engine_step_delegate=step_delegate,
|
||||
serializer=self._serializer,
|
||||
process_instance=self.process_instance_model,
|
||||
add_bpmn_process=self._add_bpmn_process,
|
||||
)
|
||||
execution_strategy = execution_strategy_named(
|
||||
execution_strategy_name, task_model_delegate
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
import json
|
||||
from hashlib import sha256
|
||||
from typing import Tuple
|
||||
from typing import Any
|
||||
from typing import Optional
|
||||
|
||||
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer # type: ignore
|
||||
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer, BpmnWorkflow # type: ignore
|
||||
from SpiffWorkflow.task import Task as SpiffTask # type: ignore
|
||||
from SpiffWorkflow.task import TaskStateNames
|
||||
|
||||
|
@ -50,49 +52,60 @@ class TaskService:
|
|||
|
||||
@classmethod
|
||||
def find_or_create_task_model_from_spiff_task(
|
||||
cls, spiff_task: SpiffTask, process_instance: ProcessInstanceModel
|
||||
cls, spiff_task: SpiffTask, process_instance: ProcessInstanceModel,
|
||||
serializer: BpmnWorkflowSerializer, add_bpmn_process: Any
|
||||
) -> TaskModel:
|
||||
spiff_task_guid = str(spiff_task.id)
|
||||
task_model: Optional[TaskModel] = TaskModel.query.filter_by(
|
||||
guid=spiff_task_guid
|
||||
).first()
|
||||
if task_model is None:
|
||||
bpmn_process = cls.task_bpmn_process(spiff_task, process_instance)
|
||||
bpmn_process = cls.task_bpmn_process(spiff_task, process_instance, serializer, add_bpmn_process)
|
||||
task_model = TaskModel.query.filter_by(
|
||||
guid=spiff_task_guid
|
||||
).first()
|
||||
if task_model is None:
|
||||
task_model = TaskModel(
|
||||
guid=spiff_task_guid, bpmn_process_id=bpmn_process.id
|
||||
)
|
||||
db.session.add(task_model)
|
||||
db.session.commit()
|
||||
return task_model
|
||||
|
||||
@classmethod
|
||||
def task_subprocess_guid(cls, spiff_task: SpiffTask) -> Optional[str]:
|
||||
def task_subprocess(cls, spiff_task: SpiffTask) -> Optional[Tuple[str, BpmnWorkflow]]:
|
||||
top_level_workflow = spiff_task.workflow._get_outermost_workflow()
|
||||
my_wf = spiff_task.workflow # This is the workflow the spiff_task is part of
|
||||
my_sp = None
|
||||
my_sp_id = None
|
||||
if my_wf != top_level_workflow:
|
||||
# All the subprocesses are at the top level, so you can just compare them
|
||||
for sp_id, sp in top_level_workflow.subprocesses.items():
|
||||
if sp == my_wf:
|
||||
my_sp = sp
|
||||
my_sp_id = sp_id
|
||||
break
|
||||
return my_sp_id
|
||||
return (str(my_sp_id), my_sp)
|
||||
|
||||
@classmethod
|
||||
def task_bpmn_process(
|
||||
cls, spiff_task: SpiffTask, process_instance: ProcessInstanceModel
|
||||
cls, spiff_task: SpiffTask, process_instance: ProcessInstanceModel,
|
||||
serializer: BpmnWorkflowSerializer, add_bpmn_process: Any
|
||||
) -> BpmnProcessModel:
|
||||
subprocess_guid = cls.task_subprocess_guid(spiff_task)
|
||||
if subprocess_guid is None:
|
||||
subprocess_guid, subprocess = cls.task_subprocess(spiff_task)
|
||||
if subprocess is None:
|
||||
# This is the top level workflow, which has no guid
|
||||
return process_instance.bpmn_process
|
||||
else:
|
||||
# import pdb; pdb.set_trace()
|
||||
bpmn_process: Optional[BpmnProcessModel] = BpmnProcessModel.query.filter_by(
|
||||
guid=subprocess_guid
|
||||
).first()
|
||||
# import pdb; pdb.set_trace()
|
||||
if bpmn_process is None:
|
||||
spiff_task_guid = str(spiff_task.id)
|
||||
raise Exception(
|
||||
f"Could not find bpmn_process for task {spiff_task_guid}"
|
||||
)
|
||||
bpmn_process = add_bpmn_process(serializer.workflow_to_dict(subprocess), process_instance.bpmn_process, subprocess_guid, add_tasks_if_new_bpmn_process=True)
|
||||
db.session.commit()
|
||||
# spiff_task_guid = str(spiff_task.id)
|
||||
# raise Exception(
|
||||
# f"Could not find bpmn_process for task {spiff_task_guid}"
|
||||
# )
|
||||
return bpmn_process
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import logging
|
||||
import time
|
||||
from typing import Any
|
||||
from typing import Callable
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
|
@ -50,12 +51,14 @@ class TaskModelSavingDelegate(EngineStepDelegate):
|
|||
serializer: BpmnWorkflowSerializer,
|
||||
process_instance: ProcessInstanceModel,
|
||||
secondary_engine_step_delegate: Optional[EngineStepDelegate] = None,
|
||||
add_bpmn_process: Any = None,
|
||||
) -> None:
|
||||
self.secondary_engine_step_delegate = secondary_engine_step_delegate
|
||||
self.process_instance = process_instance
|
||||
|
||||
self.current_task_model: Optional[TaskModel] = None
|
||||
self.serializer = serializer
|
||||
self.add_bpmn_process = add_bpmn_process
|
||||
|
||||
def should_update_task_model(self) -> bool:
|
||||
"""We need to figure out if we have previously save task info on this process intance.
|
||||
|
@ -63,12 +66,13 @@ class TaskModelSavingDelegate(EngineStepDelegate):
|
|||
Use the bpmn_process_id to do this.
|
||||
"""
|
||||
return self.process_instance.bpmn_process_id is not None
|
||||
# return False
|
||||
|
||||
def will_complete_task(self, spiff_task: SpiffTask) -> None:
|
||||
if self.should_update_task_model():
|
||||
self.current_task_model = (
|
||||
TaskService.find_or_create_task_model_from_spiff_task(
|
||||
spiff_task, self.process_instance
|
||||
spiff_task, self.process_instance, self.serializer, self.add_bpmn_process
|
||||
)
|
||||
)
|
||||
self.current_task_model.start_in_seconds = time.time()
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:spiffworkflow="http://spiffworkflow.org/bpmn/schema/1.0/core" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_96f6665" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0-dev">
|
||||
<bpmn:process id="top_level_process" name="Manual Task" isExecutable="true">
|
||||
<bpmn:startEvent id="StartEvent_1">
|
||||
<bpmn:outgoing>Flow_0stlaxe</bpmn:outgoing>
|
||||
</bpmn:startEvent>
|
||||
<bpmn:endEvent id="end_event_of_manual_task_model">
|
||||
<bpmn:incoming>Flow_1and8ze</bpmn:incoming>
|
||||
</bpmn:endEvent>
|
||||
<bpmn:manualTask id="manual_task" name="Hello">
|
||||
<bpmn:extensionElements>
|
||||
<spiffworkflow:instructionsForEndUser>## Hello</spiffworkflow:instructionsForEndUser>
|
||||
</bpmn:extensionElements>
|
||||
<bpmn:incoming>Flow_1fktmf7</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_09gjylo</bpmn:outgoing>
|
||||
</bpmn:manualTask>
|
||||
<bpmn:sequenceFlow id="Flow_0stlaxe" sourceRef="StartEvent_1" targetRef="top_level_script" />
|
||||
<bpmn:scriptTask id="top_level_script">
|
||||
<bpmn:incoming>Flow_0stlaxe</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_1fktmf7</bpmn:outgoing>
|
||||
<bpmn:script>set_in_top_level_script = 1</bpmn:script>
|
||||
</bpmn:scriptTask>
|
||||
<bpmn:sequenceFlow id="Flow_1fktmf7" sourceRef="top_level_script" targetRef="manual_task" />
|
||||
<bpmn:sequenceFlow id="Flow_1i7syph" sourceRef="top_level_subprocess" targetRef="top_level_call_activity" />
|
||||
<bpmn:sequenceFlow id="Flow_1and8ze" sourceRef="top_level_call_activity" targetRef="end_event_of_manual_task_model" />
|
||||
<bpmn:sequenceFlow id="Flow_09gjylo" sourceRef="manual_task" targetRef="top_level_subprocess" />
|
||||
<bpmn:subProcess id="top_level_subprocess">
|
||||
<bpmn:incoming>Flow_09gjylo</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_1i7syph</bpmn:outgoing>
|
||||
<bpmn:startEvent id="Event_0g7txdo">
|
||||
<bpmn:outgoing>Flow_00k1tii</bpmn:outgoing>
|
||||
</bpmn:startEvent>
|
||||
<bpmn:sequenceFlow id="Flow_00k1tii" sourceRef="Event_0g7txdo" targetRef="top_level_subprocess_script" />
|
||||
<bpmn:endEvent id="Event_0zi0szr">
|
||||
<bpmn:incoming>Flow_1b4o55k</bpmn:incoming>
|
||||
</bpmn:endEvent>
|
||||
<bpmn:sequenceFlow id="Flow_1b4o55k" sourceRef="top_level_subprocess_script" targetRef="Event_0zi0szr" />
|
||||
<bpmn:scriptTask id="top_level_subprocess_script">
|
||||
<bpmn:incoming>Flow_00k1tii</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_1b4o55k</bpmn:outgoing>
|
||||
<bpmn:script>set_in_top_level_subprocess = 1</bpmn:script>
|
||||
</bpmn:scriptTask>
|
||||
</bpmn:subProcess>
|
||||
<bpmn:callActivity id="top_level_call_activity" calledElement="test_process_to_call">
|
||||
<bpmn:incoming>Flow_1i7syph</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_1and8ze</bpmn:outgoing>
|
||||
</bpmn:callActivity>
|
||||
</bpmn:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="top_level_process">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||
<dc:Bounds x="179" y="159" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_1vokg57_di" bpmnElement="top_level_script">
|
||||
<dc:Bounds x="270" y="137" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_1rcj16n_di" bpmnElement="manual_task">
|
||||
<dc:Bounds x="400" y="137" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Event_0ia26nb_di" bpmnElement="end_event_of_manual_task_model">
|
||||
<dc:Bounds x="812" y="159" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_04hrmow_di" bpmnElement="top_level_call_activity">
|
||||
<dc:Bounds x="680" y="137" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_19a46sv_di" bpmnElement="top_level_subprocess">
|
||||
<dc:Bounds x="530" y="137" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="Flow_0stlaxe_di" bpmnElement="Flow_0stlaxe">
|
||||
<di:waypoint x="215" y="177" />
|
||||
<di:waypoint x="270" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_1fktmf7_di" bpmnElement="Flow_1fktmf7">
|
||||
<di:waypoint x="370" y="177" />
|
||||
<di:waypoint x="400" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_1i7syph_di" bpmnElement="Flow_1i7syph">
|
||||
<di:waypoint x="630" y="177" />
|
||||
<di:waypoint x="680" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_1and8ze_di" bpmnElement="Flow_1and8ze">
|
||||
<di:waypoint x="780" y="177" />
|
||||
<di:waypoint x="812" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_09gjylo_di" bpmnElement="Flow_09gjylo">
|
||||
<di:waypoint x="500" y="177" />
|
||||
<di:waypoint x="530" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_01cbxj3">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_07qyo6y" bpmnElement="top_level_subprocess">
|
||||
<bpmndi:BPMNShape id="Event_0g7txdo_di" bpmnElement="Event_0g7txdo">
|
||||
<dc:Bounds x="362" y="132" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Event_0zi0szr_di" bpmnElement="Event_0zi0szr">
|
||||
<dc:Bounds x="562" y="132" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_0g000aa_di" bpmnElement="top_level_subprocess_script">
|
||||
<dc:Bounds x="430" y="110" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="Flow_00k1tii_di" bpmnElement="Flow_00k1tii">
|
||||
<di:waypoint x="398" y="150" />
|
||||
<di:waypoint x="430" y="150" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_1b4o55k_di" bpmnElement="Flow_1b4o55k">
|
||||
<di:waypoint x="530" y="150" />
|
||||
<di:waypoint x="562" y="150" />
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn:definitions>
|
|
@ -0,0 +1,39 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_96f6665" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.0.0-dev">
|
||||
<bpmn:process id="test_process_to_call" isExecutable="true">
|
||||
<bpmn:startEvent id="StartEvent_1">
|
||||
<bpmn:outgoing>Flow_06g687y</bpmn:outgoing>
|
||||
</bpmn:startEvent>
|
||||
<bpmn:sequenceFlow id="Flow_06g687y" sourceRef="StartEvent_1" targetRef="test_process_to_call_script" />
|
||||
<bpmn:endEvent id="Event_1nn875f">
|
||||
<bpmn:incoming>Flow_01e21r0</bpmn:incoming>
|
||||
</bpmn:endEvent>
|
||||
<bpmn:sequenceFlow id="Flow_01e21r0" sourceRef="test_process_to_call_script" targetRef="Event_1nn875f" />
|
||||
<bpmn:scriptTask id="test_process_to_call_script">
|
||||
<bpmn:incoming>Flow_06g687y</bpmn:incoming>
|
||||
<bpmn:outgoing>Flow_01e21r0</bpmn:outgoing>
|
||||
<bpmn:script>set_in_test_process_to_call_script = 1</bpmn:script>
|
||||
</bpmn:scriptTask>
|
||||
</bpmn:process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
||||
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="test_process_to_call">
|
||||
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
||||
<dc:Bounds x="179" y="159" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Event_1nn875f_di" bpmnElement="Event_1nn875f">
|
||||
<dc:Bounds x="432" y="159" width="36" height="36" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape id="Activity_059upl6_di" bpmnElement="test_process_to_call_script">
|
||||
<dc:Bounds x="270" y="137" width="100" height="80" />
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge id="Flow_06g687y_di" bpmnElement="Flow_06g687y">
|
||||
<di:waypoint x="215" y="177" />
|
||||
<di:waypoint x="270" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge id="Flow_01e21r0_di" bpmnElement="Flow_01e21r0">
|
||||
<di:waypoint x="370" y="177" />
|
||||
<di:waypoint x="432" y="177" />
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</bpmn:definitions>
|
|
@ -314,9 +314,8 @@ class TestProcessInstanceProcessor(BaseTest):
|
|||
assert finance_group is not None
|
||||
|
||||
process_model = load_test_spec(
|
||||
process_model_id="test_group/manual_task",
|
||||
bpmn_file_name="manual_task.bpmn",
|
||||
process_model_source_directory="manual_task",
|
||||
process_model_id="test_group/manual_task_with_subprocesses",
|
||||
process_model_source_directory="manual_task_with_subprocesses",
|
||||
)
|
||||
process_instance = self.create_process_instance_from_process_model(
|
||||
process_model=process_model, user=initiator_user
|
||||
|
|
Loading…
Reference in New Issue