diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py index 0a15ba4b..d53cbcb6 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/task_service.py @@ -135,14 +135,13 @@ class TaskService: # we are not sure why task_model.bpmn_process can be None while task_model.bpmn_process_id actually has a valid value bpmn_process = new_bpmn_process or task_model.bpmn_process or BpmnProcessModel.query.filter_by(id=task_model.bpmn_process_id).first() + # if bpmn_process is None: + # import pdb; pdb.set_trace() + # print("HEY") - try: - bpmn_process_json_data = self.__class__.update_task_data_on_bpmn_process( - bpmn_process, spiff_task.workflow.data - ) - except Exception as ex: - import pdb; pdb.set_trace() - print("HEY90823") + bpmn_process_json_data = self.__class__.update_task_data_on_bpmn_process( + bpmn_process, spiff_task.workflow.data + ) json_data_dict_list = self.__class__.update_task_model(task_model, spiff_task, self.serializer) self.task_models[task_model.guid] = task_model if bpmn_process_json_data is not None: @@ -177,9 +176,14 @@ class TaskService: spiff_workflow: BpmnWorkflow, bpmn_process: BpmnProcessModel, ) -> None: + # bpmn_process_dict = self.serializer.workflow_to_dict(spiff_workflow) new_properties_json = copy.copy(bpmn_process.properties_json) new_properties_json["last_task"] = str(spiff_workflow.last_task.id) if spiff_workflow.last_task else None new_properties_json["success"] = spiff_workflow.success + + # # update correlations correctly but always null out bpmn_messages since they get cleared out later + # new_properties_json['correlations'] = bpmn_process_dict['correlations'] + # new_properties_json['bpmn_messages'] = [] bpmn_process.properties_json = new_properties_json bpmn_process_json_data = self.__class__.update_task_data_on_bpmn_process(bpmn_process, spiff_workflow.data) @@ -192,6 +196,9 @@ class TaskService: direct_parent_bpmn_process = BpmnProcessModel.query.filter_by( id=bpmn_process.direct_parent_process_id ).first() + # if direct_parent_bpmn_process is None: + # import pdb; pdb.set_trace() + # print("HEY22") self.update_bpmn_process(spiff_workflow.outer_workflow, direct_parent_bpmn_process) @classmethod diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py index 242cc9a3..78412288 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/workflow_execution_service.py @@ -61,8 +61,7 @@ class TaskModelSavingDelegate(EngineStepDelegate): self.bpmn_definition_to_task_definitions_mappings = bpmn_definition_to_task_definitions_mappings self.serializer = serializer - self.current_task_model: Optional[TaskModel] = None - # self.current_task_start_in_seconds: Optional[float] = None + self.current_task_start_in_seconds: Optional[float] = None self.last_completed_spiff_task: Optional[SpiffTask] = None self.spiff_tasks_to_process: Set[UUID] = set() @@ -78,27 +77,27 @@ class TaskModelSavingDelegate(EngineStepDelegate): if self._should_update_task_model(): self.spiff_task_timestamps[spiff_task.id] = {'start_in_seconds': time.time(), 'end_in_seconds': None} spiff_task.task_spec._predict(spiff_task, mask=TaskState.NOT_FINISHED_MASK) + + self.current_task_start_in_seconds = time.time() + if self.secondary_engine_step_delegate: self.secondary_engine_step_delegate.will_complete_task(spiff_task) def did_complete_task(self, spiff_task: SpiffTask) -> None: if self._should_update_task_model(): - # if spiff_task.task_spec.name == 'test_process_to_call_script.BoundaryEventParent': - # import pdb; pdb.set_trace() - # print("HEY") - # task_model = self.task_service.update_task_model_with_spiff_task(spiff_task) - # if self.current_task_start_in_seconds is None: - # raise Exception("Could not find cached current_task_start_in_seconds. This should never have happend") - # task_model.start_in_seconds = self.current_task_start_in_seconds - # task_model.end_in_seconds = time.time() + + task_model = self.task_service.update_task_model_with_spiff_task(spiff_task) + if self.current_task_start_in_seconds is None: + raise Exception("Could not find cached current_task_start_in_seconds. This should never have happend") + task_model.start_in_seconds = self.current_task_start_in_seconds + task_model.end_in_seconds = time.time() + self.spiff_task_timestamps[spiff_task.id]['end_in_seconds'] = time.time() - self.last_completed_spiff_task = spiff_task self.spiff_tasks_to_process.add(spiff_task.id) self._add_children(spiff_task) # self._add_parents(spiff_task) - # self.task_service.process_spiff_task_parent_subprocess_tasks(spiff_task) - # self.task_service.process_spiff_task_children(spiff_task) + self.last_completed_spiff_task = spiff_task if self.secondary_engine_step_delegate: self.secondary_engine_step_delegate.did_complete_task(spiff_task) @@ -128,39 +127,50 @@ class TaskModelSavingDelegate(EngineStepDelegate): def after_engine_steps(self, bpmn_process_instance: BpmnWorkflow) -> None: if self._should_update_task_model(): + # excludes COMPLETED. the others were required to get PP1 to go to completion. # process FUTURE tasks because Boundary events are not processed otherwise. - # for waiting_spiff_task in bpmn_process_instance.get_tasks( - # TaskState.WAITING | TaskState.CANCELLED | TaskState.READY | TaskState.MAYBE | TaskState.LIKELY | TaskState.FUTURE - # ): - # self.task_service.update_task_model_with_spiff_task(waiting_spiff_task) - for spiff_task_uuid in self.spiff_tasks_to_process: - if spiff_task_uuid is None: # or str(spiff_task_uuid) in self.task_service.task_models: - continue - try: - # print(f"spiff_task_uuid: {spiff_task_uuid}") - waiting_spiff_task = bpmn_process_instance.get_task_from_id(spiff_task_uuid) - except TaskNotFoundException: - continue - # if waiting_spiff_task.task_spec.name == 'top_level_manual_task_two': - # import pdb; pdb.set_trace() - # print("HEY42") - # include PREDICTED_MASK tasks in list so we can remove them from the parent + for waiting_spiff_task in bpmn_process_instance.get_tasks( + TaskState.WAITING | TaskState.CANCELLED | TaskState.READY | TaskState.MAYBE | TaskState.LIKELY | TaskState.FUTURE + # TaskState.WAITING | TaskState.CANCELLED | TaskState.READY | TaskState.MAYBE | TaskState.LIKELY + # TaskState.WAITING | TaskState.CANCELLED | TaskState.READY | TaskState.FUTURE + ): if waiting_spiff_task._has_state(TaskState.PREDICTED_MASK): TaskService.remove_spiff_task_from_parent(waiting_spiff_task, self.task_service.task_models) for cpt in waiting_spiff_task.parent.children: if cpt.id == waiting_spiff_task.id: - waiting_spiff_task.parent.children.remove(cpt) + waiting_spiff_task.parent.children.remove(cpt) continue - start_and_end_times = None - if waiting_spiff_task.id in self.spiff_task_timestamps: - start_and_end_times = self.spiff_task_timestamps[waiting_spiff_task.id] - self.task_service.update_task_model_with_spiff_task(waiting_spiff_task, start_and_end_times=start_and_end_times) - # self.task_service.process_spiff_task_parent_subprocess_tasks(waiting_spiff_task) - + self.task_service.update_task_model_with_spiff_task(waiting_spiff_task) if self.last_completed_spiff_task is not None: self.task_service.process_spiff_task_parent_subprocess_tasks(self.last_completed_spiff_task) + + # for spiff_task_uuid in self.spiff_tasks_to_process: + # try: + # waiting_spiff_task = bpmn_process_instance.get_task_from_id(spiff_task_uuid) + # except TaskNotFoundException: + # continue + # + # # include PREDICTED_MASK tasks in list so we can remove them from the parent + # if waiting_spiff_task._has_state(TaskState.PREDICTED_MASK): + # TaskService.remove_spiff_task_from_parent(waiting_spiff_task, self.task_service.task_models) + # for cpt in waiting_spiff_task.parent.children: + # if cpt.id == waiting_spiff_task.id: + # waiting_spiff_task.parent.children.remove(cpt) + # continue + # # if waiting_spiff_task.state == TaskState.FUTURE: + # # continue + # start_and_end_times = None + # if waiting_spiff_task.id in self.spiff_task_timestamps: + # start_and_end_times = self.spiff_task_timestamps[waiting_spiff_task.id] + # self.task_service.update_task_model_with_spiff_task(waiting_spiff_task, start_and_end_times=start_and_end_times) + # + # if self.last_completed_spiff_task is not None: + # self.task_service.process_spiff_task_parent_subprocess_tasks(self.last_completed_spiff_task) + + # if self.last_completed_spiff_task is not None: # self.task_service.process_spiff_task_children(self.last_completed_spiff_task) + # self.task_service.process_spiff_task_parent_subprocess_tasks(self.last_completed_spiff_task) def _should_update_task_model(self) -> bool: """We need to figure out if we have previously save task info on this process intance. @@ -312,6 +322,8 @@ class WorkflowExecutionService: if bpmn_process is not None: bpmn_process_correlations = self.bpmn_process_instance.correlations bpmn_process.properties_json["correlations"] = bpmn_process_correlations + # update correlations correctly but always null out bpmn_messages since they get cleared out later + bpmn_process.properties_json["bpmn_messages"] = [] db.session.add(bpmn_process) db.session.commit() diff --git a/spiffworkflow-backend/tests/data/manual_task_with_subprocesses/test_process_to_call.bpmn b/spiffworkflow-backend/tests/data/manual_task_with_subprocesses/test_process_to_call.bpmn index 2bdce678..064365d8 100644 --- a/spiffworkflow-backend/tests/data/manual_task_with_subprocesses/test_process_to_call.bpmn +++ b/spiffworkflow-backend/tests/data/manual_task_with_subprocesses/test_process_to_call.bpmn @@ -50,6 +50,9 @@ Flow_089aeua set_in_test_process_to_call_script = 1 + + + @@ -66,6 +69,12 @@ + + + + + + diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py index 78f3fe1e..7890e156 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_logging_service.py @@ -59,7 +59,6 @@ class TestLoggingService(BaseTest): assert log_response.status_code == 200 assert log_response.json logs: list = log_response.json["results"] - import pdb; pdb.set_trace() assert len(logs) == 4 for log in logs: diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py index 70978a97..23f4748d 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py @@ -346,6 +346,7 @@ class TestProcessInstanceProcessor(BaseTest): ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one) human_task_one = process_instance.active_human_tasks[0] spiff_manual_task = processor.bpmn_process_instance.get_task_from_id(UUID(human_task_one.task_id)) + # import pdb; pdb.set_trace() ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one) processor.suspend() @@ -547,7 +548,7 @@ class TestProcessInstanceProcessor(BaseTest): all_spiff_tasks = processor_final.bpmn_process_instance.get_tasks() assert len(all_spiff_tasks) > 1 for spiff_task in all_spiff_tasks: - assert spiff_task.state == TaskState.COMPLETED + assert spiff_task.state == TaskState.COMPLETED or TaskState.CANCELLED assert_spiff_task_is_in_process(spiff_task) if spiff_task.task_spec.name == "top_level_call_activity":