diff --git a/src/spiffworkflow_backend/api.yml b/src/spiffworkflow_backend/api.yml index d26a0abc..9d15bdb9 100755 --- a/src/spiffworkflow_backend/api.yml +++ b/src/spiffworkflow_backend/api.yml @@ -327,6 +327,32 @@ paths: schema: $ref: "#/components/schemas/ProcessModel" + /process-models-natural-language/{modified_process_group_id}: + parameters: + - name: modified_process_group_id + in: path + required: true + description: modified id of an existing process group + schema: + type: string + post: + operationId: spiffworkflow_backend.routes.process_models_controller.process_model_create_with_natural_language + summary: Creates a new process model with the given parameters. + tags: + - Process Models + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessModel" + responses: + "201": + description: Process model created successfully. + content: + application/json: + schema: + $ref: "#/components/schemas/ProcessModel" + /process-models/{modified_process_model_identifier}/files: parameters: - name: modified_process_model_identifier diff --git a/src/spiffworkflow_backend/routes/process_models_controller.py b/src/spiffworkflow_backend/routes/process_models_controller.py index ba0fe346..b1666933 100644 --- a/src/spiffworkflow_backend/routes/process_models_controller.py +++ b/src/spiffworkflow_backend/routes/process_models_controller.py @@ -1,5 +1,6 @@ """APIs for dealing with process groups, process models, and process instances.""" import json +import re from typing import Any from typing import Dict from typing import Optional @@ -299,10 +300,66 @@ def process_model_file_show( file_contents = SpecFileService.get_data(process_model, file.name) file.file_contents = file_contents file.process_model_id = process_model.id - # file.process_group_id = process_model.process_group_id return FileSchema().dump(file) +# { +# "natural_language_text": "Create a bug tracker process model with a bug-details form that collects summary, description, and priority" +# } +def process_model_create_with_natural_language( + modified_process_group_id: str, body: Dict[str, Union[str, bool, int]] +) -> flask.wrappers.Response: + # body_include_list = [ + # "id", + # "display_name", + # "primary_file_name", + # "primary_process_id", + # "description", + # "metadata_extraction_paths", + # ] + # body_filtered = { + # include_item: body[include_item] + # for include_item in body_include_list + # if include_item in body + # } + + pattern = re.compile(r"Create a (?P.*?) process model with a (?P.*?) form that collects (?P.*)") + match = pattern.match(body["natural_language_text"]) + process_model_display_name = match.group('pm_name') + process_model_identifier = re.sub(r"[ _]", '-', process_model_display_name) + process_model_identifier = re.sub(r"-{2,}", '-', process_model_identifier).lower() + print(f"process_model_identifier: {process_model_identifier}") + + form_name = match.group('form_name') + form_identifier = re.sub(r"[ _]", '-', form_name) + form_identifier = re.sub(r"-{2,}", '-', form_identifier).lower() + print(f"form_identifier: {form_identifier}") + + column_names = match.group('columns_hey') + print(f"column_names: {column_names}") + columns = re.sub(r"(, (and )?)", ',', column_names).split(',') + print(f"columns: {columns}") + # + # if modified_process_group_id is None: + # raise ApiError( + # error_code="process_group_id_not_specified", + # message="Process Model could not be created when process_group_id path param is unspecified", + # status_code=400, + # ) + # + # unmodified_process_group_id = _un_modify_modified_process_model_id( + # modified_process_group_id + # ) + # process_group = ProcessModelService.get_process_group(unmodified_process_group_id) + # if process_group is None: + # raise ApiError( + # error_code="process_model_could_not_be_created", + # message=f"Process Model could not be created from given body because Process Group could not be found: {body}", + # status_code=400, + # ) + + + def _get_file_from_request() -> Any: """Get_file_from_request.""" request_file = connexion.request.files.get("file") diff --git a/tests/spiffworkflow_backend/integration/test_process_api.py b/tests/spiffworkflow_backend/integration/test_process_api.py index b9c0f1b7..6c3d8f27 100644 --- a/tests/spiffworkflow_backend/integration/test_process_api.py +++ b/tests/spiffworkflow_backend/integration/test_process_api.py @@ -163,6 +163,37 @@ class TestProcessApi(BaseTest): assert process_model.primary_file_name == bpmn_file_name assert process_model.primary_process_id == "sample" + def test_process_model_create_with_natural_language( + self, + app: Flask, + client: FlaskClient, + with_db_and_bpmn_file_cleanup: None, + with_super_admin_user: UserModel, + ) -> None: + process_group_id = "test_process_group" + process_group_description = "Test Process Group" + process_model_id = "sample" + process_model_identifier = f"{process_group_id}/{process_model_id}" + self.create_process_group( + client, with_super_admin_user, process_group_id, process_group_description + ) + + body = { + "natural_language_text": "Create a Bug Tracker process model with a Bug Details form that collects summary, description, and priority" + } + self.create_process_model_with_api( + client, + process_model_id=process_model_identifier, + user=with_super_admin_user, + ) + response = client.post( + f"/v1.0/process-models-natural-language/{process_group_id}", + content_type="application/json", + data=json.dumps(body), + headers=self.logged_in_headers(with_super_admin_user), + ) + assert response.status_code == 201 + def test_primary_process_id_updates_via_xml( self, app: Flask, @@ -250,9 +281,6 @@ class TestProcessApi(BaseTest): assert response.json is not None assert response.json["ok"] is True - # assert we no longer have a model - with pytest.raises(ProcessEntityNotFoundError): - ProcessModelService.get_process_model(process_model_identifier) def test_process_model_delete_with_instances( self,