From d162f0d246ea7f7a1431725374fc720fc2ab2501 Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 27 Sep 2022 15:10:32 -0400 Subject: [PATCH] some cleanup and refactoring w/ burnettk --- poetry.lock | 10 +-- pyproject.toml | 4 +- src/spiffworkflow_backend/api.yml | 90 ++++++++++++------- .../routes/process_api_blueprint.py | 16 ++++ .../services/process_instance_processor.py | 21 ++++- .../services/process_instance_service.py | 52 +---------- .../integration/test_process_api.py | 4 +- 7 files changed, 104 insertions(+), 93 deletions(-) diff --git a/poetry.lock b/poetry.lock index d770cbef..dccb28ed 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1853,7 +1853,7 @@ description = "A workflow framework and BPMN/DMN Processor" category = "main" optional = false python-versions = "*" -develop = false +develop = true [package.dependencies] celery = "*" @@ -1863,10 +1863,8 @@ lxml = "*" pytz = "*" [package.source] -type = "git" -url = "https://github.com/sartography/SpiffWorkflow" -reference = "main" -resolved_reference = "dec9b4b942378d030ae73f1365dfbf108e6f7f8c" +type = "directory" +url = "../SpiffWorkflow" [[package]] name = "sqlalchemy" @@ -2176,7 +2174,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>= [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "7a3c07a2eef00685adbf44b6e26b740e20fc52bf85e916b6c171b13d4fcc6dc9" +content-hash = "645cb811651af21330bcd61e27d293ff280f5fd68997b4f42e3237289ef14212" [metadata.files] alabaster = [ diff --git a/pyproject.toml b/pyproject.toml index 346c0744..9d8a5136 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,9 +27,9 @@ flask-marshmallow = "*" flask-migrate = "*" flask-restful = "*" werkzeug = "*" -SpiffWorkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} +# SpiffWorkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} # SpiffWorkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "feature/dependencies"} -# SpiffWorkflow = {develop = true, path = "/home/jason/projects/github/sartography/SpiffWorkflow"} +SpiffWorkflow = {develop = true, path = "/home/jason/projects/github/sartography/SpiffWorkflow"} sentry-sdk = "1.9.0" sphinx-autoapi = "^1.8.4" # flask-bpmn = {develop = true, path = "/home/jason/projects/github/sartography/flask-bpmn"} diff --git a/src/spiffworkflow_backend/api.yml b/src/spiffworkflow_backend/api.yml index c1498d94..8a4801de 100755 --- a/src/spiffworkflow_backend/api.yml +++ b/src/spiffworkflow_backend/api.yml @@ -171,7 +171,7 @@ paths: schema: type: array items: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" # process_group_add post: operationId: spiffworkflow_backend.routes.process_api_blueprint.process_group_add @@ -182,14 +182,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" responses: "201": description: Processs Group content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" /process-groups/{process_group_id}: parameters: @@ -211,7 +211,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" delete: operationId: spiffworkflow_backend.routes.process_api_blueprint.process_group_delete summary: Deletes a single process group @@ -229,14 +229,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" responses: "200": description: Process group updated successfully content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" /process-models: parameters: @@ -272,25 +272,25 @@ paths: schema: type: array items: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" # process_model_add post: operationId: spiffworkflow_backend.routes.process_api_blueprint.process_model_add - summary: Creates a new workflow specification with the given parameters. + summary: Creates a new process model with the given parameters. tags: - Process Models requestBody: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" responses: "201": - description: Workflow specification created successfully. + description: Process model created successfully. content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" /process-models/{process_group_id}/{process_model_id}/files: parameters: @@ -303,7 +303,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification to validate. + description: The unique id of an existing process model to validate. schema: type: string # add_file @@ -369,7 +369,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" # process_model_delete delete: operationId: spiffworkflow_backend.routes.process_api_blueprint.process_model_delete @@ -393,14 +393,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" responses: "200": description: Process model updated successfully. content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" /process-instances: parameters: @@ -413,7 +413,7 @@ paths: - name: process_model_identifier in: query required: false - description: The unique id of an existing workflow specification. + description: The unique id of an existing process model. schema: type: string - name: page @@ -473,6 +473,34 @@ paths: type: array items: $ref: "#/components/schemas/Workflow" + + # /process-models/{process_group_id}/{process_model_id}/script-unit-tests/run: + # parameters: + # - name: process_group_id + # in: path + # required: true + # description: The unique id of an existing process group + # schema: + # type: string + # - name: process_model_id + # in: path + # required: true + # description: The unique id of an existing process model. + # schema: + # type: string + # post: + # operationId: spiffworkflow_backend.routes.process_api_blueprint.script_unit_test_run + # summary: Run a given script unit test. + # tags: + # - Script Unit Test + # responses: + # "200": + # description: Script Unit Test Result + # content: + # application/json: + # schema: + # $ref: "#/components/schemas/Workflow" + /process-models/{process_group_id}/{process_model_id}/process-instances: parameters: - name: process_group_id @@ -484,7 +512,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification. + description: The unique id of an existing process model. schema: type: string # process_instance_create @@ -558,7 +586,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification. + description: The unique id of an existing process model. schema: type: string - name: process_instance_id @@ -598,7 +626,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification. + description: The unique id of an existing process model. schema: type: string - name: process_instance_id @@ -631,7 +659,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification. + description: The unique id of an existing process model. schema: type: string - name: page @@ -684,7 +712,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification. + description: The unique id of an existing process model. schema: type: string - name: report_identifier @@ -755,7 +783,7 @@ paths: - name: process_model_id in: path required: true - description: The unique id of an existing workflow specification to validate. + description: The unique id of an existing process model to validate. schema: type: string - name: file_name @@ -928,7 +956,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" responses: "200": description: One task @@ -1203,7 +1231,7 @@ components: properties: id: type: string - WorkflowSpecDiffList: + ProcessModelDiffList: properties: workflow_spec_id: type: string @@ -1216,7 +1244,7 @@ components: new: type: boolean example: false - WorkflowSpecFilesList: + ProcessModelFilesList: properties: file_model_id: type: integer @@ -1245,7 +1273,7 @@ components: type: string example: f12e2bbd-a20c-673b-ccb8-a8a1ea9c5b7b - WorkflowSpecFilesDiff: + ProcessModelFilesDiff: properties: filename: type: string @@ -1273,7 +1301,7 @@ components: new: type: boolean example: false - WorkflowSpecAll: + ProcessModelAll: properties: workflow_spec_id: type: string @@ -1377,7 +1405,7 @@ components: x-nullable: true example: Some Value - WorkflowSpec: + ProcessModel: properties: id: type: string @@ -1398,11 +1426,11 @@ components: example: false default: false workflow_spec_category: - $ref: "#/components/schemas/WorkflowSpecCategory" + $ref: "#/components/schemas/ProcessModelCategory" is_status: type: boolean nullable: true - WorkflowSpecCategory: + ProcessModelCategory: properties: id: type: string @@ -1622,7 +1650,7 @@ components: study: $ref: "#/components/schemas/Study" workflow_sec: - $ref: "#/components/schemas/WorkflowSpec" + $ref: "#/components/schemas/ProcessModel" spec_version: type: string action: diff --git a/src/spiffworkflow_backend/routes/process_api_blueprint.py b/src/spiffworkflow_backend/routes/process_api_blueprint.py index 898d9f11..773f44cf 100644 --- a/src/spiffworkflow_backend/routes/process_api_blueprint.py +++ b/src/spiffworkflow_backend/routes/process_api_blueprint.py @@ -964,6 +964,22 @@ def task_submit( return Response(json.dumps({"ok": True}), status=202, mimetype="application/json") +# def script_unit_test_run( +# process_group_id: str, process_model_id: str, body: Dict[str, Union[str, bool, int]] +# ) -> flask.wrappers.Response: +# +# process_model = get_process_model(process_model_id, process_group_id) +# +# # process_model_service = ProcessModelService() +# # process_group = ProcessGroupSchema().load(body) +# # process_model_service.add_process_group(process_group) +# # return Response( +# # json.dumps(ProcessGroupSchema().dump(process_group)), +# # status=201, +# # mimetype="application/json", +# # ) + + def get_file_from_request() -> Any: """Get_file_from_request.""" request_file = connexion.request.files.get("file") diff --git a/src/spiffworkflow_backend/services/process_instance_processor.py b/src/spiffworkflow_backend/services/process_instance_processor.py index 8545445d..c4e1e2ff 100644 --- a/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/src/spiffworkflow_backend/services/process_instance_processor.py @@ -40,6 +40,7 @@ from SpiffWorkflow.spiff.serializer import IntermediateThrowEventConverter from SpiffWorkflow.spiff.serializer import ManualTaskConverter from SpiffWorkflow.spiff.serializer import NoneTaskConverter from SpiffWorkflow.spiff.serializer import ReceiveTaskConverter +from SpiffWorkflow.spiff.serializer import ScriptTaskConverter from SpiffWorkflow.spiff.serializer import SendTaskConverter from SpiffWorkflow.spiff.serializer import ServiceTaskConverter from SpiffWorkflow.spiff.serializer import StartEventConverter @@ -159,6 +160,7 @@ class ProcessInstanceProcessor: ManualTaskConverter, NoneTaskConverter, ReceiveTaskConverter, + ScriptTaskConverter, SendTaskConverter, ServiceTaskConverter, StartEventConverter, @@ -172,6 +174,22 @@ class ProcessInstanceProcessor: PROCESS_INSTANCE_ID_KEY = "process_instance_id" VALIDATION_PROCESS_KEY = "validate_only" + # def create_bpmn_process_instance_from_process_model(): + # spec_info = self.process_model_service.get_process_model( + # process_instance_model.process_model_identifier, process_instance_model.process_group_identifier + # ) + # if spec_info is None: + # raise ( + # ApiError( + # "missing_spec", + # "The spec this process_instance references does not currently exist.", + # ) + # ) + # self.spec_files = SpecFileService.get_files( + # spec_info, include_libraries=True + # ) + # (spec, subprocesses) = self.get_spec(self.spec_files, spec_info) + # __init__ calls these helpers: # * get_spec, which returns a spec and any subprocesses (as IdToBpmnProcessSpecMapping dict) # * __get_bpmn_process_instance, which takes spec and subprocesses and instantiates and returns a BpmnWorkflow @@ -189,7 +207,8 @@ class ProcessInstanceProcessor: subprocesses: Optional[IdToBpmnProcessSpecMapping] = None if process_instance_model.bpmn_json is None: spec_info = self.process_model_service.get_process_model( - process_instance_model.process_model_identifier + process_instance_model.process_model_identifier, + process_instance_model.process_group_identifier, ) if spec_info is None: raise ( diff --git a/src/spiffworkflow_backend/services/process_instance_service.py b/src/spiffworkflow_backend/services/process_instance_service.py index 6db9312b..d5c19ea7 100644 --- a/src/spiffworkflow_backend/services/process_instance_service.py +++ b/src/spiffworkflow_backend/services/process_instance_service.py @@ -8,14 +8,6 @@ from typing import Optional from flask import current_app from flask_bpmn.api.api_error import ApiError from flask_bpmn.models.db import db -from SpiffWorkflow.bpmn.specs.events import EndEvent # type: ignore -from SpiffWorkflow.bpmn.specs.events import StartEvent -from SpiffWorkflow.bpmn.specs.ScriptTask import ScriptTask # type: ignore -from SpiffWorkflow.dmn.specs.BusinessRuleTask import BusinessRuleTask # type: ignore -from SpiffWorkflow.specs import CancelTask # type: ignore -from SpiffWorkflow.specs import StartTask -from SpiffWorkflow.spiff.specs.manual_task import ManualTask # type: ignore -from SpiffWorkflow.spiff.specs.user_task import UserTask # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore @@ -267,30 +259,6 @@ class ProcessInstanceService: return lane_uids - # @staticmethod - # def get_task_type(spiff_task: SpiffTask): - # """Get_task_type.""" - # task_type = spiff_task.task_spec.__class__.__name__ - # - # task_types = [ - # UserTask, - # ManualTask, - # BusinessRuleTask, - # CancelTask, - # ScriptTask, - # StartTask, - # EndEvent, - # StartEvent, - # ] - # - # for t in task_types: - # if isinstance(spiff_task.task_spec, t): - # task_type = t.__name__ - # break - # else: - # task_type = "NoneTask" - # return task_type - @staticmethod def complete_form_task( processor: ProcessInstanceProcessor, @@ -412,25 +380,7 @@ class ProcessInstanceService: spiff_task: SpiffTask, add_docs_and_forms: bool = False ) -> Task: """Spiff_task_to_api_task.""" - task_type = spiff_task.task_spec.__class__.__name__ - - task_types = [ - UserTask, - ManualTask, - BusinessRuleTask, - CancelTask, - ScriptTask, - StartTask, - EndEvent, - StartEvent, - ] - - for t in task_types: - if isinstance(spiff_task.task_spec, t): - task_type = t.__name__ - break - else: - task_type = "NoneTask" + task_type = spiff_task.task_spec.spec_type info = spiff_task.task_info() if info["is_looping"]: diff --git a/tests/spiffworkflow_backend/integration/test_process_api.py b/tests/spiffworkflow_backend/integration/test_process_api.py index f08a66b2..c3c7293f 100644 --- a/tests/spiffworkflow_backend/integration/test_process_api.py +++ b/tests/spiffworkflow_backend/integration/test_process_api.py @@ -1300,7 +1300,7 @@ class TestProcessApi(BaseTest): api_error = json.loads(response.get_data(as_text=True)) assert api_error["code"] == "task_error" assert ( - '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"] ) @@ -1382,7 +1382,7 @@ class TestProcessApi(BaseTest): assert message.subject == "Unexpected error in app" assert ( message.body - == 'Activity_CauseError: TypeError:can only concatenate str (not "int") to str' + == 'Activity_CauseError: TypeError: can only concatenate str (not "int") to str' ) assert message.recipients == process_model.exception_notification_addresses