added method to get data for a process instance in its current state w/ burnettk cullerton

This commit is contained in:
jasquat 2022-08-26 16:52:15 -04:00
parent 01938b88f5
commit 376912f3a2
6 changed files with 34 additions and 7 deletions

View File

@ -78,6 +78,10 @@ def setup_process_instances_for_reports() -> list[ProcessInstanceModel]:
) )
processor = ProcessInstanceProcessor(process_instance) processor = ProcessInstanceProcessor(process_instance)
processor.slam_in_data(data) processor.slam_in_data(data)
process_instance.status = "complete"
db.session.add(process_instance)
db.session.commit()
process_instances.append(process_instance) process_instances.append(process_instance)
return process_instances return process_instances

View File

@ -14,8 +14,9 @@ from marshmallow_enum import EnumField # type: ignore
from SpiffWorkflow.navigation import NavItem # type: ignore from SpiffWorkflow.navigation import NavItem # type: ignore
from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore
from sqlalchemy import ForeignKey from sqlalchemy import ForeignKey
from sqlalchemy.orm import deferred, validates from sqlalchemy.orm import deferred
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from sqlalchemy.orm import validates
from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo

View File

@ -303,7 +303,7 @@ class ProcessInstanceReportModel(SpiffworkflowBaseDBModel):
def to_serialized(process_instance: ProcessInstanceModel) -> dict: def to_serialized(process_instance: ProcessInstanceModel) -> dict:
"""To_serialized.""" """To_serialized."""
processor = ProcessInstanceProcessor(process_instance) processor = ProcessInstanceProcessor(process_instance)
process_instance.data = processor.get_data() process_instance.data = processor.get_current_data()
return process_instance.serialized_flat return process_instance.serialized_flat
process_instance_dicts = map(to_serialized, process_instances) process_instance_dicts = map(to_serialized, process_instances)

View File

@ -745,6 +745,27 @@ class ProcessInstanceProcessor:
"""Get_data.""" """Get_data."""
return self.bpmn_process_instance.data # type: ignore 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: def get_process_instance_id(self) -> int:
"""Get_process_instance_id.""" """Get_process_instance_id."""
return self.process_instance_model.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}'", 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.bpmn_process_instance.cancel()
self.save() self.save()
self.process_instance_model.status = 'terminated' self.process_instance_model.status = "terminated"
db.session.add(self.process_instance_model) db.session.add(self.process_instance_model)
db.session.commit() db.session.commit()

View File

@ -724,7 +724,7 @@ class TestProcessApi(BaseTest):
id=process_instance_id id=process_instance_id
).first() ).first()
assert process_instance assert process_instance
assert process_instance.status == 'terminated' assert process_instance.status == "terminated"
def test_process_instance_delete( def test_process_instance_delete(
self, app: Flask, client: FlaskClient, with_db_and_bpmn_file_cleanup: None 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 type(process_instance_dict["start_in_seconds"]) is int
assert process_instance_dict["start_in_seconds"] > 0 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( def test_process_instance_report_show_with_dynamic_filter_and_query_param(
self, self,

View File

@ -117,7 +117,7 @@ def test_generate_report_with_columns(
} }
results = do_report_with_metadata_and_instances(report_metadata, process_instances) results = do_report_with_metadata_and_instances(report_metadata, process_instances)
assert len(results) == 1 assert len(results) == 1
assert results == [{"name": "ray", "status": "waiting"}] assert results == [{"name": "ray", "status": "complete"}]
def do_report_with_metadata_and_instances( def do_report_with_metadata_and_instances(