Squashed 'spiffworkflow-backend/' changes from ffb6d366..d0336039

d0336039 added api endpoint to get the auth list from connector proxy w/ burnettk
ca13f0ca Merge pull request #142 from sartography/bugfix/clean_up_non_existant_workflow_types_and_libraries
304ee66b lint
935c883b migration.
1f99264c Remove all references to the MasterWorkflow, standalone workflows, and libraries, as these concepts should no longer exist.
a7a83a97 Merge branch 'main' of github.com:sartography/spiffworkflow-backend
6ce1cdb0 updated flask-bpmn for new ApiError. w/ burnettk
796735e8 Merge pull request #141 from sartography/bugfix/allow-strptime-in-scripts
5e13a239 Remove the "master_spec"
7e52204f fix bs issue
8cc59eb3 add strptime to script engine

git-subtree-dir: spiffworkflow-backend
git-subtree-split: d0336039c556bf5f19f8db2f32d9b37228e9f057
This commit is contained in:
jasquat 2022-10-18 16:41:10 -04:00
parent aa22f4b397
commit 64e7049c9a
16 changed files with 82 additions and 173 deletions

View File

@ -1,8 +1,8 @@
"""empty message
Revision ID: 07ff3fbef405
Revision ID: b41f0d35641a
Revises:
Create Date: 2022-10-13 07:56:01.234090
Create Date: 2022-10-18 16:16:23.575571
"""
from alembic import op
@ -10,7 +10,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '07ff3fbef405'
revision = 'b41f0d35641a'
down_revision = None
branch_labels = None
depends_on = None

57
poetry.lock generated
View File

