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.slam_in_data(data)
process_instance.status = "complete"
db.session.add(process_instance)
db.session.commit()
process_instances.append(process_instance)
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.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

View File

@ -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)

View File

@ -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()

View File

@ -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,

View File

@ -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(