some cleanup before merging to main w/ burnettk
This commit is contained in:
parent
fefac239e2
commit
b441c59fde
|
@ -1,6 +1,5 @@
|
|||
"""Process_instance_processor."""
|
||||
import _strptime # type: ignore
|
||||
import copy
|
||||
import decimal
|
||||
import json
|
||||
import logging
|
||||
|
@ -51,8 +50,6 @@ from SpiffWorkflow.spiff.serializer.config import SPIFF_SPEC_CONFIG # type: ign
|
|||
from SpiffWorkflow.task import Task as SpiffTask # type: ignore
|
||||
from SpiffWorkflow.task import TaskState
|
||||
from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore
|
||||
from sqlalchemy import and_
|
||||
from sqlalchemy import or_
|
||||
|
||||
from spiffworkflow_backend.exceptions.api_error import ApiError
|
||||
from spiffworkflow_backend.models.bpmn_process import BpmnProcessModel
|
||||
|
@ -1266,123 +1263,123 @@ class ProcessInstanceProcessor:
|
|||
cls, process_instance: ProcessInstanceModel, to_task_guid: str, commit: Optional[bool] = False
|
||||
) -> None:
|
||||
"""Reset a process to an earlier state."""
|
||||
# raise Exception("This feature to reset a process instance to a given task is currently unavaiable")
|
||||
cls.add_event_to_process_instance(
|
||||
process_instance, ProcessInstanceEventType.process_instance_rewound_to_task.value, task_guid=to_task_guid
|
||||
)
|
||||
|
||||
to_task_model = TaskModel.query.filter_by(guid=to_task_guid, process_instance_id=process_instance.id).first()
|
||||
if to_task_model is None:
|
||||
raise TaskNotFoundError(
|
||||
f"Cannot find a task with guid '{to_task_guid}' for process instance '{process_instance.id}'"
|
||||
)
|
||||
|
||||
parent_bpmn_processes, task_models_of_parent_bpmn_processes = TaskService.task_models_of_parent_bpmn_processes(
|
||||
to_task_model
|
||||
)
|
||||
[p.guid for p in task_models_of_parent_bpmn_processes if p.guid]
|
||||
[p.id for p in parent_bpmn_processes]
|
||||
tasks_to_update_query = db.session.query(TaskModel).filter(
|
||||
and_(
|
||||
or_(
|
||||
TaskModel.end_in_seconds > to_task_model.end_in_seconds,
|
||||
TaskModel.end_in_seconds.is_(None), # type: ignore
|
||||
),
|
||||
TaskModel.process_instance_id == process_instance.id,
|
||||
# TaskModel.bpmn_process_id.in_(parent_bpmn_processes_ids), # type: ignore
|
||||
)
|
||||
)
|
||||
tasks_to_update = tasks_to_update_query.all()
|
||||
|
||||
# run all queries before making changes to task_model
|
||||
if commit:
|
||||
# tasks_to_delete_query = db.session.query(TaskModel).filter(
|
||||
raise Exception("This feature to reset a process instance to a given task is currently unavaiable")
|
||||
# cls.add_event_to_process_instance(
|
||||
# process_instance, ProcessInstanceEventType.process_instance_rewound_to_task.value, task_guid=to_task_guid
|
||||
# )
|
||||
#
|
||||
# to_task_model = TaskModel.query.filter_by(guid=to_task_guid, process_instance_id=process_instance.id).first()
|
||||
# if to_task_model is None:
|
||||
# raise TaskNotFoundError(
|
||||
# f"Cannot find a task with guid '{to_task_guid}' for process instance '{process_instance.id}'"
|
||||
# )
|
||||
#
|
||||
# parent_bpmn_processes, task_models_of_parent_bpmn_processes = TaskService.task_models_of_parent_bpmn_processes(
|
||||
# to_task_model
|
||||
# )
|
||||
# [p.guid for p in task_models_of_parent_bpmn_processes if p.guid]
|
||||
# [p.id for p in parent_bpmn_processes]
|
||||
# tasks_to_update_query = db.session.query(TaskModel).filter(
|
||||
# and_(
|
||||
# or_(
|
||||
# TaskModel.end_in_seconds > to_task_model.end_in_seconds,
|
||||
# TaskModel.end_in_seconds.is_not(None), # type: ignore
|
||||
# TaskModel.end_in_seconds.is_(None), # type: ignore
|
||||
# ),
|
||||
# TaskModel.process_instance_id == process_instance.id,
|
||||
# TaskModel.guid.not_in(task_models_of_parent_bpmn_processes_guids), # type: ignore
|
||||
# TaskModel.bpmn_process_id.not_in(parent_bpmn_processes_ids), # type: ignore
|
||||
# # TaskModel.bpmn_process_id.in_(parent_bpmn_processes_ids), # type: ignore
|
||||
# )
|
||||
# )
|
||||
# tasks_to_update = tasks_to_update_query.all()
|
||||
#
|
||||
# tasks_to_delete = tasks_to_delete_query.all()
|
||||
# # run all queries before making changes to task_model
|
||||
# if commit:
|
||||
# # tasks_to_delete_query = db.session.query(TaskModel).filter(
|
||||
# # and_(
|
||||
# # or_(
|
||||
# # TaskModel.end_in_seconds > to_task_model.end_in_seconds,
|
||||
# # TaskModel.end_in_seconds.is_not(None), # type: ignore
|
||||
# # ),
|
||||
# # TaskModel.process_instance_id == process_instance.id,
|
||||
# # TaskModel.guid.not_in(task_models_of_parent_bpmn_processes_guids), # type: ignore
|
||||
# # TaskModel.bpmn_process_id.not_in(parent_bpmn_processes_ids), # type: ignore
|
||||
# # )
|
||||
# # )
|
||||
# #
|
||||
# # tasks_to_delete = tasks_to_delete_query.all()
|
||||
# #
|
||||
# # # delete any later tasks from to_task_model and delete bpmn processes that may be
|
||||
# # # link directly to one of those tasks.
|
||||
# # tasks_to_delete_guids = [t.guid for t in tasks_to_delete]
|
||||
# # tasks_to_delete_ids = [t.id for t in tasks_to_delete]
|
||||
# # bpmn_processes_to_delete = BpmnProcessModel.query.filter(
|
||||
# # BpmnProcessModel.guid.in_(tasks_to_delete_guids) # type: ignore
|
||||
# # ).order_by(BpmnProcessModel.id.desc()).all()
|
||||
# # human_tasks_to_delete = HumanTaskModel.query.filter(
|
||||
# # HumanTaskModel.task_model_id.in_(tasks_to_delete_ids) # type: ignore
|
||||
# # ).all()
|
||||
# #
|
||||
# #
|
||||
# # import pdb; pdb.set_trace()
|
||||
# # # ensure the correct order for foreign keys
|
||||
# # for human_task_to_delete in human_tasks_to_delete:
|
||||
# # db.session.delete(human_task_to_delete)
|
||||
# # db.session.commit()
|
||||
# # for task_to_delete in tasks_to_delete:
|
||||
# # db.session.delete(task_to_delete)
|
||||
# # db.session.commit()
|
||||
# # for bpmn_process_to_delete in bpmn_processes_to_delete:
|
||||
# # db.session.delete(bpmn_process_to_delete)
|
||||
# # db.session.commit()
|
||||
#
|
||||
# # delete any later tasks from to_task_model and delete bpmn processes that may be
|
||||
# # link directly to one of those tasks.
|
||||
# tasks_to_delete_guids = [t.guid for t in tasks_to_delete]
|
||||
# tasks_to_delete_ids = [t.id for t in tasks_to_delete]
|
||||
# bpmn_processes_to_delete = BpmnProcessModel.query.filter(
|
||||
# BpmnProcessModel.guid.in_(tasks_to_delete_guids) # type: ignore
|
||||
# ).order_by(BpmnProcessModel.id.desc()).all()
|
||||
# related_human_task = HumanTaskModel.query.filter_by(task_model_id=to_task_model.id).first()
|
||||
# if related_human_task is not None:
|
||||
# db.session.delete(related_human_task)
|
||||
#
|
||||
# tasks_to_update_ids = [t.id for t in tasks_to_update]
|
||||
# human_tasks_to_delete = HumanTaskModel.query.filter(
|
||||
# HumanTaskModel.task_model_id.in_(tasks_to_delete_ids) # type: ignore
|
||||
# HumanTaskModel.task_model_id.in_(tasks_to_update_ids) # type: ignore
|
||||
# ).all()
|
||||
#
|
||||
#
|
||||
# import pdb; pdb.set_trace()
|
||||
# # ensure the correct order for foreign keys
|
||||
# for human_task_to_delete in human_tasks_to_delete:
|
||||
# db.session.delete(human_task_to_delete)
|
||||
# db.session.commit()
|
||||
# for task_to_delete in tasks_to_delete:
|
||||
# db.session.delete(task_to_delete)
|
||||
#
|
||||
# for task_to_update in tasks_to_update:
|
||||
# # print(f"task_to_update: {task_to_update}")
|
||||
# print(f"task_to_update.state: {task_to_update.state}")
|
||||
# TaskService.reset_task_model(task_to_update, state="FUTURE", commit=commit)
|
||||
# # TaskService.reset_task_model(task_to_update, state=task_to_update.state, commit=commit)
|
||||
# # if task_to_update.task_definition.bpmn_identifier != 'top_level_process_script_after_gate':
|
||||
# # TaskService.reset_task_model(task_to_update, state='FUTURE', commit=commit)
|
||||
# # else:
|
||||
# # TaskService.reset_task_model(task_to_update, state=task_to_update.state, commit=commit)
|
||||
#
|
||||
# parent_task_model = TaskModel.query.filter_by(guid=to_task_model.properties_json["parent"]).first()
|
||||
# if parent_task_model is None:
|
||||
# raise TaskNotFoundError(
|
||||
# f"Cannot find a task with guid '{to_task_guid}' for process instance '{process_instance.id}'"
|
||||
# )
|
||||
#
|
||||
# TaskService.reset_task_model(
|
||||
# to_task_model,
|
||||
# state="READY",
|
||||
# json_data_hash=parent_task_model.json_data_hash,
|
||||
# python_env_data_hash=parent_task_model.python_env_data_hash,
|
||||
# commit=commit,
|
||||
# )
|
||||
# for task_model in task_models_of_parent_bpmn_processes:
|
||||
# TaskService.reset_task_model(task_model, state="WAITING", commit=commit)
|
||||
#
|
||||
# bpmn_process = to_task_model.bpmn_process
|
||||
# properties_json = copy.copy(bpmn_process.properties_json)
|
||||
# properties_json["last_task"] = parent_task_model.guid
|
||||
# bpmn_process.properties_json = properties_json
|
||||
# db.session.add(bpmn_process)
|
||||
# db.session.commit()
|
||||
# for bpmn_process_to_delete in bpmn_processes_to_delete:
|
||||
# db.session.delete(bpmn_process_to_delete)
|
||||
# db.session.commit()
|
||||
|
||||
related_human_task = HumanTaskModel.query.filter_by(task_model_id=to_task_model.id).first()
|
||||
if related_human_task is not None:
|
||||
db.session.delete(related_human_task)
|
||||
|
||||
tasks_to_update_ids = [t.id for t in tasks_to_update]
|
||||
human_tasks_to_delete = HumanTaskModel.query.filter(
|
||||
HumanTaskModel.task_model_id.in_(tasks_to_update_ids) # type: ignore
|
||||
).all()
|
||||
for human_task_to_delete in human_tasks_to_delete:
|
||||
db.session.delete(human_task_to_delete)
|
||||
db.session.commit()
|
||||
|
||||
for task_to_update in tasks_to_update:
|
||||
# print(f"task_to_update: {task_to_update}")
|
||||
print(f"task_to_update.state: {task_to_update.state}")
|
||||
TaskService.reset_task_model(task_to_update, state="FUTURE", commit=commit)
|
||||
# TaskService.reset_task_model(task_to_update, state=task_to_update.state, commit=commit)
|
||||
# if task_to_update.task_definition.bpmn_identifier != 'top_level_process_script_after_gate':
|
||||
# TaskService.reset_task_model(task_to_update, state='FUTURE', commit=commit)
|
||||
# else:
|
||||
# TaskService.reset_task_model(task_to_update, state=task_to_update.state, commit=commit)
|
||||
|
||||
parent_task_model = TaskModel.query.filter_by(guid=to_task_model.properties_json["parent"]).first()
|
||||
if parent_task_model is None:
|
||||
raise TaskNotFoundError(
|
||||
f"Cannot find a task with guid '{to_task_guid}' for process instance '{process_instance.id}'"
|
||||
)
|
||||
|
||||
TaskService.reset_task_model(
|
||||
to_task_model,
|
||||
state="READY",
|
||||
json_data_hash=parent_task_model.json_data_hash,
|
||||
python_env_data_hash=parent_task_model.python_env_data_hash,
|
||||
commit=commit,
|
||||
)
|
||||
for task_model in task_models_of_parent_bpmn_processes:
|
||||
TaskService.reset_task_model(task_model, state="WAITING", commit=commit)
|
||||
|
||||
bpmn_process = to_task_model.bpmn_process
|
||||
properties_json = copy.copy(bpmn_process.properties_json)
|
||||
properties_json["last_task"] = parent_task_model.guid
|
||||
bpmn_process.properties_json = properties_json
|
||||
db.session.add(bpmn_process)
|
||||
db.session.commit()
|
||||
|
||||
if commit:
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
processor.save()
|
||||
processor.suspend()
|
||||
#
|
||||
# if commit:
|
||||
# processor = ProcessInstanceProcessor(process_instance)
|
||||
# processor.save()
|
||||
# processor.suspend()
|
||||
|
||||
@staticmethod
|
||||
def get_parser() -> MyCustomParser:
|
||||
|
@ -1897,9 +1894,7 @@ class ProcessInstanceProcessor:
|
|||
all_tasks = self.bpmn_process_instance.get_tasks(TaskState.ANY_MASK)
|
||||
return [t for t in all_tasks if t.state in [TaskState.WAITING, TaskState.READY]]
|
||||
|
||||
def get_task_by_guid(
|
||||
self, task_guid: str
|
||||
) -> Optional[SpiffTask]:
|
||||
def get_task_by_guid(self, task_guid: str) -> Optional[SpiffTask]:
|
||||
return self.bpmn_process_instance.get_task_from_id(UUID(task_guid))
|
||||
|
||||
@classmethod
|
||||
|
|
|
@ -72,7 +72,6 @@ class TaskModelSavingDelegate(EngineStepDelegate):
|
|||
def will_complete_task(self, spiff_task: SpiffTask) -> None:
|
||||
if self._should_update_task_model():
|
||||
self.current_task_start_in_seconds = time.time()
|
||||
# import pdb; pdb.set_trace()
|
||||
spiff_task.task_spec._predict(spiff_task, mask=TaskState.NOT_FINISHED_MASK)
|
||||
if self.secondary_engine_step_delegate:
|
||||
self.secondary_engine_step_delegate.will_complete_task(spiff_task)
|
||||
|
@ -110,7 +109,6 @@ class TaskModelSavingDelegate(EngineStepDelegate):
|
|||
# ):
|
||||
# self._update_task_model_with_spiff_task(waiting_spiff_task)
|
||||
if self.last_completed_spiff_task is not None:
|
||||
# import pdb; pdb.set_trace()
|
||||
self.task_service.process_spiff_task_parent_subprocess_tasks(self.last_completed_spiff_task)
|
||||
self.task_service.process_spiff_task_children(self.last_completed_spiff_task)
|
||||
|
||||
|
|
|
@ -2618,7 +2618,6 @@ class TestProcessApi(BaseTest):
|
|||
)
|
||||
assert response.status_code == 200
|
||||
assert response.json is not None
|
||||
import pdb; pdb.set_trace()
|
||||
assert response.json["status"] == "complete"
|
||||
|
||||
response = client.get(
|
||||
|
|
|
@ -16,7 +16,6 @@ from spiffworkflow_backend.models.group import GroupModel
|
|||
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
|
||||
from spiffworkflow_backend.models.task import TaskModel # noqa: F401
|
||||
from spiffworkflow_backend.models.task_definition import TaskDefinitionModel
|
||||
from spiffworkflow_backend.models.user import UserModel
|
||||
from spiffworkflow_backend.services.authorization_service import AuthorizationService
|
||||
from spiffworkflow_backend.services.authorization_service import (
|
||||
|
@ -258,125 +257,128 @@ class TestProcessInstanceProcessor(BaseTest):
|
|||
assert spiff_task is not None
|
||||
assert spiff_task.state == TaskState.COMPLETED
|
||||
|
||||
def test_properly_resets_process_to_given_task(
|
||||
self,
|
||||
app: Flask,
|
||||
client: FlaskClient,
|
||||
with_db_and_bpmn_file_cleanup: None,
|
||||
with_super_admin_user: UserModel,
|
||||
) -> None:
|
||||
self.create_process_group_with_api(client, with_super_admin_user, "test_group", "test_group")
|
||||
initiator_user = self.find_or_create_user("initiator_user")
|
||||
finance_user_three = self.find_or_create_user("testuser3")
|
||||
assert initiator_user.principal is not None
|
||||
assert finance_user_three.principal is not None
|
||||
AuthorizationService.import_permissions_from_yaml_file()
|
||||
|
||||
finance_group = GroupModel.query.filter_by(identifier="Finance Team").first()
|
||||
assert finance_group is not None
|
||||
|
||||
process_model = load_test_spec(
|
||||
process_model_id="test_group/manual_task",
|
||||
process_model_source_directory="manual_task",
|
||||
)
|
||||
process_instance = self.create_process_instance_from_process_model(
|
||||
process_model=process_model, user=initiator_user
|
||||
)
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
processor.do_engine_steps(save=True)
|
||||
assert len(process_instance.active_human_tasks) == 1
|
||||
initial_human_task_id = process_instance.active_human_tasks[0].id
|
||||
|
||||
# save again to ensure we go attempt to process the human tasks again
|
||||
processor.save()
|
||||
|
||||
assert len(process_instance.active_human_tasks) == 1
|
||||
assert initial_human_task_id == process_instance.active_human_tasks[0].id
|
||||
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
human_task_one = process_instance.active_human_tasks[0]
|
||||
spiff_manual_task = processor.__class__.get_task_by_bpmn_identifier(
|
||||
human_task_one.task_name, processor.bpmn_process_instance
|
||||
)
|
||||
assert spiff_manual_task is not None
|
||||
|
||||
processor.suspend()
|
||||
ProcessInstanceProcessor.reset_process(process_instance, str(spiff_manual_task.parent.id), commit=True)
|
||||
|
||||
process_instance = ProcessInstanceModel.query.filter_by(id=process_instance.id).first()
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
processor.resume()
|
||||
processor.do_engine_steps(save=True)
|
||||
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))
|
||||
ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one)
|
||||
assert process_instance.status == "complete"
|
||||
|
||||
def test_properly_resets_process_to_given_task_with_call_activity(
|
||||
self,
|
||||
app: Flask,
|
||||
client: FlaskClient,
|
||||
with_db_and_bpmn_file_cleanup: None,
|
||||
with_super_admin_user: UserModel,
|
||||
) -> None:
|
||||
self.create_process_group_with_api(client, with_super_admin_user, "test_group", "test_group")
|
||||
initiator_user = self.find_or_create_user("initiator_user")
|
||||
finance_user_three = self.find_or_create_user("testuser3")
|
||||
assert initiator_user.principal is not None
|
||||
assert finance_user_three.principal is not None
|
||||
AuthorizationService.import_permissions_from_yaml_file()
|
||||
|
||||
finance_group = GroupModel.query.filter_by(identifier="Finance Team").first()
|
||||
assert finance_group is not None
|
||||
|
||||
process_model = load_test_spec(
|
||||
process_model_id="test_group/manual_task_with_subprocesses",
|
||||
process_model_source_directory="manual_task_with_subprocesses",
|
||||
)
|
||||
process_instance = self.create_process_instance_from_process_model(
|
||||
process_model=process_model, user=initiator_user
|
||||
)
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
processor.do_engine_steps(save=True)
|
||||
# with open("before_reset.json", 'w') as f: f.write(json.dumps(processor.serialize(), indent=2))
|
||||
assert len(process_instance.active_human_tasks) == 1
|
||||
initial_human_task_id = process_instance.active_human_tasks[0].id
|
||||
assert len(process_instance.active_human_tasks) == 1
|
||||
assert initial_human_task_id == process_instance.active_human_tasks[0].id
|
||||
|
||||
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))
|
||||
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))
|
||||
ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one)
|
||||
|
||||
### NOTES:
|
||||
# somehow we are hosing the task state so that when completing tasks of a subprocess, the task AFTER the subprocess task
|
||||
# is not marked READY but instead stays as FUTURE. Running things like:
|
||||
# self.last_completed_spiff_task.task_spec._update(self.last_completed_spiff_task)
|
||||
# and
|
||||
# self.last_completed_spiff_task.task_spec._predict(self.last_completed_spiff_task, mask=TaskState.NOT_FINISHED_MASK)
|
||||
# did not help.
|
||||
|
||||
processor.suspend()
|
||||
# import pdb; pdb.set_trace()
|
||||
task_model_to_reset_to = TaskModel.query.join(TaskDefinitionModel).filter(TaskDefinitionModel.bpmn_identifier == 'top_level_subprocess_script').order_by(TaskModel.id.desc()).first()
|
||||
assert task_model_to_reset_to is not None
|
||||
ProcessInstanceProcessor.reset_process(process_instance, task_model_to_reset_to.guid, commit=True)
|
||||
# import pdb; pdb.set_trace()
|
||||
|
||||
process_instance = ProcessInstanceModel.query.filter_by(id=process_instance.id).first()
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
processor.resume()
|
||||
processor.do_engine_steps(save=True)
|
||||
import pdb; pdb.set_trace()
|
||||
assert len(process_instance.active_human_tasks) == 1
|
||||
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))
|
||||
ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one)
|
||||
|
||||
assert process_instance.status == "complete"
|
||||
# def test_properly_resets_process_to_given_task(
|
||||
# self,
|
||||
# app: Flask,
|
||||
# client: FlaskClient,
|
||||
# with_db_and_bpmn_file_cleanup: None,
|
||||
# with_super_admin_user: UserModel,
|
||||
# ) -> None:
|
||||
# self.create_process_group_with_api(client, with_super_admin_user, "test_group", "test_group")
|
||||
# initiator_user = self.find_or_create_user("initiator_user")
|
||||
# finance_user_three = self.find_or_create_user("testuser3")
|
||||
# assert initiator_user.principal is not None
|
||||
# assert finance_user_three.principal is not None
|
||||
# AuthorizationService.import_permissions_from_yaml_file()
|
||||
#
|
||||
# finance_group = GroupModel.query.filter_by(identifier="Finance Team").first()
|
||||
# assert finance_group is not None
|
||||
#
|
||||
# process_model = load_test_spec(
|
||||
# process_model_id="test_group/manual_task",
|
||||
# process_model_source_directory="manual_task",
|
||||
# )
|
||||
# process_instance = self.create_process_instance_from_process_model(
|
||||
# process_model=process_model, user=initiator_user
|
||||
# )
|
||||
# processor = ProcessInstanceProcessor(process_instance)
|
||||
# processor.do_engine_steps(save=True)
|
||||
# assert len(process_instance.active_human_tasks) == 1
|
||||
# initial_human_task_id = process_instance.active_human_tasks[0].id
|
||||
#
|
||||
# # save again to ensure we go attempt to process the human tasks again
|
||||
# processor.save()
|
||||
#
|
||||
# assert len(process_instance.active_human_tasks) == 1
|
||||
# assert initial_human_task_id == process_instance.active_human_tasks[0].id
|
||||
#
|
||||
# processor = ProcessInstanceProcessor(process_instance)
|
||||
# human_task_one = process_instance.active_human_tasks[0]
|
||||
# spiff_manual_task = processor.__class__.get_task_by_bpmn_identifier(
|
||||
# human_task_one.task_name, processor.bpmn_process_instance
|
||||
# )
|
||||
# assert spiff_manual_task is not None
|
||||
#
|
||||
# processor.suspend()
|
||||
# ProcessInstanceProcessor.reset_process(process_instance, str(spiff_manual_task.parent.id), commit=True)
|
||||
#
|
||||
# process_instance = ProcessInstanceModel.query.filter_by(id=process_instance.id).first()
|
||||
# processor = ProcessInstanceProcessor(process_instance)
|
||||
# processor.resume()
|
||||
# processor.do_engine_steps(save=True)
|
||||
# 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))
|
||||
# ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one)
|
||||
# assert process_instance.status == "complete"
|
||||
#
|
||||
# def test_properly_resets_process_to_given_task_with_call_activity(
|
||||
# self,
|
||||
# app: Flask,
|
||||
# client: FlaskClient,
|
||||
# with_db_and_bpmn_file_cleanup: None,
|
||||
# with_super_admin_user: UserModel,
|
||||
# ) -> None:
|
||||
# self.create_process_group_with_api(client, with_super_admin_user, "test_group", "test_group")
|
||||
# initiator_user = self.find_or_create_user("initiator_user")
|
||||
# finance_user_three = self.find_or_create_user("testuser3")
|
||||
# assert initiator_user.principal is not None
|
||||
# assert finance_user_three.principal is not None
|
||||
# AuthorizationService.import_permissions_from_yaml_file()
|
||||
#
|
||||
# finance_group = GroupModel.query.filter_by(identifier="Finance Team").first()
|
||||
# assert finance_group is not None
|
||||
#
|
||||
# process_model = load_test_spec(
|
||||
# process_model_id="test_group/manual_task_with_subprocesses",
|
||||
# process_model_source_directory="manual_task_with_subprocesses",
|
||||
# )
|
||||
# process_instance = self.create_process_instance_from_process_model(
|
||||
# process_model=process_model, user=initiator_user
|
||||
# )
|
||||
# processor = ProcessInstanceProcessor(process_instance)
|
||||
# processor.do_engine_steps(save=True)
|
||||
# # with open("before_reset.json", 'w') as f: f.write(json.dumps(processor.serialize(), indent=2))
|
||||
# assert len(process_instance.active_human_tasks) == 1
|
||||
# initial_human_task_id = process_instance.active_human_tasks[0].id
|
||||
# assert len(process_instance.active_human_tasks) == 1
|
||||
# assert initial_human_task_id == process_instance.active_human_tasks[0].id
|
||||
#
|
||||
# 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))
|
||||
# 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))
|
||||
# ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one)
|
||||
#
|
||||
# # NOTES:
|
||||
# # somehow we are hosing the task state so that when completing tasks of a subprocess, the task AFTER the subprocess task
|
||||
# # is not marked READY but instead stays as FUTURE. Running things like:
|
||||
# # self.last_completed_spiff_task.task_spec._update(self.last_completed_spiff_task)
|
||||
# # and
|
||||
# # self.last_completed_spiff_task.task_spec._predict(self.last_completed_spiff_task, mask=TaskState.NOT_FINISHED_MASK)
|
||||
# # did not help.
|
||||
#
|
||||
# processor.suspend()
|
||||
# task_model_to_reset_to = (
|
||||
# TaskModel.query.join(TaskDefinitionModel)
|
||||
# .filter(TaskDefinitionModel.bpmn_identifier == "top_level_subprocess_script")
|
||||
# .order_by(TaskModel.id.desc()) # type: ignore
|
||||
# .first()
|
||||
# )
|
||||
# assert task_model_to_reset_to is not None
|
||||
# ProcessInstanceProcessor.reset_process(process_instance, task_model_to_reset_to.guid, commit=True)
|
||||
#
|
||||
# process_instance = ProcessInstanceModel.query.filter_by(id=process_instance.id).first()
|
||||
# processor = ProcessInstanceProcessor(process_instance)
|
||||
# processor.resume()
|
||||
# processor.do_engine_steps(save=True)
|
||||
#
|
||||
# assert len(process_instance.active_human_tasks) == 1
|
||||
# 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))
|
||||
# ProcessInstanceService.complete_form_task(processor, spiff_manual_task, {}, initiator_user, human_task_one)
|
||||
#
|
||||
# assert process_instance.status == "complete"
|
||||
|
||||
def test_properly_saves_tasks_when_running(
|
||||
self,
|
||||
|
@ -511,17 +513,18 @@ class TestProcessInstanceProcessor(BaseTest):
|
|||
f" {expected_task_data_key}."
|
||||
)
|
||||
|
||||
count_failure_message = (
|
||||
f"{base_failure_message} There are more than 2 entries of this task in the db."
|
||||
" There should only ever be max 2."
|
||||
)
|
||||
task_models_with_bpmn_identifier_count = (
|
||||
TaskModel.query.join(TaskDefinitionModel)
|
||||
.filter(TaskModel.process_instance_id == process_instance_relookup.id)
|
||||
.filter(TaskDefinitionModel.bpmn_identifier == spiff_task.task_spec.name)
|
||||
.count()
|
||||
)
|
||||
assert task_models_with_bpmn_identifier_count < 3, count_failure_message
|
||||
# TODO: add back in when removing MAYBE and LIKELY tasks
|
||||
# count_failure_message = (
|
||||
# f"{base_failure_message} There are more than 2 entries of this task in the db."
|
||||
# " There should only ever be max 2."
|
||||
# )
|
||||
# task_models_with_bpmn_identifier_count = (
|
||||
# TaskModel.query.join(TaskDefinitionModel)
|
||||
# .filter(TaskModel.process_instance_id == process_instance_relookup.id)
|
||||
# .filter(TaskDefinitionModel.bpmn_identifier == spiff_task.task_spec.name)
|
||||
# .count()
|
||||
# )
|
||||
# assert task_models_with_bpmn_identifier_count < 3, count_failure_message
|
||||
task_model = TaskModel.query.filter_by(guid=str(spiff_task.id)).first()
|
||||
|
||||
assert task_model.start_in_seconds is not None
|
||||
|
@ -582,12 +585,13 @@ class TestProcessInstanceProcessor(BaseTest):
|
|||
)
|
||||
assert task_bpmn_identifier in spiff_tasks_checked, message
|
||||
|
||||
task_models_that_are_predicted_count = (
|
||||
TaskModel.query.filter(TaskModel.process_instance_id == process_instance_relookup.id)
|
||||
.filter(TaskModel.state.in_(["LIKELY", "MAYBE"])) # type: ignore
|
||||
.count()
|
||||
)
|
||||
assert task_models_that_are_predicted_count == 0
|
||||
# TODO: add back in when removing MAYBE and LIKELY tasks
|
||||
# task_models_that_are_predicted_count = (
|
||||
# TaskModel.query.filter(TaskModel.process_instance_id == process_instance_relookup.id)
|
||||
# .filter(TaskModel.state.in_(["LIKELY", "MAYBE"])) # type: ignore
|
||||
# .count()
|
||||
# )
|
||||
# assert task_models_that_are_predicted_count == 0
|
||||
|
||||
assert processor.get_data() == data_set_7
|
||||
|
||||
|
@ -729,7 +733,6 @@ class TestProcessInstanceProcessor(BaseTest):
|
|||
spiff_task = processor.get_task_by_guid(human_task_two.task_id)
|
||||
ProcessInstanceService.complete_form_task(processor, spiff_task, {}, initiator_user, human_task_two)
|
||||
|
||||
import pdb; pdb.set_trace()
|
||||
# ensure this does not raise a KeyError
|
||||
processor = ProcessInstanceProcessor(process_instance)
|
||||
assert len(process_instance.active_human_tasks) == 1
|
||||
|
|
|
@ -674,16 +674,16 @@ export default function ProcessInstanceShow({ variant }: OwnProps) {
|
|||
);
|
||||
};
|
||||
|
||||
const canResetProcess = (task: Task) => {
|
||||
// // disabling this feature for now
|
||||
// return false;
|
||||
return (
|
||||
ability.can('POST', targetUris.processInstanceResetPath) &&
|
||||
processInstance &&
|
||||
processInstance.status === 'suspended' &&
|
||||
task.state === 'READY' &&
|
||||
!showingActiveTask()
|
||||
);
|
||||
const canResetProcess = (_task: Task) => {
|
||||
// disabling this feature for now
|
||||
return false;
|
||||
// return (
|
||||
// ability.can('POST', targetUris.processInstanceResetPath) &&
|
||||
// processInstance &&
|
||||
// processInstance.status === 'suspended' &&
|
||||
// task.state === 'READY' &&
|
||||
// !showingActiveTask()
|
||||
// );
|
||||
};
|
||||
|
||||
const getEvents = (task: Task) => {
|
||||
|
|
Loading…
Reference in New Issue