@ -95,7 +95,7 @@ python-versions = ">=3.5"
dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"]
docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"]
tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"]
tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
[[package]]
name = "Babel"
@ -268,7 +268,7 @@ optional = false
python-versions = ">=3.6.0"
[package.extras]
unicode_backport = ["unicodedata2"]
unicode-backport = ["unicodedata2"]
[[package]]
name = "classify-imports"
@ -639,7 +639,7 @@ werkzeug = "*"
type = "git"
url = "https://github.com/sartography/flask-bpmn"
reference = "main"
resolved_reference = "f3fc539423a3522d142146d2a039c0cd49badaf5"
resolved_reference = "42cebab51fe469ab9dcb45672917d34c1f30987a"
[[package]]
name = "Flask-Cors"
@ -1512,7 +1512,7 @@ urllib3 = ">=1.21.1,<1.27"
[package.extras]
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
[[package]]
name = "requests-toolbelt"
@ -1625,7 +1625,7 @@ falcon = ["falcon (>=1.4)"]
fastapi = ["fastapi (>=0.79.0)"]
flask = ["blinker (>=1.1)", "flask (>=0.11)"]
httpx = ["httpx (>=0.16.0)"]
pure_eval = ["asttokens", "executing", "pure-eval"]
pure-eval = ["asttokens", "executing", "pure-eval"]
pyspark = ["pyspark (>=2.4.4)"]
quart = ["blinker (>=1.1)", "quart (>=0.16.1)"]
rq = ["rq (>=0.6)"]
@ -1884,19 +1884,19 @@ aiomysql = ["aiomysql", "greenlet (!=0.4.17)"]
aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
asyncio = ["greenlet (!=0.4.17)"]
asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"]
mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"]
mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"]
mssql = ["pyodbc"]
mssql_pymssql = ["pymssql"]
mssql_pyodbc = ["pyodbc"]
mssql-pymssql = ["pymssql"]
mssql-pyodbc = ["pyodbc"]
mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"]
mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"]
mysql_connector = ["mysql-connector-python"]
mysql-connector = ["mysql-connector-python"]
oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"]
postgresql = ["psycopg2 (>=2.7)"]
postgresql_asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"]
postgresql_psycopg2binary = ["psycopg2-binary"]
postgresql_psycopg2cffi = ["psycopg2cffi"]
postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"]
postgresql-psycopg2binary = ["psycopg2-binary"]
postgresql-psycopg2cffi = ["psycopg2cffi"]
pymysql = ["pymysql", "pymysql (<1)"]
sqlcipher = ["sqlcipher3_binary"]
@ -1982,7 +1982,7 @@ test = ["mypy", "pytest", "typing-extensions"]
name = "types-click"
version = "7.1.8"
description = "Typing stubs for click"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -1990,7 +1990,7 @@ python-versions = "*"
name = "types-Flask"
version = "1.1.6"
description = "Typing stubs for Flask"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2003,7 +2003,7 @@ types-Werkzeug = "*"
name = "types-Jinja2"
version = "2.11.9"
description = "Typing stubs for Jinja2"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2014,7 +2014,7 @@ types-MarkupSafe = "*"
name = "types-MarkupSafe"
version = "1.1.10"
description = "Typing stubs for MarkupSafe"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2022,7 +2022,7 @@ python-versions = "*"
name = "types-pytz"
version = "2022.4.0.0"
description = "Typing stubs for pytz"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2030,7 +2030,7 @@ python-versions = "*"
name = "types-PyYAML"
version = "6.0.12"
description = "Typing stubs for PyYAML"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2038,7 +2038,7 @@ python-versions = "*"
name = "types-requests"
version = "2.28.11.1"
description = "Typing stubs for requests"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2049,7 +2049,7 @@ types-urllib3 = "<1.27"
name = "types-urllib3"
version = "1.26.25"
description = "Typing stubs for urllib3"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2057,7 +2057,7 @@ python-versions = "*"
name = "types-Werkzeug"
version = "1.0.9"
description = "Typing stubs for Werkzeug"
category = "main"
category = "dev"
optional = false
python-versions = "*"
@ -2234,7 +2234,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=
[metadata]
lock-version = "1.1"
python-versions = ">=3.9,<3.11"
content-hash = "80df3106c84ea30cfbad3e6d708e136e07b6390c4d0c622aced0abf052d11300"
content-hash = "cff4bcfd10157833f1a0f0bb806c3543267c3e99cc13f311b328d101c30ac553"
[metadata.files]
alabaster = [
@ -3013,18 +3013,7 @@ py = [
{file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
]
pyasn1 = [
{file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"},
{file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"},
{file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"},
{file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"},
{file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"},
{file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"},
{file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"},
{file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"},
{file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"},
{file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"},
{file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"},
{file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"},
{file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"},
]
pycodestyle = [

View File

@ -937,6 +937,20 @@ paths:
schema:
$ref: "#/components/schemas/ServiceTask"
/authentications:
get:
tags:
- Authentications
operationId: spiffworkflow_backend.routes.process_api_blueprint.authentication_list
summary: Gets all available authentications from connector proxy
responses:
"200":
description: All authentications
content:
application/json:
schema:
$ref: "#/components/schemas/ServiceTask"
/tasks/{process_instance_id}/{task_id}:
parameters:
- name: task_id

View File

@ -22,6 +22,10 @@ SPIFFWORKFLOW_FRONTEND_URL = environ.get(
SPIFFWORKFLOW_BACKEND_URL = environ.get(
"SPIFFWORKFLOW_BACKEND_URL", default="http://localhost:7000"
)
# service task connector proxy
CONNECTOR_PROXY_URL = environ.get(
"CONNECTOR_PROXY_URL", default="http://localhost:7004"
)
GIT_COMMIT_ON_SAVE = environ.get("GIT_COMMIT_ON_SAVE", default="false") == "true"
@ -37,11 +41,6 @@ SPIFFWORKFLOW_BACKEND_LOG_TO_FILE = (
environ.get("SPIFFWORKFLOW_BACKEND_LOG_TO_FILE", default="false") == "true"
)
# service task connector proxy
CONNECTOR_PROXY_URL = environ.get(
"CONNECTOR_PROXY_URL", default="http://localhost:7004"
)
SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME = environ.get(
"SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME"
)

View File

@ -31,12 +31,8 @@ class ProcessModelInfo:
description: str
process_group_id: str = ""
process_group: Any | None = None
is_master_spec: bool | None = False
standalone: bool | None = False
library: bool | None = False
primary_file_name: str | None = None
primary_process_id: str | None = None
libraries: list[str] = field(default_factory=list)
display_order: int | None = 0
is_review: bool = False
files: list[File] | None = field(default_factory=list[File])
@ -67,15 +63,11 @@ class ProcessModelInfoSchema(Schema):
id = marshmallow.fields.String(required=True)
display_name = marshmallow.fields.String(required=True)
description = marshmallow.fields.String()
is_master_spec = marshmallow.fields.Boolean(required=True)
standalone = marshmallow.fields.Boolean(required=True)
library = marshmallow.fields.Boolean(required=True)
display_order = marshmallow.fields.Integer(allow_none=True)
primary_file_name = marshmallow.fields.String(allow_none=True)
primary_process_id = marshmallow.fields.String(allow_none=True)
is_review = marshmallow.fields.Boolean(allow_none=True)
process_group_id = marshmallow.fields.String(allow_none=True)
libraries = marshmallow.fields.List(marshmallow.fields.String(), allow_none=True)
files = marshmallow.fields.List(marshmallow.fields.Nested("FileSchema"))
fault_or_suspend_on_exception = marshmallow.fields.String()
exception_notification_addresses = marshmallow.fields.List(

View File

@ -774,6 +774,17 @@ def service_tasks_show() -> flask.wrappers.Response:
)
def authentication_list() -> flask.wrappers.Response:
"""Authentication_list."""
available_authentications = ServiceTaskService.authentication_list()
response_json = {
"results": available_authentications,
"connector_proxy_base_url": current_app.config["CONNECTOR_PROXY_URL"],
}
return Response(json.dumps(response_json), status=200, mimetype="application/json")
def process_instance_report_show(
process_group_id: str,
process_model_id: str,

View File

@ -20,11 +20,6 @@ class FileSystemService:
""" Simple Service meant for extension that provides some useful
methods for dealing with the File system.
"""
LIBRARY_SPECS = "Library Specs"
STAND_ALONE_SPECS = "Stand Alone"
MASTER_SPECIFICATION = "Master Specification"
REFERENCE_FILES = "Reference Files"
SPECIAL_FOLDERS = [LIBRARY_SPECS, MASTER_SPECIFICATION, REFERENCE_FILES]
CAT_JSON_FILE = "process_group.json"
WF_JSON_FILE = "workflow.json"
@ -41,13 +36,6 @@ class FileSystemService:
"""Category_path."""
return os.path.join(FileSystemService.root_path(), name)
@staticmethod
def library_path(name: str) -> str:
"""Library_path."""
return os.path.join(
FileSystemService.root_path(), FileSystemService.LIBRARY_SPECS, name
)
@staticmethod
def full_path_from_relative_path(relative_path: str) -> str:
"""Full_path_from_relative_path."""
@ -66,32 +54,13 @@ class FileSystemService:
@staticmethod
def process_group_path_for_spec(spec: ProcessModelInfo) -> str:
"""Category_path_for_spec."""
if spec.is_master_spec:
return os.path.join(FileSystemService.root_path())
elif spec.library:
process_group_path = FileSystemService.process_group_path(
FileSystemService.LIBRARY_SPECS
)
elif spec.standalone:
process_group_path = FileSystemService.process_group_path(
FileSystemService.STAND_ALONE_SPECS
)
else:
process_group_path = FileSystemService.process_group_path(
spec.process_group_id
)
return process_group_path
return FileSystemService.process_group_path(spec.process_group_id)
@staticmethod
def workflow_path(spec: ProcessModelInfo) -> str:
"""Workflow_path."""
if spec.is_master_spec:
return os.path.join(
FileSystemService.root_path(), FileSystemService.MASTER_SPECIFICATION
)
else:
process_group_path = FileSystemService.process_group_path_for_spec(spec)
return os.path.join(process_group_path, spec.id)
process_group_path = FileSystemService.process_group_path_for_spec(spec)
return os.path.join(process_group_path, spec.id)
@staticmethod
def full_path_to_process_model_file(spec: ProcessModelInfo, file_name: str) -> str:

View File

@ -1,4 +1,5 @@
"""Process_instance_processor."""
import _strptime # type: ignore
import decimal
import json
import logging
@ -95,6 +96,7 @@ DEFAULT_GLOBALS.update(
"datetime": datetime,
"time": time,
"decimal": decimal,
"_strptime": _strptime,
}
)
# This will overwrite the standard builtins
@ -343,9 +345,7 @@ class ProcessInstanceProcessor:
f"The given process model was not found: {process_group_identifier}/{process_model_identifier}.",
)
)
spec_files = SpecFileService.get_files(
process_model_info, include_libraries=True
)
spec_files = SpecFileService.get_files(process_model_info)
return cls.get_spec(spec_files, process_model_info)
@classmethod

View File

@ -217,9 +217,6 @@ class ProcessInstanceService:
message="A process instance must have a user_id.",
task=spiff_task,
)
# # Standalone workflow - we only care about the current user
# elif processor.workflow_model.study_id is None and processor.workflow_model.user_id is not None:
# return [processor.workflow_model.user_id]
# Workflow associated with a study - get all the users
else:

View File

@ -63,12 +63,6 @@ class ProcessModelService(FileSystemService):
def save_process_model(self, process_model: ProcessModelInfo) -> None:
"""Save_process_model."""
spec_path = self.workflow_path(process_model)
if (
process_model.is_master_spec
or process_model.library
or process_model.standalone
):
process_model.process_group_id = ""
os.makedirs(spec_path, exist_ok=True)
json_path = os.path.join(spec_path, self.WF_JSON_FILE)
with open(json_path, "w") as wf_json:
@ -90,20 +84,6 @@ class ProcessModelService(FileSystemService):
path = self.workflow_path(process_model)
shutil.rmtree(path)
@property
def master_spec(self) -> Optional[ProcessModelInfo]:
"""Master_spec."""
return self.get_master_spec()
def get_master_spec(self) -> Optional[ProcessModelInfo]:
"""Get_master_spec."""
path = os.path.join(
FileSystemService.root_path(), FileSystemService.MASTER_SPECIFICATION
)
if os.path.exists(path):
return self.__scan_spec(path, FileSystemService.MASTER_SPECIFICATION)
return None
@classmethod
def get_process_model_from_relative_path(
cls, relative_path: str
@ -121,9 +101,6 @@ class ProcessModelService(FileSystemService):
if not os.path.exists(FileSystemService.root_path()):
raise ProcessEntityNotFoundError("process_model_not_found")
master_spec = self.get_master_spec()
if master_spec and master_spec.id == process_model_id:
return master_spec
if group_id is not None:
process_group = self.get_process_group(group_id)
if process_group is not None:
@ -168,20 +145,6 @@ class ProcessModelService(FileSystemService):
process_groups.sort()
return process_groups
def get_libraries(self) -> List[ProcessModelInfo]:
"""Get_libraries."""
process_group = self.get_process_group(self.LIBRARY_SPECS)
if not process_group:
return []
return process_group.process_models
def get_standalones(self) -> List[ProcessModelInfo]:
"""Get_standalones."""
process_group = self.get_process_group(self.STAND_ALONE_SPECS)
if not process_group:
return []
return process_group.process_models
def get_process_group(self, process_group_id: str) -> ProcessGroup:
"""Look for a given process_group, and return it."""
if os.path.exists(FileSystemService.root_path()):
@ -240,14 +203,6 @@ class ProcessModelService(FileSystemService):
process_groups = []
for item in directory_items:
if item.is_dir() and not item.name[0] == ".":
# if item.name == self.REFERENCE_FILES:
# continue
# elif item.name == self.MASTER_SPECIFICATION:
# continue
# elif item.name == self.LIBRARY_SPECS:
# continue
# elif item.name == self.STAND_ALONE_SPECS:
# continue
process_groups.append(self.__scan_process_group(item))
return process_groups
@ -292,7 +247,6 @@ class ProcessModelService(FileSystemService):
) -> ProcessModelInfo:
"""__scan_spec."""
spec_path = os.path.join(path, self.WF_JSON_FILE)
is_master = FileSystemService.MASTER_SPECIFICATION in spec_path
if os.path.exists(spec_path):
with open(spec_path) as wf_json:
@ -312,14 +266,10 @@ class ProcessModelService(FileSystemService):
spec = ProcessModelInfo(
id=name,
library=False,
standalone=False,
is_master_spec=is_master,
display_name=name,
description="",
display_order=0,
is_review=False,
libraries=[],
)
with open(spec_path, "w") as wf_json:
json.dump(self.WF_SCHEMA.dump(spec), wf_json, indent=4)

View File

@ -9,6 +9,10 @@ from spiffworkflow_backend.services.file_system_service import FileSystemService
from spiffworkflow_backend.services.secret_service import SecretService
class ConnectorProxyError(Exception):
"""ConnectorProxyError."""
def connector_proxy_url() -> Any:
"""Returns the connector proxy url."""
return current_app.config["CONNECTOR_PROXY_URL"]
@ -73,3 +77,18 @@ class ServiceTaskService:
except Exception as e:
print(e)
return []
@staticmethod
def authentication_list() -> Any:
"""Returns a list of available authentications."""
try:
response = requests.get(f"{connector_proxy_url()}/v1/auths")
if response.status_code != 200:
return []
parsed_response = json.loads(response.text)
return parsed_response
except Exception as exception:
current_app.logger.error(exception)
raise ConnectorProxyError(exception.__class__.__name__) from exception

View File

@ -39,22 +39,15 @@ class SpecFileService(FileSystemService):
def get_files(
process_model_info: ProcessModelInfo,
file_name: Optional[str] = None,
include_libraries: bool = False,
extension_filter: str = "",
) -> List[File]:
"""Return all files associated with a workflow specification."""
path = SpecFileService.workflow_path(process_model_info)
files = SpecFileService._get_files(path, file_name)
if include_libraries:
for lib_name in process_model_info.libraries:
lib_path = SpecFileService.library_path(lib_name)
files.extend(SpecFileService._get_files(lib_path, file_name))
if extension_filter != "":
files = list(
filter(lambda file: file.name.endswith(extension_filter), files)
)
return files
@staticmethod
@ -96,13 +89,6 @@ class SpecFileService(FileSystemService):
def get_data(process_model_info: ProcessModelInfo, file_name: str) -> bytes:
"""Get_data."""
file_path = SpecFileService.file_path(process_model_info, file_name)
if not os.path.exists(file_path):
# If the file isn't here, it may be in a library
for lib in process_model_info.libraries:
file_path = SpecFileService.library_path(lib)
file_path = os.path.join(file_path, file_name)
if os.path.exists(file_path):
break
if not os.path.exists(file_path):
raise ApiError(
"unknown_file",

View File

@ -115,11 +115,7 @@ class BaseTest:
display_name=process_model_display_name,
description=process_model_description,
process_group_id=process_group.id,
standalone=False,
is_review=False,
is_master_spec=False,
libraries=[],
library=False,
primary_process_id=primary_process_id,
primary_file_name=primary_file_name,
fault_or_suspend_on_exception=fault_or_suspend_on_exception,

View File

@ -18,12 +18,9 @@ class ExampleDataLoader:
process_model_id: str,
display_name: str = "",
description: str = "",
master_spec: bool = False,
process_group_id: str = "",
display_order: int = 0,
from_tests: bool = False,
standalone: bool = False,
library: bool = False,
bpmn_file_name: Optional[str] = None,
process_model_source_directory: Optional[str] = None,
) -> ProcessModelInfo:
@ -38,11 +35,7 @@ class ExampleDataLoader:
description=description,
process_group_id=process_group_id,
display_order=display_order,
is_master_spec=master_spec,
standalone=standalone,
library=library,
is_review=False,
libraries=[],
)
workflow_spec_service = ProcessModelService()
workflow_spec_service.add_spec(spec)

View File

@ -37,9 +37,7 @@ def assure_process_group_exists(process_group_id: Optional[str] = None) -> Proce
def load_test_spec(
process_model_id: str,
master_spec: bool = False,
process_group_id: Optional[str] = None,
library: bool = False,
bpmn_file_name: Optional[str] = None,
process_model_source_directory: Optional[str] = None,
) -> ProcessModelInfo:
@ -48,9 +46,8 @@ def load_test_spec(
process_model_service = ProcessModelService()
if process_group_id is None:
process_group_id = "test_process_group_id"
if not master_spec and not library:
process_group = assure_process_group_exists(process_group_id)
process_group_id = process_group.id
process_group = assure_process_group_exists(process_group_id)
process_group_id = process_group.id
try:
return process_model_service.get_process_model(
@ -59,11 +56,9 @@ def load_test_spec(
except ProcessEntityNotFoundError:
spec = ExampleDataLoader().create_spec(
process_model_id=process_model_id,
master_spec=master_spec,
from_tests=True,
display_name=process_model_id,
process_group_id=process_group_id,
library=library,
bpmn_file_name=bpmn_file_name,
process_model_source_directory=process_model_source_directory,
)

View File

@ -20,7 +20,6 @@ class TestProcessModel(BaseTest):
id="model_one", display_name="Model One"
)
assert process_model_one.files == []
assert process_model_one.libraries == []
def test_can_run_process_model_with_call_activities_when_in_same_process_model_directory(
self, app: Flask, with_db_and_bpmn_file_cleanup: None