This commit is contained in:
Dan 2023-05-03 17:29:33 -04:00
parent 5458d59f30
commit fc7d3c3907
4 changed files with 37 additions and 33 deletions

View File

@ -18,13 +18,13 @@ def setup_database_uri(app: Flask) -> None:
if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_URI") is None: if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_URI") is None:
database_name = f"spiffworkflow_backend_{app.config['ENV_IDENTIFIER']}" database_name = f"spiffworkflow_backend_{app.config['ENV_IDENTIFIER']}"
if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "sqlite": if app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "sqlite":
app.config["SQLALCHEMY_DATABASE_URI"] = ( app.config[
f"sqlite:///{app.instance_path}/db_{app.config['ENV_IDENTIFIER']}.sqlite3" "SQLALCHEMY_DATABASE_URI"
) ] = f"sqlite:///{app.instance_path}/db_{app.config['ENV_IDENTIFIER']}.sqlite3"
elif app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "postgres": elif app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_TYPE") == "postgres":
app.config["SQLALCHEMY_DATABASE_URI"] = ( app.config[
f"postgresql://spiffworkflow_backend:spiffworkflow_backend@localhost:5432/{database_name}" "SQLALCHEMY_DATABASE_URI"
) ] = f"postgresql://spiffworkflow_backend:spiffworkflow_backend@localhost:5432/{database_name}"
else: else:
# use pswd to trick flake8 with hardcoded passwords # use pswd to trick flake8 with hardcoded passwords
db_pswd = app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_PASSWORD") db_pswd = app.config.get("SPIFFWORKFLOW_BACKEND_DATABASE_PASSWORD")

View File

@ -129,9 +129,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel):
def serialized_with_metadata(self) -> dict[str, Any]: def serialized_with_metadata(self) -> dict[str, Any]:
process_instance_attributes = self.serialized process_instance_attributes = self.serialized
process_instance_attributes["process_metadata"] = self.process_metadata process_instance_attributes["process_metadata"] = self.process_metadata
process_instance_attributes["process_model_with_diagram_identifier"] = ( process_instance_attributes[
self.process_model_with_diagram_identifier "process_model_with_diagram_identifier"
) ] = self.process_model_with_diagram_identifier
return process_instance_attributes return process_instance_attributes
@property @property

View File

