fixed calling subprocesses with forms w/ burnettk

This commit is contained in:
jasquat 2022-09-14 09:14:10 -04:00
parent 32ed8790ce
commit 036055dc59
4 changed files with 60 additions and 13 deletions

View File

@ -27,7 +27,6 @@ from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
) )
from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.active_task import ActiveTaskModel
from spiffworkflow_backend.models.file import FileSchema from spiffworkflow_backend.models.file import FileSchema
from spiffworkflow_backend.models.file import FileType
from spiffworkflow_backend.models.message_instance import MessageInstanceModel from spiffworkflow_backend.models.message_instance import MessageInstanceModel
from spiffworkflow_backend.models.message_model import MessageModel from spiffworkflow_backend.models.message_model import MessageModel
from spiffworkflow_backend.models.message_triggerable_process_model import ( from spiffworkflow_backend.models.message_triggerable_process_model import (
@ -279,7 +278,7 @@ def process_model_file_delete(
def add_file(process_group_id: str, process_model_id: str) -> flask.wrappers.Response: def add_file(process_group_id: str, process_model_id: str) -> flask.wrappers.Response:
"""Add_file.""" """Add_file."""
process_model_service = ProcessModelService() ProcessModelService()
process_model = get_process_model(process_model_id, process_group_id) process_model = get_process_model(process_model_id, process_group_id)
request_file = get_file_from_request() request_file = get_file_from_request()
if not request_file.filename: if not request_file.filename:
@ -331,6 +330,7 @@ def process_instance_run(
try: try:
processor.do_engine_steps() processor.do_engine_steps()
except ApiError as e: except ApiError as e:
ErrorHandlingService().handle_error(processor, e)
raise e raise e
except Exception as e: except Exception as e:
ErrorHandlingService().handle_error(processor, e) ErrorHandlingService().handle_error(processor, e)
@ -775,7 +775,10 @@ def task_show(process_instance_id: int, task_id: str) -> flask.wrappers.Response
task.process_model_display_name = process_model.display_name task.process_model_display_name = process_model.display_name
process_model_with_form = process_model process_model_with_form = process_model
if task.process_name != process_model.primary_process_id: all_processes = SpecFileService.get_all_bpmn_process_identifiers_for_process_model(
process_model
)
if task.process_name not in all_processes:
bpmn_file_full_path = ( bpmn_file_full_path = (
ProcessInstanceProcessor.bpmn_file_full_path_from_bpmn_process_identifier( ProcessInstanceProcessor.bpmn_file_full_path_from_bpmn_process_identifier(
task.process_name task.process_name

View File

@ -72,7 +72,9 @@ from spiffworkflow_backend.services.process_model_service import ProcessModelSer
from spiffworkflow_backend.services.spec_file_service import SpecFileService from spiffworkflow_backend.services.spec_file_service import SpecFileService
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService
# from crc.services.user_file_service import UserFileService
class ProcessInstanceProcessorError(Exception):
"""ProcessInstanceProcessorError."""
class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore
@ -98,8 +100,7 @@ class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore
return super()._evaluate(expression, context) return super()._evaluate(expression, context)
except Exception as exception: except Exception as exception:
if task is None: if task is None:
raise ApiError( raise ProcessInstanceProcessorError(
"error_evaluating_expression",
"Error evaluating expression: " "Error evaluating expression: "
"'%s', exception: %s" % (expression, str(exception)), "'%s', exception: %s" % (expression, str(exception)),
) from exception ) from exception

View File

@ -239,6 +239,54 @@ class SpecFileService(FileSystemService):
retval = True retval = True
return retval return retval
@staticmethod
def append_identifier_of_process_to_array(
process_element: _Element, process_identifiers: list[str]
) -> None:
"""Append_identifier_of_process_to_array."""
process_id_key = "id"
if "name" in process_element.attrib:
process_id_key = "name"
process_identifiers.append(process_element.attrib[process_id_key])
@staticmethod
def get_all_bpmn_process_identifiers_for_process_model(
process_model_info: ProcessModelInfo,
) -> list[str]:
"""Get_all_bpmn_process_identifiers_for_process_model."""
if process_model_info.primary_file_name is None:
return []
binary_data = SpecFileService.get_data(
process_model_info, process_model_info.primary_file_name
)
et_root: EtreeElement = SpecFileService.get_etree_element_from_binary_data(
binary_data, process_model_info.primary_file_name
)
process_identifiers: list[str] = []
for child in et_root:
if child.tag.endswith("process") and child.attrib.get(
"isExecutable", False
):
subprocesses = child.xpath(
"//bpmn:subProcess",
namespaces={"bpmn": "http://www.omg.org/spec/BPMN/20100524/MODEL"},
)
for subprocess in subprocesses:
SpecFileService.append_identifier_of_process_to_array(
subprocess, process_identifiers
)
SpecFileService.append_identifier_of_process_to_array(
child, process_identifiers
)
if len(process_identifiers) == 0:
raise ValidationException("No executable process tag found")
return process_identifiers
@staticmethod @staticmethod
def get_executable_process_elements(et_root: _Element) -> list[_Element]: def get_executable_process_elements(et_root: _Element) -> list[_Element]:
"""Get_executable_process_elements.""" """Get_executable_process_elements."""

View File

@ -1227,16 +1227,11 @@ class TestProcessApi(BaseTest):
assert response.status_code == 400 assert response.status_code == 400
api_error = json.loads(response.get_data(as_text=True)) api_error = json.loads(response.get_data(as_text=True))
assert api_error["code"] == "unknown_exception" assert api_error["code"] == "task_error"
assert "An unknown error occurred." in api_error["message"]
assert ( assert (
'Original error: ApiError: Activity_CauseError: TypeError:can only concatenate str (not "int") to str.' 'Activity_CauseError: TypeError:can only concatenate str (not "int") to str'
in api_error["message"] in api_error["message"]
) )
assert (
"Error in task 'Cause Error' (Activity_CauseError)." in api_error["message"]
)
assert "Error is on line 1. In file error.bpmn." in api_error["message"]
process = ( process = (
db.session.query(ProcessInstanceModel) db.session.query(ProcessInstanceModel)