From 376912f3a267f34fd1d3ff6b785ebecc7b2c887e Mon Sep 17 00:00:00 2001 From: jasquat Date: Fri, 26 Aug 2022 16:52:15 -0400 Subject: [PATCH] added method to get data for a process instance in its current state w/ burnettk cullerton --- conftest.py | 4 +++ .../models/process_instance.py | 3 ++- .../models/process_instance_report.py | 2 +- .../services/process_instance_processor.py | 26 +++++++++++++++++-- .../integration/test_process_api.py | 4 +-- .../unit/test_process_instance_report.py | 2 +- 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/conftest.py b/conftest.py index 054b4b06..3bf0dbd0 100644 --- a/conftest.py +++ b/conftest.py @@ -78,6 +78,10 @@ def setup_process_instances_for_reports() -> list[ProcessInstanceModel]: ) processor = ProcessInstanceProcessor(process_instance) processor.slam_in_data(data) + process_instance.status = "complete" + db.session.add(process_instance) + db.session.commit() + process_instances.append(process_instance) return process_instances diff --git a/src/spiffworkflow_backend/models/process_instance.py b/src/spiffworkflow_backend/models/process_instance.py index a4080772..6fc02c5c 100644 --- a/src/spiffworkflow_backend/models/process_instance.py +++ b/src/spiffworkflow_backend/models/process_instance.py @@ -14,8 +14,9 @@ from marshmallow_enum import EnumField # type: ignore from SpiffWorkflow.navigation import NavItem # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore from sqlalchemy import ForeignKey -from sqlalchemy.orm import deferred, validates +from sqlalchemy.orm import deferred from sqlalchemy.orm import relationship +from sqlalchemy.orm import validates from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum from spiffworkflow_backend.models.process_model import ProcessModelInfo diff --git a/src/spiffworkflow_backend/models/process_instance_report.py b/src/spiffworkflow_backend/models/process_instance_report.py index f52c90ff..8f8886bf 100644 --- a/src/spiffworkflow_backend/models/process_instance_report.py +++ b/src/spiffworkflow_backend/models/process_instance_report.py @@ -303,7 +303,7 @@ class ProcessInstanceReportModel(SpiffworkflowBaseDBModel): def to_serialized(process_instance: ProcessInstanceModel) -> dict: """To_serialized.""" processor = ProcessInstanceProcessor(process_instance) - process_instance.data = processor.get_data() + process_instance.data = processor.get_current_data() return process_instance.serialized_flat process_instance_dicts = map(to_serialized, process_instances) diff --git a/src/spiffworkflow_backend/services/process_instance_processor.py b/src/spiffworkflow_backend/services/process_instance_processor.py index eb186cc8..8d6d59c0 100644 --- a/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/src/spiffworkflow_backend/services/process_instance_processor.py @@ -745,6 +745,27 @@ class ProcessInstanceProcessor: """Get_data.""" return self.bpmn_process_instance.data # type: ignore + def get_current_data(self) -> dict[str, Any]: + """Get the current data for the process. + + Return either most recent task data or the process data + if the process instance is complete + """ + if self.process_instance_model.status == "complete": + return self.get_data() + + most_recent_task = None + for task in self.get_all_ready_or_waiting_tasks(): + if most_recent_task is None: + most_recent_task = task + elif most_recent_task.last_state_change < task.last_state_change: # type: ignore + most_recent_task = task + + if most_recent_task: + return most_recent_task.data # type: ignore + + return {} + def get_process_instance_id(self) -> int: """Get_process_instance_id.""" return self.process_instance_model.id @@ -836,9 +857,10 @@ class ProcessInstanceProcessor: f"Unable to find a task in the process_instance called '{spec_name}'", ) - def terminate(self) -> bool: + def terminate(self) -> None: + """Terminate.""" self.bpmn_process_instance.cancel() self.save() - self.process_instance_model.status = 'terminated' + self.process_instance_model.status = "terminated" db.session.add(self.process_instance_model) db.session.commit() diff --git a/tests/spiffworkflow_backend/integration/test_process_api.py b/tests/spiffworkflow_backend/integration/test_process_api.py index 95583a14..4c2d1bd0 100644 --- a/tests/spiffworkflow_backend/integration/test_process_api.py +++ b/tests/spiffworkflow_backend/integration/test_process_api.py @@ -724,7 +724,7 @@ class TestProcessApi(BaseTest): id=process_instance_id ).first() assert process_instance - assert process_instance.status == 'terminated' + assert process_instance.status == "terminated" def test_process_instance_delete( self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None @@ -1056,7 +1056,7 @@ class TestProcessApi(BaseTest): ) assert type(process_instance_dict["start_in_seconds"]) is int assert process_instance_dict["start_in_seconds"] > 0 - assert process_instance_dict["status"] == "waiting" + assert process_instance_dict["status"] == "complete" def test_process_instance_report_show_with_dynamic_filter_and_query_param( self, diff --git a/tests/spiffworkflow_backend/unit/test_process_instance_report.py b/tests/spiffworkflow_backend/unit/test_process_instance_report.py index fa698ffe..acfac138 100644 --- a/tests/spiffworkflow_backend/unit/test_process_instance_report.py +++ b/tests/spiffworkflow_backend/unit/test_process_instance_report.py @@ -117,7 +117,7 @@ def test_generate_report_with_columns( } results = do_report_with_metadata_and_instances(report_metadata, process_instances) assert len(results) == 1 - assert results == [{"name": "ray", "status": "waiting"}] + assert results == [{"name": "ray", "status": "complete"}] def do_report_with_metadata_and_instances(