@ -423,9 +423,9 @@ class ProcessInstanceProcessor:
tld.process_instance_id = process_instance_model.id tld.process_instance_id = process_instance_model.id
# we want this to be the fully qualified path to the process model including all group subcomponents # we want this to be the fully qualified path to the process model including all group subcomponents
current_app.config["THREAD_LOCAL_DATA"].process_model_identifier = ( current_app.config[
f"{process_instance_model.process_model_identifier}" "THREAD_LOCAL_DATA"
) ].process_model_identifier = f"{process_instance_model.process_model_identifier}"
self.process_instance_model = process_instance_model self.process_instance_model = process_instance_model
self.process_model_service = ProcessModelService() self.process_model_service = ProcessModelService()
@ -585,9 +585,9 @@ class ProcessInstanceProcessor:
bpmn_subprocess_definition.bpmn_identifier bpmn_subprocess_definition.bpmn_identifier
] = bpmn_process_definition_dict ] = bpmn_process_definition_dict
spiff_bpmn_process_dict["subprocess_specs"][bpmn_subprocess_definition.bpmn_identifier]["task_specs"] = {} spiff_bpmn_process_dict["subprocess_specs"][bpmn_subprocess_definition.bpmn_identifier]["task_specs"] = {}
bpmn_subprocess_definition_bpmn_identifiers[bpmn_subprocess_definition.id] = ( bpmn_subprocess_definition_bpmn_identifiers[
bpmn_subprocess_definition.bpmn_identifier bpmn_subprocess_definition.id
) ] = bpmn_subprocess_definition.bpmn_identifier
task_definitions = TaskDefinitionModel.query.filter( task_definitions = TaskDefinitionModel.query.filter(
TaskDefinitionModel.bpmn_process_definition_id.in_( # type: ignore TaskDefinitionModel.bpmn_process_definition_id.in_( # type: ignore
@ -1211,11 +1211,12 @@ class ProcessInstanceProcessor:
raise TaskNotFoundError( raise TaskNotFoundError(
f"Cannot find a task with guid '{to_task_guid}' for process instance '{process_instance.id}'" f"Cannot find a task with guid '{to_task_guid}' for process instance '{process_instance.id}'"
) )
# If this task model has a parent boundary event, reset to that point instead, so we can reset all the boundary timers, etc... # If this task model has a parent boundary event, reset to that point instead,
parent_id = to_task_model.properties_json.get('parent','') # so we can reset all the boundary timers, etc...
parent_id = to_task_model.properties_json.get("parent", "")
parent = TaskModel.query.filter_by(guid=parent_id).first() parent = TaskModel.query.filter_by(guid=parent_id).first()
is_boundary_parent = False is_boundary_parent = False
if parent and parent.task_definition.typename == '_BoundaryEventParent': if parent and parent.task_definition.typename == "_BoundaryEventParent":
to_task_model = parent to_task_model = parent
is_boundary_parent = True # Will need to complete this task at the end so we are on the correct process. is_boundary_parent = True # Will need to complete this task at the end so we are on the correct process.
@ -1325,7 +1326,7 @@ class ProcessInstanceProcessor:
# If this as a boundary event parent, run it, so we get back to an active task. # If this as a boundary event parent, run it, so we get back to an active task.
if is_boundary_parent: if is_boundary_parent:
processor.do_engine_steps(execution_strategy_name='one_at_a_time') processor.do_engine_steps(execution_strategy_name="one_at_a_time")
processor.save() processor.save()
processor.suspend() processor.suspend()

View File

@ -454,21 +454,23 @@ class TestProcessInstanceProcessor(BaseTest):
assert len(process_instance.active_human_tasks) == 1 assert len(process_instance.active_human_tasks) == 1
human_task_one = process_instance.active_human_tasks[0] 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)) spiff_manual_task = processor.bpmn_process_instance.get_task_from_id(UUID(human_task_one.task_id))
ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, with_super_admin_user, human_task_one) ProcessInstanceService.complete_form_task(
processor, spiff_manual_task, {}, with_super_admin_user, human_task_one
)
assert ( assert (
len(process_instance.active_human_tasks) == 1 len(process_instance.active_human_tasks) == 1
), "expected 1 active human tasks after 2nd one is completed" ), "expected 1 active human tasks after 2nd one is completed"
assert process_instance.active_human_tasks[0].task_title == 'Final' assert process_instance.active_human_tasks[0].task_title == "Final"
# Reset the process back to the task within the call activity that contains a timer_boundary event. # Reset the process back to the task within the call activity that contains a timer_boundary event.
reset_to_spiff_task = processor.__class__.get_task_by_bpmn_identifier( reset_to_spiff_task: SpiffTask = processor.__class__.get_task_by_bpmn_identifier(
'manual_task_1', processor.bpmn_process_instance "manual_task_1", processor.bpmn_process_instance
) )
processor.suspend() processor.suspend()
processor = ProcessInstanceProcessor(process_instance) processor = ProcessInstanceProcessor(process_instance)
ProcessInstanceProcessor.reset_process(process_instance, str(reset_to_spiff_task.id)) ProcessInstanceProcessor.reset_process(process_instance, str(reset_to_spiff_task.id))
human_task_one = process_instance.active_human_tasks[0] human_task_one = process_instance.active_human_tasks[0]
assert human_task_one.task_title == 'Manual Task #1' assert human_task_one.task_title == "Manual Task #1"
processor = ProcessInstanceProcessor(process_instance) processor = ProcessInstanceProcessor(process_instance)
processor.manual_complete_task(str(spiff_manual_task.id), execute=True) processor.manual_complete_task(str(spiff_manual_task.id), execute=True)
processor = ProcessInstanceProcessor(process_instance) processor = ProcessInstanceProcessor(process_instance)
@ -476,10 +478,11 @@ class TestProcessInstanceProcessor(BaseTest):
processor.do_engine_steps(save=True) processor.do_engine_steps(save=True)
process_instance = ProcessInstanceModel.query.filter_by(id=process_instance.id).first() process_instance = ProcessInstanceModel.query.filter_by(id=process_instance.id).first()
assert (len(process_instance.active_human_tasks) == 1) assert len(process_instance.active_human_tasks) == 1
assert process_instance.active_human_tasks[0].task_title == 'Final', \ assert process_instance.active_human_tasks[0].task_title == "Final", (
"once we reset, resume, and complete the task, we should be back to the Final step again, and not" \ "once we reset, resume, and complete the task, we should be back to the Final step again, and not"
"stuck waiting for the call activity to complete (which was happening in a bug I'm fixing right now)" "stuck waiting for the call activity to complete (which was happening in a bug I'm fixing right now)"
)
def test_properly_saves_tasks_when_running( def test_properly_saves_tasks_when_running(
self, self,