Merge branch 'main' of github.com:sartography/spiff-arena

This commit is contained in:
jasquat 2022-11-18 16:40:53 -05:00
commit aa54abb7db
88 changed files with 731 additions and 563 deletions

View File

@ -2,7 +2,6 @@
import csv import csv
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend import get_hacked_up_app_for_script from spiffworkflow_backend import get_hacked_up_app_for_script
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel

View File

@ -2,7 +2,6 @@
import time import time
from apscheduler.schedulers.background import BlockingScheduler # type: ignore from apscheduler.schedulers.background import BlockingScheduler # type: ignore
from spiffworkflow_backend import create_app from spiffworkflow_backend import create_app
from spiffworkflow_backend import start_scheduler from spiffworkflow_backend import start_scheduler
from spiffworkflow_backend.helpers.db_helper import try_to_connect from spiffworkflow_backend.helpers.db_helper import try_to_connect

View File

@ -1,22 +0,0 @@
"""Updates all JSON files, based on the current state of BPMN_SPEC_ABSOLUTE_DIR."""
from spiffworkflow_backend import get_hacked_up_app_for_script
from spiffworkflow_backend.services.process_model_service import ProcessModelService
def main() -> None:
"""Main."""
app = get_hacked_up_app_for_script()
with app.app_context():
groups = ProcessModelService().get_process_groups()
for group in groups:
for process_model in group.process_models:
update_items = {
"process_group_id": "",
"id": f"{group.id}/{process_model.id}",
}
ProcessModelService().update_spec(process_model, update_items)
if __name__ == "__main__":
main()

View File

@ -7,8 +7,6 @@ from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.active_task_user import ActiveTaskUserModel from spiffworkflow_backend.models.active_task_user import ActiveTaskUserModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
@ -19,6 +17,7 @@ from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
# from tests.spiffworkflow_backend.helpers.test_data import load_test_spec # from tests.spiffworkflow_backend.helpers.test_data import load_test_spec

View File

@ -1,9 +1,8 @@
import logging import logging
from logging.config import fileConfig from logging.config import fileConfig
from flask import current_app
from alembic import context from alembic import context
from flask import current_app
# this is the Alembic Config object, which provides # this is the Alembic Config object, which provides
# access to the values within the .ini file in use. # access to the values within the .ini file in use.
@ -12,17 +11,17 @@ config = context.config
# Interpret the config file for Python logging. # Interpret the config file for Python logging.
# This line sets up loggers basically. # This line sets up loggers basically.
fileConfig(config.config_file_name) fileConfig(config.config_file_name)
logger = logging.getLogger('alembic.env') logger = logging.getLogger("alembic.env")
# add your model's MetaData object here # add your model's MetaData object here
# for 'autogenerate' support # for 'autogenerate' support
# from myapp import mymodel # from myapp import mymodel
# target_metadata = mymodel.Base.metadata # target_metadata = mymodel.Base.metadata
config.set_main_option( config.set_main_option(
'sqlalchemy.url', "sqlalchemy.url",
str(current_app.extensions['migrate'].db.get_engine().url).replace( str(current_app.extensions["migrate"].db.get_engine().url).replace("%", "%%"),
'%', '%%')) )
target_metadata = current_app.extensions['migrate'].db.metadata target_metadata = current_app.extensions["migrate"].db.metadata
# other values from the config, defined by the needs of env.py, # other values from the config, defined by the needs of env.py,
# can be acquired: # can be acquired:
@ -43,9 +42,7 @@ def run_migrations_offline():
""" """
url = config.get_main_option("sqlalchemy.url") url = config.get_main_option("sqlalchemy.url")
context.configure( context.configure(url=url, target_metadata=target_metadata, literal_binds=True)
url=url, target_metadata=target_metadata, literal_binds=True
)
with context.begin_transaction(): with context.begin_transaction():
context.run_migrations() context.run_migrations()
@ -63,20 +60,20 @@ def run_migrations_online():
# when there are no changes to the schema # when there are no changes to the schema
# reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html
def process_revision_directives(context, revision, directives): def process_revision_directives(context, revision, directives):
if getattr(config.cmd_opts, 'autogenerate', False): if getattr(config.cmd_opts, "autogenerate", False):
script = directives[0] script = directives[0]
if script.upgrade_ops.is_empty(): if script.upgrade_ops.is_empty():
directives[:] = [] directives[:] = []
logger.info('No changes in schema detected.') logger.info("No changes in schema detected.")
connectable = current_app.extensions['migrate'].db.get_engine() connectable = current_app.extensions["migrate"].db.get_engine()
with connectable.connect() as connection: with connectable.connect() as connection:
context.configure( context.configure(
connection=connection, connection=connection,
target_metadata=target_metadata, target_metadata=target_metadata,
process_revision_directives=process_revision_directives, process_revision_directives=process_revision_directives,
**current_app.extensions['migrate'].configure_args **current_app.extensions["migrate"].configure_args
) )
with context.begin_transaction(): with context.begin_transaction():

View File

@ -5,12 +5,12 @@ Revises:
Create Date: 2022-11-15 14:11:47.309399 Create Date: 2022-11-15 14:11:47.309399
""" """
from alembic import op
import sqlalchemy as sa import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = 'b7790c9c8174' revision = "b7790c9c8174"
down_revision = None down_revision = None
branch_labels = None branch_labels = None
depends_on = None depends_on = None
@ -18,305 +18,562 @@ depends_on = None
def upgrade(): def upgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.create_table('group', op.create_table(
sa.Column('id', sa.Integer(), nullable=False), "group",
sa.Column('name', sa.String(length=255), nullable=True), sa.Column("id", sa.Integer(), nullable=False),
sa.Column('identifier', sa.String(length=255), nullable=True), sa.Column("name", sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('id') sa.Column("identifier", sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint("id"),
) )
op.create_table('message_model', op.create_table(
sa.Column('id', sa.Integer(), nullable=False), "message_model",
sa.Column('identifier', sa.String(length=50), nullable=True), sa.Column("id", sa.Integer(), nullable=False),
sa.Column('name', sa.String(length=50), nullable=True), sa.Column("identifier", sa.String(length=50), nullable=True),
sa.PrimaryKeyConstraint('id') sa.Column("name", sa.String(length=50), nullable=True),
sa.PrimaryKeyConstraint("id"),
) )
op.create_index(op.f('ix_message_model_identifier'), 'message_model', ['identifier'], unique=True) op.create_index(
op.create_index(op.f('ix_message_model_name'), 'message_model', ['name'], unique=True) op.f("ix_message_model_identifier"),
op.create_table('permission_target', "message_model",
sa.Column('id', sa.Integer(), nullable=False), ["identifier"],
sa.Column('uri', sa.String(length=255), nullable=False), unique=True,
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('uri')
) )
op.create_table('spec_reference_cache', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_message_model_name"), "message_model", ["name"], unique=True
sa.Column('identifier', sa.String(length=255), nullable=True),
sa.Column('display_name', sa.String(length=255), nullable=True),
sa.Column('process_model_id', sa.String(length=255), nullable=True),
sa.Column('type', sa.String(length=255), nullable=True),
sa.Column('file_name', sa.String(length=255), nullable=True),
sa.Column('relative_path', sa.String(length=255), nullable=True),
sa.Column('has_lanes', sa.Boolean(), nullable=True),
sa.Column('is_executable', sa.Boolean(), nullable=True),
sa.Column('is_primary', sa.Boolean(), nullable=True),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('identifier', 'type', name='_identifier_type_unique')
) )
op.create_index(op.f('ix_spec_reference_cache_display_name'), 'spec_reference_cache', ['display_name'], unique=False) op.create_table(
op.create_index(op.f('ix_spec_reference_cache_identifier'), 'spec_reference_cache', ['identifier'], unique=False) "permission_target",
op.create_index(op.f('ix_spec_reference_cache_type'), 'spec_reference_cache', ['type'], unique=False) sa.Column("id", sa.Integer(), nullable=False),
op.create_table('spiff_logging', sa.Column("uri", sa.String(length=255), nullable=False),
sa.Column('id', sa.Integer(), nullable=False), sa.PrimaryKeyConstraint("id"),
sa.Column('process_instance_id', sa.Integer(), nullable=False), sa.UniqueConstraint("uri"),
sa.Column('bpmn_process_identifier', sa.String(length=255), nullable=False),
sa.Column('bpmn_task_identifier', sa.String(length=255), nullable=False),
sa.Column('bpmn_task_name', sa.String(length=255), nullable=True),
sa.Column('bpmn_task_type', sa.String(length=255), nullable=True),
sa.Column('spiff_task_guid', sa.String(length=50), nullable=False),
sa.Column('timestamp', sa.DECIMAL(precision=17, scale=6), nullable=False),
sa.Column('message', sa.String(length=255), nullable=True),
sa.Column('current_user_id', sa.Integer(), nullable=True),
sa.Column('spiff_step', sa.Integer(), nullable=False),
sa.PrimaryKeyConstraint('id')
) )
op.create_table('user', op.create_table(
sa.Column('id', sa.Integer(), nullable=False), "spec_reference_cache",
sa.Column('username', sa.String(length=255), nullable=False), sa.Column("id", sa.Integer(), nullable=False),
sa.Column('uid', sa.String(length=50), nullable=True), sa.Column("identifier", sa.String(length=255), nullable=True),
sa.Column('service', sa.String(length=50), nullable=False), sa.Column("display_name", sa.String(length=255), nullable=True),
sa.Column('service_id', sa.String(length=255), nullable=False), sa.Column("process_model_id", sa.String(length=255), nullable=True),
sa.Column('name', sa.String(length=255), nullable=True), sa.Column("type", sa.String(length=255), nullable=True),
sa.Column('email', sa.String(length=255), nullable=True), sa.Column("file_name", sa.String(length=255), nullable=True),
sa.PrimaryKeyConstraint('id'), sa.Column("relative_path", sa.String(length=255), nullable=True),
sa.UniqueConstraint('service', 'service_id', name='service_key'), sa.Column("has_lanes", sa.Boolean(), nullable=True),
sa.UniqueConstraint('uid'), sa.Column("is_executable", sa.Boolean(), nullable=True),
sa.UniqueConstraint('username') sa.Column("is_primary", sa.Boolean(), nullable=True),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("identifier", "type", name="_identifier_type_unique"),
) )
op.create_table('message_correlation_property', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_spec_reference_cache_display_name"),
sa.Column('identifier', sa.String(length=50), nullable=True), "spec_reference_cache",
sa.Column('message_model_id', sa.Integer(), nullable=False), ["display_name"],
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True), unique=False,
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['message_model_id'], ['message_model.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('identifier', 'message_model_id', name='message_correlation_property_unique')
) )
op.create_index(op.f('ix_message_correlation_property_identifier'), 'message_correlation_property', ['identifier'], unique=False) op.create_index(
op.create_table('message_triggerable_process_model', op.f("ix_spec_reference_cache_identifier"),
sa.Column('id', sa.Integer(), nullable=False), "spec_reference_cache",
sa.Column('message_model_id', sa.Integer(), nullable=False), ["identifier"],
sa.Column('process_model_identifier', sa.String(length=50), nullable=False), unique=False,
sa.Column('process_group_identifier', sa.String(length=50), nullable=False),
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True),
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['message_model_id'], ['message_model.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('message_model_id')
) )
op.create_index(op.f('ix_message_triggerable_process_model_process_group_identifier'), 'message_triggerable_process_model', ['process_group_identifier'], unique=False) op.create_index(
op.create_index(op.f('ix_message_triggerable_process_model_process_model_identifier'), 'message_triggerable_process_model', ['process_model_identifier'], unique=False) op.f("ix_spec_reference_cache_type"),
op.create_table('principal', "spec_reference_cache",
sa.Column('id', sa.Integer(), nullable=False), ["type"],
sa.Column('user_id', sa.Integer(), nullable=True), unique=False,
sa.Column('group_id', sa.Integer(), nullable=True),
sa.CheckConstraint('NOT(user_id IS NULL AND group_id IS NULL)'),
sa.ForeignKeyConstraint(['group_id'], ['group.id'], ),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('group_id'),
sa.UniqueConstraint('user_id')
) )
op.create_table('process_instance', op.create_table(
sa.Column('id', sa.Integer(), nullable=False), "spiff_logging",
sa.Column('process_model_identifier', sa.String(length=255), nullable=False), sa.Column("id", sa.Integer(), nullable=False),
sa.Column('process_group_identifier', sa.String(length=50), nullable=False), sa.Column("process_instance_id", sa.Integer(), nullable=False),
sa.Column('process_initiator_id', sa.Integer(), nullable=False), sa.Column("bpmn_process_identifier", sa.String(length=255), nullable=False),
sa.Column('bpmn_json', sa.JSON(), nullable=True), sa.Column("bpmn_task_identifier", sa.String(length=255), nullable=False),
sa.Column('start_in_seconds', sa.Integer(), nullable=True), sa.Column("bpmn_task_name", sa.String(length=255), nullable=True),
sa.Column('end_in_seconds', sa.Integer(), nullable=True), sa.Column("bpmn_task_type", sa.String(length=255), nullable=True),
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True), sa.Column("spiff_task_guid", sa.String(length=50), nullable=False),
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True), sa.Column("timestamp", sa.DECIMAL(precision=17, scale=6), nullable=False),
sa.Column('status', sa.String(length=50), nullable=True), sa.Column("message", sa.String(length=255), nullable=True),
sa.Column('bpmn_version_control_type', sa.String(length=50), nullable=True), sa.Column("current_user_id", sa.Integer(), nullable=True),
sa.Column('bpmn_version_control_identifier', sa.String(length=255), nullable=True), sa.Column("spiff_step", sa.Integer(), nullable=False),
sa.Column('spiff_step', sa.Integer(), nullable=True), sa.PrimaryKeyConstraint("id"),
sa.ForeignKeyConstraint(['process_initiator_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id')
) )
op.create_index(op.f('ix_process_instance_process_group_identifier'), 'process_instance', ['process_group_identifier'], unique=False) op.create_table(
op.create_index(op.f('ix_process_instance_process_model_identifier'), 'process_instance', ['process_model_identifier'], unique=False) "user",
op.create_table('process_instance_report', sa.Column("id", sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), nullable=False), sa.Column("username", sa.String(length=255), nullable=False),
sa.Column('identifier', sa.String(length=50), nullable=False), sa.Column("uid", sa.String(length=50), nullable=True),
sa.Column('report_metadata', sa.JSON(), nullable=True), sa.Column("service", sa.String(length=50), nullable=False),
sa.Column('created_by_id', sa.Integer(), nullable=False), sa.Column("service_id", sa.String(length=255), nullable=False),
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True), sa.Column("name", sa.String(length=255), nullable=True),
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True), sa.Column("email", sa.String(length=255), nullable=True),
sa.ForeignKeyConstraint(['created_by_id'], ['user.id'], ), sa.PrimaryKeyConstraint("id"),
sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint("service", "service_id", name="service_key"),
sa.UniqueConstraint('created_by_id', 'identifier', name='process_instance_report_unique') sa.UniqueConstraint("uid"),
sa.UniqueConstraint("username"),
) )
op.create_index(op.f('ix_process_instance_report_created_by_id'), 'process_instance_report', ['created_by_id'], unique=False) op.create_table(
op.create_index(op.f('ix_process_instance_report_identifier'), 'process_instance_report', ['identifier'], unique=False) "message_correlation_property",
op.create_table('refresh_token', sa.Column("id", sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), nullable=False), sa.Column("identifier", sa.String(length=50), nullable=True),
sa.Column('user_id', sa.Integer(), nullable=False), sa.Column("message_model_id", sa.Integer(), nullable=False),
sa.Column('token', sa.String(length=1024), nullable=False), sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ), sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.PrimaryKeyConstraint('id'), sa.ForeignKeyConstraint(
sa.UniqueConstraint('user_id') ["message_model_id"],
["message_model.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"identifier", "message_model_id", name="message_correlation_property_unique"
),
) )
op.create_table('secret', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_message_correlation_property_identifier"),
sa.Column('key', sa.String(length=50), nullable=False), "message_correlation_property",
sa.Column('value', sa.Text(), nullable=False), ["identifier"],
sa.Column('user_id', sa.Integer(), nullable=False), unique=False,
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True),
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('key')
) )
op.create_table('spiff_step_details', op.create_table(
sa.Column('id', sa.Integer(), nullable=False), "message_triggerable_process_model",
sa.Column('process_instance_id', sa.Integer(), nullable=False), sa.Column("id", sa.Integer(), nullable=False),
sa.Column('spiff_step', sa.Integer(), nullable=False), sa.Column("message_model_id", sa.Integer(), nullable=False),
sa.Column('task_json', sa.JSON(), nullable=False), sa.Column("process_model_identifier", sa.String(length=50), nullable=False),
sa.Column('timestamp', sa.DECIMAL(precision=17, scale=6), nullable=False), sa.Column("process_group_identifier", sa.String(length=50), nullable=False),
sa.Column('completed_by_user_id', sa.Integer(), nullable=True), sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.Column('lane_assignment_id', sa.Integer(), nullable=True), sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['lane_assignment_id'], ['group.id'], ), sa.ForeignKeyConstraint(
sa.PrimaryKeyConstraint('id') ["message_model_id"],
["message_model.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("message_model_id"),
) )
op.create_table('user_group_assignment', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_message_triggerable_process_model_process_group_identifier"),
sa.Column('user_id', sa.Integer(), nullable=False), "message_triggerable_process_model",
sa.Column('group_id', sa.Integer(), nullable=False), ["process_group_identifier"],
sa.ForeignKeyConstraint(['group_id'], ['group.id'], ), unique=False,
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('user_id', 'group_id', name='user_group_assignment_unique')
) )
op.create_table('active_task', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_message_triggerable_process_model_process_model_identifier"),
sa.Column('process_instance_id', sa.Integer(), nullable=False), "message_triggerable_process_model",
sa.Column('actual_owner_id', sa.Integer(), nullable=True), ["process_model_identifier"],
sa.Column('lane_assignment_id', sa.Integer(), nullable=True), unique=False,
sa.Column('form_file_name', sa.String(length=50), nullable=True),
sa.Column('ui_form_file_name', sa.String(length=50), nullable=True),
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True),
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True),
sa.Column('task_id', sa.String(length=50), nullable=True),
sa.Column('task_name', sa.String(length=50), nullable=True),
sa.Column('task_title', sa.String(length=50), nullable=True),
sa.Column('task_type', sa.String(length=50), nullable=True),
sa.Column('task_status', sa.String(length=50), nullable=True),
sa.Column('process_model_display_name', sa.String(length=255), nullable=True),
sa.ForeignKeyConstraint(['actual_owner_id'], ['user.id'], ),
sa.ForeignKeyConstraint(['lane_assignment_id'], ['group.id'], ),
sa.ForeignKeyConstraint(['process_instance_id'], ['process_instance.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('task_id', 'process_instance_id', name='active_task_unique')
) )
op.create_table('message_correlation', op.create_table(
sa.Column('id', sa.Integer(), nullable=False), "principal",
sa.Column('process_instance_id', sa.Integer(), nullable=False), sa.Column("id", sa.Integer(), nullable=False),
sa.Column('message_correlation_property_id', sa.Integer(), nullable=False), sa.Column("user_id", sa.Integer(), nullable=True),
sa.Column('name', sa.String(length=255), nullable=False), sa.Column("group_id", sa.Integer(), nullable=True),
sa.Column('value', sa.String(length=255), nullable=False), sa.CheckConstraint("NOT(user_id IS NULL AND group_id IS NULL)"),
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True), ["group_id"],
sa.ForeignKeyConstraint(['message_correlation_property_id'], ['message_correlation_property.id'], ), ["group.id"],
sa.ForeignKeyConstraint(['process_instance_id'], ['process_instance.id'], ), ),
sa.PrimaryKeyConstraint('id'), sa.ForeignKeyConstraint(
sa.UniqueConstraint('process_instance_id', 'message_correlation_property_id', 'name', name='message_instance_id_name_unique') ["user_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("group_id"),
sa.UniqueConstraint("user_id"),
) )
op.create_index(op.f('ix_message_correlation_message_correlation_property_id'), 'message_correlation', ['message_correlation_property_id'], unique=False) op.create_table(
op.create_index(op.f('ix_message_correlation_name'), 'message_correlation', ['name'], unique=False) "process_instance",
op.create_index(op.f('ix_message_correlation_process_instance_id'), 'message_correlation', ['process_instance_id'], unique=False) sa.Column("id", sa.Integer(), nullable=False),
op.create_index(op.f('ix_message_correlation_value'), 'message_correlation', ['value'], unique=False) sa.Column("process_model_identifier", sa.String(length=255), nullable=False),
op.create_table('message_instance', sa.Column("process_group_identifier", sa.String(length=50), nullable=False),
sa.Column('id', sa.Integer(), nullable=False), sa.Column("process_initiator_id", sa.Integer(), nullable=False),
sa.Column('process_instance_id', sa.Integer(), nullable=False), sa.Column("bpmn_json", sa.JSON(), nullable=True),
sa.Column('message_model_id', sa.Integer(), nullable=False), sa.Column("start_in_seconds", sa.Integer(), nullable=True),
sa.Column('message_type', sa.String(length=20), nullable=False), sa.Column("end_in_seconds", sa.Integer(), nullable=True),
sa.Column('payload', sa.JSON(), nullable=True), sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.Column('status', sa.String(length=20), nullable=False), sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.Column('failure_cause', sa.Text(), nullable=True), sa.Column("status", sa.String(length=50), nullable=True),
sa.Column('updated_at_in_seconds', sa.Integer(), nullable=True), sa.Column("bpmn_version_control_type", sa.String(length=50), nullable=True),
sa.Column('created_at_in_seconds', sa.Integer(), nullable=True), sa.Column(
sa.ForeignKeyConstraint(['message_model_id'], ['message_model.id'], ), "bpmn_version_control_identifier", sa.String(length=255), nullable=True
sa.ForeignKeyConstraint(['process_instance_id'], ['process_instance.id'], ), ),
sa.PrimaryKeyConstraint('id') sa.Column("spiff_step", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(
["process_initiator_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
) )
op.create_table('permission_assignment', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_process_instance_process_group_identifier"),
sa.Column('principal_id', sa.Integer(), nullable=False), "process_instance",
sa.Column('permission_target_id', sa.Integer(), nullable=False), ["process_group_identifier"],
sa.Column('grant_type', sa.String(length=50), nullable=False), unique=False,
sa.Column('permission', sa.String(length=50), nullable=False),
sa.ForeignKeyConstraint(['permission_target_id'], ['permission_target.id'], ),
sa.ForeignKeyConstraint(['principal_id'], ['principal.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('principal_id', 'permission_target_id', 'permission', name='permission_assignment_uniq')
) )
op.create_table('active_task_user', op.create_index(
sa.Column('id', sa.Integer(), nullable=False), op.f("ix_process_instance_process_model_identifier"),
sa.Column('active_task_id', sa.Integer(), nullable=False), "process_instance",
sa.Column('user_id', sa.Integer(), nullable=False), ["process_model_identifier"],
sa.ForeignKeyConstraint(['active_task_id'], ['active_task.id'], ), unique=False,
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ),
sa.PrimaryKeyConstraint('id'),
sa.UniqueConstraint('active_task_id', 'user_id', name='active_task_user_unique')
) )
op.create_index(op.f('ix_active_task_user_active_task_id'), 'active_task_user', ['active_task_id'], unique=False) op.create_table(
op.create_index(op.f('ix_active_task_user_user_id'), 'active_task_user', ['user_id'], unique=False) "process_instance_report",
op.create_table('message_correlation_message_instance', sa.Column("id", sa.Integer(), nullable=False),
sa.Column('id', sa.Integer(), nullable=False), sa.Column("identifier", sa.String(length=50), nullable=False),
sa.Column('message_instance_id', sa.Integer(), nullable=False), sa.Column("report_metadata", sa.JSON(), nullable=True),
sa.Column('message_correlation_id', sa.Integer(), nullable=False), sa.Column("created_by_id", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(['message_correlation_id'], ['message_correlation.id'], ), sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['message_instance_id'], ['message_instance.id'], ), sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.PrimaryKeyConstraint('id'), sa.ForeignKeyConstraint(
sa.UniqueConstraint('message_instance_id', 'message_correlation_id', name='message_correlation_message_instance_unique') ["created_by_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"created_by_id", "identifier", name="process_instance_report_unique"
),
)
op.create_index(
op.f("ix_process_instance_report_created_by_id"),
"process_instance_report",
["created_by_id"],
unique=False,
)
op.create_index(
op.f("ix_process_instance_report_identifier"),
"process_instance_report",
["identifier"],
unique=False,
)
op.create_table(
"refresh_token",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.Column("token", sa.String(length=1024), nullable=False),
sa.ForeignKeyConstraint(
["user_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("user_id"),
)
op.create_table(
"secret",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("key", sa.String(length=50), nullable=False),
sa.Column("value", sa.Text(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(
["user_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("key"),
)
op.create_table(
"spiff_step_details",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("process_instance_id", sa.Integer(), nullable=False),
sa.Column("spiff_step", sa.Integer(), nullable=False),
sa.Column("task_json", sa.JSON(), nullable=False),
sa.Column("timestamp", sa.DECIMAL(precision=17, scale=6), nullable=False),
sa.Column("completed_by_user_id", sa.Integer(), nullable=True),
sa.Column("lane_assignment_id", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(
["lane_assignment_id"],
["group.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"user_group_assignment",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.Column("group_id", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(
["group_id"],
["group.id"],
),
sa.ForeignKeyConstraint(
["user_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("user_id", "group_id", name="user_group_assignment_unique"),
)
op.create_table(
"active_task",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("process_instance_id", sa.Integer(), nullable=False),
sa.Column("actual_owner_id", sa.Integer(), nullable=True),
sa.Column("lane_assignment_id", sa.Integer(), nullable=True),
sa.Column("form_file_name", sa.String(length=50), nullable=True),
sa.Column("ui_form_file_name", sa.String(length=50), nullable=True),
sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.Column("task_id", sa.String(length=50), nullable=True),
sa.Column("task_name", sa.String(length=50), nullable=True),
sa.Column("task_title", sa.String(length=50), nullable=True),
sa.Column("task_type", sa.String(length=50), nullable=True),
sa.Column("task_status", sa.String(length=50), nullable=True),
sa.Column("process_model_display_name", sa.String(length=255), nullable=True),
sa.ForeignKeyConstraint(
["actual_owner_id"],
["user.id"],
),
sa.ForeignKeyConstraint(
["lane_assignment_id"],
["group.id"],
),
sa.ForeignKeyConstraint(
["process_instance_id"],
["process_instance.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"task_id", "process_instance_id", name="active_task_unique"
),
)
op.create_table(
"message_correlation",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("process_instance_id", sa.Integer(), nullable=False),
sa.Column("message_correlation_property_id", sa.Integer(), nullable=False),
sa.Column("name", sa.String(length=255), nullable=False),
sa.Column("value", sa.String(length=255), nullable=False),
sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(
["message_correlation_property_id"],
["message_correlation_property.id"],
),
sa.ForeignKeyConstraint(
["process_instance_id"],
["process_instance.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"process_instance_id",
"message_correlation_property_id",
"name",
name="message_instance_id_name_unique",
),
)
op.create_index(
op.f("ix_message_correlation_message_correlation_property_id"),
"message_correlation",
["message_correlation_property_id"],
unique=False,
)
op.create_index(
op.f("ix_message_correlation_name"),
"message_correlation",
["name"],
unique=False,
)
op.create_index(
op.f("ix_message_correlation_process_instance_id"),
"message_correlation",
["process_instance_id"],
unique=False,
)
op.create_index(
op.f("ix_message_correlation_value"),
"message_correlation",
["value"],
unique=False,
)
op.create_table(
"message_instance",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("process_instance_id", sa.Integer(), nullable=False),
sa.Column("message_model_id", sa.Integer(), nullable=False),
sa.Column("message_type", sa.String(length=20), nullable=False),
sa.Column("payload", sa.JSON(), nullable=True),
sa.Column("status", sa.String(length=20), nullable=False),
sa.Column("failure_cause", sa.Text(), nullable=True),
sa.Column("updated_at_in_seconds", sa.Integer(), nullable=True),
sa.Column("created_at_in_seconds", sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(
["message_model_id"],
["message_model.id"],
),
sa.ForeignKeyConstraint(
["process_instance_id"],
["process_instance.id"],
),
sa.PrimaryKeyConstraint("id"),
)
op.create_table(
"permission_assignment",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("principal_id", sa.Integer(), nullable=False),
sa.Column("permission_target_id", sa.Integer(), nullable=False),
sa.Column("grant_type", sa.String(length=50), nullable=False),
sa.Column("permission", sa.String(length=50), nullable=False),
sa.ForeignKeyConstraint(
["permission_target_id"],
["permission_target.id"],
),
sa.ForeignKeyConstraint(
["principal_id"],
["principal.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"principal_id",
"permission_target_id",
"permission",
name="permission_assignment_uniq",
),
)
op.create_table(
"active_task_user",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("active_task_id", sa.Integer(), nullable=False),
sa.Column("user_id", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(
["active_task_id"],
["active_task.id"],
),
sa.ForeignKeyConstraint(
["user_id"],
["user.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"active_task_id", "user_id", name="active_task_user_unique"
),
)
op.create_index(
op.f("ix_active_task_user_active_task_id"),
"active_task_user",
["active_task_id"],
unique=False,
)
op.create_index(
op.f("ix_active_task_user_user_id"),
"active_task_user",
["user_id"],
unique=False,
)
op.create_table(
"message_correlation_message_instance",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("message_instance_id", sa.Integer(), nullable=False),
sa.Column("message_correlation_id", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(
["message_correlation_id"],
["message_correlation.id"],
),
sa.ForeignKeyConstraint(
["message_instance_id"],
["message_instance.id"],
),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint(
"message_instance_id",
"message_correlation_id",
name="message_correlation_message_instance_unique",
),
)
op.create_index(
op.f("ix_message_correlation_message_instance_message_correlation_id"),
"message_correlation_message_instance",
["message_correlation_id"],
unique=False,
)
op.create_index(
op.f("ix_message_correlation_message_instance_message_instance_id"),
"message_correlation_message_instance",
["message_instance_id"],
unique=False,
) )
op.create_index(op.f('ix_message_correlation_message_instance_message_correlation_id'), 'message_correlation_message_instance', ['message_correlation_id'], unique=False)
op.create_index(op.f('ix_message_correlation_message_instance_message_instance_id'), 'message_correlation_message_instance', ['message_instance_id'], unique=False)
# ### end Alembic commands ### # ### end Alembic commands ###
def downgrade(): def downgrade():
# ### commands auto generated by Alembic - please adjust! ### # ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_message_correlation_message_instance_message_instance_id'), table_name='message_correlation_message_instance') op.drop_index(
op.drop_index(op.f('ix_message_correlation_message_instance_message_correlation_id'), table_name='message_correlation_message_instance') op.f("ix_message_correlation_message_instance_message_instance_id"),
op.drop_table('message_correlation_message_instance') table_name="message_correlation_message_instance",
op.drop_index(op.f('ix_active_task_user_user_id'), table_name='active_task_user') )
op.drop_index(op.f('ix_active_task_user_active_task_id'), table_name='active_task_user') op.drop_index(
op.drop_table('active_task_user') op.f("ix_message_correlation_message_instance_message_correlation_id"),
op.drop_table('permission_assignment') table_name="message_correlation_message_instance",
op.drop_table('message_instance') )
op.drop_index(op.f('ix_message_correlation_value'), table_name='message_correlation') op.drop_table("message_correlation_message_instance")
op.drop_index(op.f('ix_message_correlation_process_instance_id'), table_name='message_correlation') op.drop_index(op.f("ix_active_task_user_user_id"), table_name="active_task_user")
op.drop_index(op.f('ix_message_correlation_name'), table_name='message_correlation') op.drop_index(
op.drop_index(op.f('ix_message_correlation_message_correlation_property_id'), table_name='message_correlation') op.f("ix_active_task_user_active_task_id"), table_name="active_task_user"
op.drop_table('message_correlation') )
op.drop_table('active_task') op.drop_table("active_task_user")
op.drop_table('user_group_assignment') op.drop_table("permission_assignment")
op.drop_table('spiff_step_details') op.drop_table("message_instance")
op.drop_table('secret') op.drop_index(
op.drop_table('refresh_token') op.f("ix_message_correlation_value"), table_name="message_correlation"
op.drop_index(op.f('ix_process_instance_report_identifier'), table_name='process_instance_report') )
op.drop_index(op.f('ix_process_instance_report_created_by_id'), table_name='process_instance_report') op.drop_index(
op.drop_table('process_instance_report') op.f("ix_message_correlation_process_instance_id"),
op.drop_index(op.f('ix_process_instance_process_model_identifier'), table_name='process_instance') table_name="message_correlation",
op.drop_index(op.f('ix_process_instance_process_group_identifier'), table_name='process_instance') )
op.drop_table('process_instance') op.drop_index(op.f("ix_message_correlation_name"), table_name="message_correlation")
op.drop_table('principal') op.drop_index(
op.drop_index(op.f('ix_message_triggerable_process_model_process_model_identifier'), table_name='message_triggerable_process_model') op.f("ix_message_correlation_message_correlation_property_id"),
op.drop_index(op.f('ix_message_triggerable_process_model_process_group_identifier'), table_name='message_triggerable_process_model') table_name="message_correlation",
op.drop_table('message_triggerable_process_model') )
op.drop_index(op.f('ix_message_correlation_property_identifier'), table_name='message_correlation_property') op.drop_table("message_correlation")
op.drop_table('message_correlation_property') op.drop_table("active_task")
op.drop_table('user') op.drop_table("user_group_assignment")
op.drop_table('spiff_logging') op.drop_table("spiff_step_details")
op.drop_index(op.f('ix_spec_reference_cache_type'), table_name='spec_reference_cache') op.drop_table("secret")
op.drop_index(op.f('ix_spec_reference_cache_identifier'), table_name='spec_reference_cache') op.drop_table("refresh_token")
op.drop_index(op.f('ix_spec_reference_cache_display_name'), table_name='spec_reference_cache') op.drop_index(
op.drop_table('spec_reference_cache') op.f("ix_process_instance_report_identifier"),
op.drop_table('permission_target') table_name="process_instance_report",
op.drop_index(op.f('ix_message_model_name'), table_name='message_model') )
op.drop_index(op.f('ix_message_model_identifier'), table_name='message_model') op.drop_index(
op.drop_table('message_model') op.f("ix_process_instance_report_created_by_id"),
op.drop_table('group') table_name="process_instance_report",
)
op.drop_table("process_instance_report")
op.drop_index(
op.f("ix_process_instance_process_model_identifier"),
table_name="process_instance",
)
op.drop_index(
op.f("ix_process_instance_process_group_identifier"),
table_name="process_instance",
)
op.drop_table("process_instance")
op.drop_table("principal")
op.drop_index(
op.f("ix_message_triggerable_process_model_process_model_identifier"),
table_name="message_triggerable_process_model",
)
op.drop_index(
op.f("ix_message_triggerable_process_model_process_group_identifier"),
table_name="message_triggerable_process_model",
)
op.drop_table("message_triggerable_process_model")
op.drop_index(
op.f("ix_message_correlation_property_identifier"),
table_name="message_correlation_property",
)
op.drop_table("message_correlation_property")
op.drop_table("user")
op.drop_table("spiff_logging")
op.drop_index(
op.f("ix_spec_reference_cache_type"), table_name="spec_reference_cache"
)
op.drop_index(
op.f("ix_spec_reference_cache_identifier"), table_name="spec_reference_cache"
)
op.drop_index(
op.f("ix_spec_reference_cache_display_name"), table_name="spec_reference_cache"
)
op.drop_table("spec_reference_cache")
op.drop_table("permission_target")
op.drop_index(op.f("ix_message_model_name"), table_name="message_model")
op.drop_index(op.f("ix_message_model_identifier"), table_name="message_model")
op.drop_table("message_model")
op.drop_table("group")
# ### end Alembic commands ### # ### end Alembic commands ###

View File

@ -5,6 +5,7 @@ from typing import Any
import connexion # type: ignore import connexion # type: ignore
import flask.app import flask.app
import flask.json import flask.json
import spiffworkflow_backend.load_database_models # noqa: F401
import sqlalchemy import sqlalchemy
from apscheduler.schedulers.background import BackgroundScheduler # type: ignore from apscheduler.schedulers.background import BackgroundScheduler # type: ignore
from apscheduler.schedulers.base import BaseScheduler # type: ignore from apscheduler.schedulers.base import BaseScheduler # type: ignore
@ -14,9 +15,6 @@ from flask_bpmn.models.db import db
from flask_bpmn.models.db import migrate from flask_bpmn.models.db import migrate
from flask_cors import CORS # type: ignore from flask_cors import CORS # type: ignore
from flask_mail import Mail # type: ignore from flask_mail import Mail # type: ignore
from werkzeug.exceptions import NotFound
import spiffworkflow_backend.load_database_models # noqa: F401
from spiffworkflow_backend.config import setup_config from spiffworkflow_backend.config import setup_config
from spiffworkflow_backend.routes.admin_blueprint.admin_blueprint import admin_blueprint from spiffworkflow_backend.routes.admin_blueprint.admin_blueprint import admin_blueprint
from spiffworkflow_backend.routes.process_api_blueprint import process_api_blueprint from spiffworkflow_backend.routes.process_api_blueprint import process_api_blueprint
@ -26,6 +24,7 @@ from spiffworkflow_backend.services.authorization_service import AuthorizationSe
from spiffworkflow_backend.services.background_processing_service import ( from spiffworkflow_backend.services.background_processing_service import (
BackgroundProcessingService, BackgroundProcessingService,
) )
from werkzeug.exceptions import NotFound
class MyJSONEncoder(DefaultJSONProvider): class MyJSONEncoder(DefaultJSONProvider):

View File

@ -375,8 +375,9 @@ paths:
/processes: /processes:
get: get:
operationId: spiffworkflow_backend.routes.process_api_blueprint.process_list operationId: spiffworkflow_backend.routes.process_api_blueprint.process_list
summary: Return a list of all processes (not just primary process of a process model) summary:
useful for finding processes for call activites. Return a list of all processes (not just primary process of a process model)
useful for finding processes for call activites.
tags: tags:
- Process Models - Process Models
responses: responses:

View File

@ -3,9 +3,8 @@ import os
import threading import threading
from flask.app import Flask from flask.app import Flask
from werkzeug.utils import ImportStringError
from spiffworkflow_backend.services.logging_service import setup_logger from spiffworkflow_backend.services.logging_service import setup_logger
from werkzeug.utils import ImportStringError
class ConfigurationError(Exception): class ConfigurationError(Exception):

View File

@ -6,14 +6,13 @@ from typing import TYPE_CHECKING
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import RelationshipProperty
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.task import Task from spiffworkflow_backend.models.task import Task
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.orm import RelationshipProperty
if TYPE_CHECKING: if TYPE_CHECKING:

View File

@ -5,10 +5,9 @@ from dataclasses import dataclass
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.active_task import ActiveTaskModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from sqlalchemy import ForeignKey
@dataclass @dataclass

View File

@ -7,7 +7,6 @@ from typing import Optional
import marshmallow import marshmallow
from marshmallow import INCLUDE from marshmallow import INCLUDE
from marshmallow import Schema from marshmallow import Schema
from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum
from spiffworkflow_backend.models.spec_reference import SpecReference from spiffworkflow_backend.models.spec_reference import SpecReference

View File

@ -4,13 +4,12 @@ from typing import TYPE_CHECKING
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from spiffworkflow_backend.models.message_correlation_property import ( from spiffworkflow_backend.models.message_correlation_property import (
MessageCorrelationPropertyModel, MessageCorrelationPropertyModel,
) )
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
if TYPE_CHECKING: if TYPE_CHECKING:
from spiffworkflow_backend.models.message_correlation_message_instance import ( # noqa: F401 from spiffworkflow_backend.models.message_correlation_message_instance import ( # noqa: F401

View File

@ -3,10 +3,9 @@ from dataclasses import dataclass
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from spiffworkflow_backend.models.message_correlation import MessageCorrelationModel from spiffworkflow_backend.models.message_correlation import MessageCorrelationModel
from spiffworkflow_backend.models.message_instance import MessageInstanceModel from spiffworkflow_backend.models.message_instance import MessageInstanceModel
from sqlalchemy import ForeignKey
@dataclass @dataclass

View File

@ -1,9 +1,8 @@
"""Message_correlation_property.""" """Message_correlation_property."""
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from spiffworkflow_backend.models.message_model import MessageModel from spiffworkflow_backend.models.message_model import MessageModel
from sqlalchemy import ForeignKey
class MessageCorrelationPropertyModel(SpiffworkflowBaseDBModel): class MessageCorrelationPropertyModel(SpiffworkflowBaseDBModel):

View File

@ -7,15 +7,14 @@ from typing import TYPE_CHECKING
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from spiffworkflow_backend.models.message_model import MessageModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from sqlalchemy import ForeignKey from sqlalchemy import ForeignKey
from sqlalchemy.event import listens_for from sqlalchemy.event import listens_for
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from sqlalchemy.orm import validates from sqlalchemy.orm import validates
from spiffworkflow_backend.models.message_model import MessageModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
if TYPE_CHECKING: if TYPE_CHECKING:
from spiffworkflow_backend.models.message_correlation_message_instance import ( # noqa: F401 from spiffworkflow_backend.models.message_correlation_message_instance import ( # noqa: F401
MessageCorrelationMessageInstanceModel, MessageCorrelationMessageInstanceModel,

View File

@ -1,9 +1,8 @@
"""Message_correlation_property.""" """Message_correlation_property."""
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from spiffworkflow_backend.models.message_model import MessageModel from spiffworkflow_backend.models.message_model import MessageModel
from sqlalchemy import ForeignKey
class MessageTriggerableProcessModel(SpiffworkflowBaseDBModel): class MessageTriggerableProcessModel(SpiffworkflowBaseDBModel):

View File

@ -4,11 +4,10 @@ from typing import Any
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import validates
from spiffworkflow_backend.models.permission_target import PermissionTargetModel from spiffworkflow_backend.models.permission_target import PermissionTargetModel
from spiffworkflow_backend.models.principal import PrincipalModel from spiffworkflow_backend.models.principal import PrincipalModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import validates
class PermitDeny(enum.Enum): class PermitDeny(enum.Enum):

View File

@ -3,13 +3,12 @@ from dataclasses import dataclass
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel
from sqlalchemy import ForeignKey from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
from sqlalchemy.schema import CheckConstraint from sqlalchemy.schema import CheckConstraint
from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel
class DataValidityError(Exception): class DataValidityError(Exception):
"""DataValidityError.""" """DataValidityError."""

View File

@ -9,7 +9,6 @@ from typing import Any
import marshmallow import marshmallow
from marshmallow import post_load from marshmallow import post_load
from marshmallow import Schema from marshmallow import Schema
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo

View File

@ -12,16 +12,15 @@ from marshmallow import INCLUDE
from marshmallow import Schema from marshmallow import Schema
from marshmallow_enum import EnumField # type: ignore from marshmallow_enum import EnumField # type: ignore
from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore
from sqlalchemy import ForeignKey
from sqlalchemy.orm import deferred
from sqlalchemy.orm import relationship
from sqlalchemy.orm import validates
from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
from spiffworkflow_backend.models.task import Task from spiffworkflow_backend.models.task import Task
from spiffworkflow_backend.models.task import TaskSchema from spiffworkflow_backend.models.task import TaskSchema
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import deferred
from sqlalchemy.orm import relationship
from sqlalchemy.orm import validates
class NavigationItemSchema(Schema): class NavigationItemSchema(Schema):

View File

@ -9,10 +9,6 @@ from typing import TypedDict
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import deferred
from sqlalchemy.orm import relationship
from spiffworkflow_backend.exceptions.process_entity_not_found_error import ( from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
ProcessEntityNotFoundError, ProcessEntityNotFoundError,
) )
@ -21,6 +17,9 @@ from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from sqlalchemy import ForeignKey
from sqlalchemy.orm import deferred
from sqlalchemy.orm import relationship
ReportMetadata = dict[str, Any] ReportMetadata = dict[str, Any]

View File

@ -10,7 +10,6 @@ from typing import Any
import marshmallow import marshmallow
from marshmallow import Schema from marshmallow import Schema
from marshmallow.decorators import post_load from marshmallow.decorators import post_load
from spiffworkflow_backend.models.file import File from spiffworkflow_backend.models.file import File

View File

@ -4,9 +4,8 @@ from dataclasses import dataclass
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from marshmallow import Schema from marshmallow import Schema
from sqlalchemy import ForeignKey
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from sqlalchemy import ForeignKey
@dataclass() @dataclass()

View File

@ -4,11 +4,10 @@ from typing import Optional
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from spiffworkflow_backend.models.group import GroupModel
from sqlalchemy import ForeignKey from sqlalchemy import ForeignKey
from sqlalchemy.orm import deferred from sqlalchemy.orm import deferred
from spiffworkflow_backend.models.group import GroupModel
@dataclass @dataclass
class SpiffStepDetailsModel(SpiffworkflowBaseDBModel): class SpiffStepDetailsModel(SpiffworkflowBaseDBModel):

View File

@ -10,13 +10,12 @@ from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from marshmallow import Schema from marshmallow import Schema
from sqlalchemy.orm import relationship
from sqlalchemy.orm import validates
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.services.authentication_service import ( from spiffworkflow_backend.services.authentication_service import (
AuthenticationProviderTypes, AuthenticationProviderTypes,
) )
from sqlalchemy.orm import relationship
from sqlalchemy.orm import validates
class UserNotFoundError(Exception): class UserNotFoundError(Exception):

View File

@ -1,11 +1,10 @@
"""UserGroupAssignment.""" """UserGroupAssignment."""
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class UserGroupAssignmentModel(SpiffworkflowBaseDBModel): class UserGroupAssignmentModel(SpiffworkflowBaseDBModel):

View File

@ -7,8 +7,6 @@ from flask import redirect
from flask import render_template from flask import render_template
from flask import request from flask import request
from flask import url_for from flask import url_for
from werkzeug.wrappers import Response
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
@ -18,6 +16,7 @@ from spiffworkflow_backend.services.process_instance_service import (
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
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 werkzeug.wrappers import Response
admin_blueprint = Blueprint( admin_blueprint = Blueprint(
"admin", __name__, template_folder="templates", static_folder="static" "admin", __name__, template_folder="templates", static_folder="static"

View File

@ -1,6 +1,5 @@
"""APIs for dealing with process groups, process models, and process instances.""" """APIs for dealing with process groups, process models, and process instances."""
import json import json
import os
import random import random
import string import string
import uuid import uuid
@ -28,10 +27,6 @@ from lxml import etree # type: ignore
from lxml.builder import ElementMaker # type: ignore from lxml.builder import ElementMaker # type: ignore
from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore
from SpiffWorkflow.task import TaskState from SpiffWorkflow.task import TaskState
from sqlalchemy import and_
from sqlalchemy import asc
from sqlalchemy import desc
from spiffworkflow_backend.exceptions.process_entity_not_found_error import ( from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
ProcessEntityNotFoundError, ProcessEntityNotFoundError,
) )
@ -87,6 +82,9 @@ from spiffworkflow_backend.services.secret_service import SecretService
from spiffworkflow_backend.services.service_task_service import ServiceTaskService from spiffworkflow_backend.services.service_task_service import ServiceTaskService
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 sqlalchemy import and_
from sqlalchemy import asc
from sqlalchemy import desc
class TaskDataSelectOption(TypedDict): class TaskDataSelectOption(TypedDict):
@ -253,16 +251,11 @@ def process_model_create(
status_code=400, status_code=400,
) )
modified_process_model_id = process_model_info.id unmodified_process_group_id = un_modify_modified_process_model_id(
unmodified_process_model_id = un_modify_modified_process_model_id( modified_process_group_id
modified_process_model_id
) )
process_model_info.id = unmodified_process_model_id
process_group_id, _ = os.path.split(process_model_info.id)
process_model_service = ProcessModelService() process_model_service = ProcessModelService()
process_group = process_model_service.get_process_group( process_group = process_model_service.get_process_group(unmodified_process_group_id)
un_modify_modified_process_model_id(process_group_id)
)
if process_group is None: if process_group is None:
raise ApiError( raise ApiError(
error_code="process_model_could_not_be_created", error_code="process_model_could_not_be_created",
@ -270,7 +263,7 @@ def process_model_create(
status_code=400, status_code=400,
) )
process_model_service.add_spec(process_model_info) process_model_service.add_process_model(process_model_info)
return Response( return Response(
json.dumps(ProcessModelInfoSchema().dump(process_model_info)), json.dumps(ProcessModelInfoSchema().dump(process_model_info)),
status=201, status=201,
@ -307,7 +300,7 @@ def process_model_update(
# process_model_identifier = f"{process_group_id}/{process_model_id}" # process_model_identifier = f"{process_group_id}/{process_model_id}"
process_model = get_process_model(process_model_identifier) process_model = get_process_model(process_model_identifier)
ProcessModelService().update_spec(process_model, body_filtered) ProcessModelService().update_process_model(process_model, body_filtered)
return ProcessModelInfoSchema().dump(process_model) return ProcessModelInfoSchema().dump(process_model)

View File

@ -12,14 +12,13 @@ from flask import g
from flask import redirect from flask import redirect
from flask import request from flask import request
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from werkzeug.wrappers import Response
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.authentication_service import ( from spiffworkflow_backend.services.authentication_service import (
AuthenticationService, AuthenticationService,
) )
from spiffworkflow_backend.services.authorization_service import AuthorizationService from spiffworkflow_backend.services.authorization_service import AuthorizationService
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService
from werkzeug.wrappers import Response
""" """
.. module:: crc.api.user .. module:: crc.api.user

View File

@ -9,11 +9,10 @@ from flask import request
from flask import Response from flask import Response
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from sqlalchemy.exc import IntegrityError
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.models.user_group_assignment import UserGroupAssignmentModel from spiffworkflow_backend.models.user_group_assignment import UserGroupAssignmentModel
from sqlalchemy.exc import IntegrityError
APPLICATION_JSON: Final = "application/json" APPLICATION_JSON: Final = "application/json"

View File

@ -2,7 +2,6 @@
from typing import Any from typing import Any
from flask import g from flask import g
from spiffworkflow_backend.models.script_attributes_context import ( from spiffworkflow_backend.models.script_attributes_context import (
ScriptAttributesContext, ScriptAttributesContext,
) )

View File

@ -2,7 +2,6 @@
from typing import Any from typing import Any
from flask import current_app from flask import current_app
from spiffworkflow_backend.models.script_attributes_context import ( from spiffworkflow_backend.models.script_attributes_context import (
ScriptAttributesContext, ScriptAttributesContext,
) )

View File

@ -4,7 +4,6 @@ from typing import Any
import pytz import pytz
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from spiffworkflow_backend.models.script_attributes_context import ( from spiffworkflow_backend.models.script_attributes_context import (
ScriptAttributesContext, ScriptAttributesContext,
) )

View File

@ -9,7 +9,6 @@ from typing import Any
from typing import Callable from typing import Callable
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from spiffworkflow_backend.models.script_attributes_context import ( from spiffworkflow_backend.models.script_attributes_context import (
ScriptAttributesContext, ScriptAttributesContext,
) )

View File

@ -4,10 +4,9 @@ import time
from flask import current_app from flask import current_app
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
def load_acceptance_test_fixtures() -> list[ProcessInstanceModel]: def load_acceptance_test_fixtures() -> list[ProcessInstanceModel]:

View File

@ -11,9 +11,8 @@ from flask import current_app
from flask import redirect from flask import redirect
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from werkzeug.wrappers import Response
from spiffworkflow_backend.models.refresh_token import RefreshTokenModel from spiffworkflow_backend.models.refresh_token import RefreshTokenModel
from werkzeug.wrappers import Response
class AuthenticationProviderTypes(enum.Enum): class AuthenticationProviderTypes(enum.Enum):

View File

@ -11,9 +11,6 @@ from flask import request
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore
from sqlalchemy import or_
from sqlalchemy import text
from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.active_task import ActiveTaskModel
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel
@ -28,6 +25,8 @@ from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService
from sqlalchemy import or_
from sqlalchemy import text
class PermissionsFileNotSetError(Exception): class PermissionsFileNotSetError(Exception):

View File

@ -1,6 +1,5 @@
"""Background_processing_service.""" """Background_processing_service."""
import flask import flask
from spiffworkflow_backend.services.message_service import MessageService from spiffworkflow_backend.services.message_service import MessageService
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,

View File

@ -1,7 +1,6 @@
"""Data_setup_service.""" """Data_setup_service."""
from flask import current_app from flask import current_app
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from spiffworkflow_backend.services.spec_file_service import SpecFileService from spiffworkflow_backend.services.spec_file_service import SpecFileService

View File

@ -5,7 +5,6 @@ from typing import Union
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
from spiffworkflow_backend.services.email_service import EmailService from spiffworkflow_backend.services.email_service import EmailService

View File

@ -7,7 +7,6 @@ from typing import Optional
import pytz import pytz
from flask import current_app from flask import current_app
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from spiffworkflow_backend.models.file import CONTENT_TYPES from spiffworkflow_backend.models.file import CONTENT_TYPES
from spiffworkflow_backend.models.file import File from spiffworkflow_backend.models.file import File
from spiffworkflow_backend.models.file import FileType from spiffworkflow_backend.models.file import FileType
@ -20,8 +19,8 @@ class FileSystemService:
""" Simple Service meant for extension that provides some useful """ Simple Service meant for extension that provides some useful
methods for dealing with the File system. methods for dealing with the File system.
""" """
CAT_JSON_FILE = "process_group.json" PROCESS_GROUP_JSON_FILE = "process_group.json"
WF_JSON_FILE = "workflow.json" PROCESS_MODEL_JSON_FILE = "process_model.json"
@staticmethod @staticmethod
def root_path() -> str: def root_path() -> str:
@ -135,7 +134,7 @@ class FileSystemService:
if item.is_file(): if item.is_file():
if item.name.startswith("."): if item.name.startswith("."):
continue # Ignore hidden files continue # Ignore hidden files
if item.name == FileSystemService.WF_JSON_FILE: if item.name == FileSystemService.PROCESS_MODEL_JSON_FILE:
continue # Ignore the json files. continue # Ignore the json files.
if file_name is not None and item.name != file_name: if file_name is not None and item.name != file_name:
continue continue

View File

@ -2,7 +2,6 @@
import os import os
from flask import current_app from flask import current_app
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
from spiffworkflow_backend.services.file_system_service import FileSystemService from spiffworkflow_backend.services.file_system_service import FileSystemService

View File

@ -2,7 +2,6 @@
from typing import Optional from typing import Optional
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService

View File

@ -8,7 +8,6 @@ from typing import Optional
from flask import g from flask import g
from flask.app import Flask from flask.app import Flask
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.models.spiff_logging import SpiffLoggingModel from spiffworkflow_backend.models.spiff_logging import SpiffLoggingModel
@ -236,5 +235,5 @@ class DBHandler(logging.Handler):
"spiff_step": spiff_step, "spiff_step": spiff_step,
} }
) )
if len(self.logs) % 1000 == 0: if len(self.logs) % 1 == 0:
self.bulk_insert_logs() self.bulk_insert_logs()

View File

@ -3,10 +3,6 @@ from typing import Any
from typing import Optional from typing import Optional
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy import select
from spiffworkflow_backend.models.message_correlation import MessageCorrelationModel from spiffworkflow_backend.models.message_correlation import MessageCorrelationModel
from spiffworkflow_backend.models.message_correlation_message_instance import ( from spiffworkflow_backend.models.message_correlation_message_instance import (
MessageCorrelationMessageInstanceModel, MessageCorrelationMessageInstanceModel,
@ -23,6 +19,9 @@ from spiffworkflow_backend.services.process_instance_processor import (
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from sqlalchemy import and_
from sqlalchemy import or_
from sqlalchemy import select
class MessageServiceError(Exception): class MessageServiceError(Exception):

View File

@ -64,7 +64,6 @@ from SpiffWorkflow.spiff.serializer.task_spec_converters import UserTaskConverte
from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore
from SpiffWorkflow.task import TaskState from SpiffWorkflow.task import TaskState
from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore
from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.active_task import ActiveTaskModel
from spiffworkflow_backend.models.active_task_user import ActiveTaskUserModel from spiffworkflow_backend.models.active_task_user import ActiveTaskUserModel
from spiffworkflow_backend.models.file import File from spiffworkflow_backend.models.file import File

View File

@ -7,7 +7,6 @@ from flask import current_app
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore
from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.active_task import ActiveTaskModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceApi from spiffworkflow_backend.models.process_instance import ProcessInstanceApi
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
@ -320,7 +319,7 @@ class ProcessInstanceService:
def serialize_flat_with_task_data( def serialize_flat_with_task_data(
process_instance: ProcessInstanceModel, process_instance: ProcessInstanceModel,
) -> dict[str, Any]: ) -> dict[str, Any]:
"""serialize_flat_with_task_data.""" """Serialize_flat_with_task_data."""
results = {} results = {}
try: try:
original_status = process_instance.status original_status = process_instance.status

View File

@ -8,7 +8,6 @@ from typing import Optional
from typing import TypeVar from typing import TypeVar
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from spiffworkflow_backend.exceptions.process_entity_not_found_error import ( from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
ProcessEntityNotFoundError, ProcessEntityNotFoundError,
) )
@ -32,22 +31,30 @@ class ProcessModelService(FileSystemService):
the workflow process_models at once, or manage those file in a git repository. """ the workflow process_models at once, or manage those file in a git repository. """
GROUP_SCHEMA = ProcessGroupSchema() GROUP_SCHEMA = ProcessGroupSchema()
WF_SCHEMA = ProcessModelInfoSchema() PROCESS_MODEL_SCHEMA = ProcessModelInfoSchema()
def is_group(self, path: str) -> bool: def is_group(self, path: str) -> bool:
"""Is_group.""" """Is_group."""
group_json_path = os.path.join(path, self.CAT_JSON_FILE) group_json_path = os.path.join(path, self.PROCESS_GROUP_JSON_FILE)
if os.path.exists(group_json_path): if os.path.exists(group_json_path):
return True return True
return False return False
def is_model(self, path: str) -> bool: def is_model(self, path: str) -> bool:
"""Is_model.""" """Is_model."""
model_json_path = os.path.join(path, self.WF_JSON_FILE) model_json_path = os.path.join(path, self.PROCESS_MODEL_JSON_FILE)
if os.path.exists(model_json_path): if os.path.exists(model_json_path):
return True return True
return False return False
@staticmethod
def write_json_file(
file_path: str, json_data: dict, indent: int = 4, sort_keys: bool = True
) -> None:
"""Write json file."""
with open(file_path, "w") as h_open:
json.dump(json_data, h_open, indent=indent, sort_keys=sort_keys)
@staticmethod @staticmethod
def get_batch( def get_batch(
items: list[T], items: list[T],
@ -59,13 +66,13 @@ class ProcessModelService(FileSystemService):
end = start + per_page end = start + per_page
return items[start:end] return items[start:end]
def add_spec(self, process_model: ProcessModelInfo) -> None: def add_process_model(self, process_model: ProcessModelInfo) -> None:
"""Add_spec.""" """Add_spec."""
display_order = self.next_display_order(process_model) display_order = self.next_display_order(process_model)
process_model.display_order = display_order process_model.display_order = display_order
self.save_process_model(process_model) self.save_process_model(process_model)
def update_spec( def update_process_model(
self, process_model: ProcessModelInfo, attributes_to_update: dict self, process_model: ProcessModelInfo, attributes_to_update: dict
) -> None: ) -> None:
"""Update_spec.""" """Update_spec."""
@ -76,13 +83,21 @@ class ProcessModelService(FileSystemService):
def save_process_model(self, process_model: ProcessModelInfo) -> None: def save_process_model(self, process_model: ProcessModelInfo) -> None:
"""Save_process_model.""" """Save_process_model."""
spec_path = os.path.join(FileSystemService.root_path(), process_model.id) process_model_path = os.path.abspath(
os.makedirs(spec_path, exist_ok=True) os.path.join(FileSystemService.root_path(), process_model.id)
json_path = os.path.join(spec_path, self.WF_JSON_FILE) )
with open(json_path, "w") as wf_json: os.makedirs(process_model_path, exist_ok=True)
json.dump( json_path = os.path.abspath(
self.WF_SCHEMA.dump(process_model), wf_json, indent=4, sort_keys=True os.path.join(process_model_path, self.PROCESS_MODEL_JSON_FILE)
) )
process_model_id = process_model.id
# we don't save id in the json file
# this allows us to move models around on the filesystem
# the id is determined by its location on the filesystem
delattr(process_model, "id")
json_data = self.PROCESS_MODEL_SCHEMA.dump(process_model)
self.write_json_file(json_path, json_data)
process_model.id = process_model_id
def process_model_delete(self, process_model_id: str) -> None: def process_model_delete(self, process_model_id: str) -> None:
"""Delete Procecss Model.""" """Delete Procecss Model."""
@ -107,7 +122,7 @@ class ProcessModelService(FileSystemService):
process_group_identifier, _ = os.path.split(relative_path) process_group_identifier, _ = os.path.split(relative_path)
process_group = cls().get_process_group(process_group_identifier) process_group = cls().get_process_group(process_group_identifier)
path = os.path.join(FileSystemService.root_path(), relative_path) path = os.path.join(FileSystemService.root_path(), relative_path)
return cls().__scan_spec(path, process_group=process_group) return cls().__scan_process_model(path, process_group=process_group)
def get_process_model(self, process_model_id: str) -> ProcessModelInfo: def get_process_model(self, process_model_id: str) -> ProcessModelInfo:
"""Get a process model from a model and group id. """Get a process model from a model and group id.
@ -117,7 +132,9 @@ class ProcessModelService(FileSystemService):
if not os.path.exists(FileSystemService.root_path()): if not os.path.exists(FileSystemService.root_path()):
raise ProcessEntityNotFoundError("process_model_root_not_found") raise ProcessEntityNotFoundError("process_model_root_not_found")
model_path = os.path.join(FileSystemService.root_path(), process_model_id) model_path = os.path.abspath(
os.path.join(FileSystemService.root_path(), process_model_id)
)
if self.is_model(model_path): if self.is_model(model_path):
process_model = self.get_process_model_from_relative_path(process_model_id) process_model = self.get_process_model_from_relative_path(process_model_id)
return process_model return process_model
@ -140,7 +157,7 @@ class ProcessModelService(FileSystemService):
# process_group = self.__scan_process_group( # process_group = self.__scan_process_group(
# process_group_dir # process_group_dir
# ) # )
# return self.__scan_spec(sd.path, sd.name, process_group) # return self.__scan_process_model(sd.path, sd.name, process_group)
raise ProcessEntityNotFoundError("process_model_not_found") raise ProcessEntityNotFoundError("process_model_not_found")
def get_process_models( def get_process_models(
@ -172,8 +189,8 @@ class ProcessModelService(FileSystemService):
def get_process_group(self, process_group_id: str) -> ProcessGroup: def get_process_group(self, process_group_id: str) -> ProcessGroup:
"""Look for a given process_group, and return it.""" """Look for a given process_group, and return it."""
if os.path.exists(FileSystemService.root_path()): if os.path.exists(FileSystemService.root_path()):
process_group_path = os.path.join( process_group_path = os.path.abspath(
FileSystemService.root_path(), process_group_id os.path.join(FileSystemService.root_path(), process_group_id)
) )
if self.is_group(process_group_path): if self.is_group(process_group_path):
return self.__scan_process_group(process_group_path) return self.__scan_process_group(process_group_path)
@ -205,14 +222,12 @@ class ProcessModelService(FileSystemService):
"""Update_process_group.""" """Update_process_group."""
cat_path = self.process_group_path(process_group.id) cat_path = self.process_group_path(process_group.id)
os.makedirs(cat_path, exist_ok=True) os.makedirs(cat_path, exist_ok=True)
json_path = os.path.join(cat_path, self.CAT_JSON_FILE) json_path = os.path.join(cat_path, self.PROCESS_GROUP_JSON_FILE)
with open(json_path, "w") as cat_json: serialized_process_group = process_group.serialized
json.dump( # we don't store `id` in the json files
process_group.serialized, # this allows us to move groups around on the filesystem
cat_json, del serialized_process_group["id"]
indent=4, self.write_json_file(json_path, serialized_process_group)
sort_keys=True,
)
return process_group return process_group
def __get_all_nested_models(self, group_path: str) -> list: def __get_all_nested_models(self, group_path: str) -> list:
@ -279,10 +294,13 @@ class ProcessModelService(FileSystemService):
def __scan_process_group(self, dir_path: str) -> ProcessGroup: def __scan_process_group(self, dir_path: str) -> ProcessGroup:
"""Reads the process_group.json file, and any nested directories.""" """Reads the process_group.json file, and any nested directories."""
cat_path = os.path.join(dir_path, self.CAT_JSON_FILE) cat_path = os.path.join(dir_path, self.PROCESS_GROUP_JSON_FILE)
if os.path.exists(cat_path): if os.path.exists(cat_path):
with open(cat_path) as cat_json: with open(cat_path) as cat_json:
data = json.load(cat_json) data = json.load(cat_json)
# we don't store `id` in the json files, so we add it back in here
relative_path = os.path.relpath(dir_path, FileSystemService.root_path())
data["id"] = relative_path
process_group = ProcessGroup(**data) process_group = ProcessGroup(**data)
if process_group is None: if process_group is None:
raise ApiError( raise ApiError(
@ -292,13 +310,14 @@ class ProcessModelService(FileSystemService):
else: else:
process_group_id = dir_path.replace(FileSystemService.root_path(), "") process_group_id = dir_path.replace(FileSystemService.root_path(), "")
process_group = ProcessGroup( process_group = ProcessGroup(
id=process_group_id, id="",
display_name=process_group_id, display_name=process_group_id,
display_order=10000, display_order=10000,
admin=False, admin=False,
) )
with open(cat_path, "w") as wf_json: self.write_json_file(cat_path, self.GROUP_SCHEMA.dump(process_group))
json.dump(self.GROUP_SCHEMA.dump(process_group), wf_json, indent=4) # we don't store `id` in the json files, so we add it in here
process_group.id = process_group_id
with os.scandir(dir_path) as nested_items: with os.scandir(dir_path) as nested_items:
process_group.process_models = [] process_group.process_models = []
process_group.process_groups = [] process_group.process_groups = []
@ -312,7 +331,7 @@ class ProcessModelService(FileSystemService):
) )
elif self.is_model(nested_item.path): elif self.is_model(nested_item.path):
process_group.process_models.append( process_group.process_models.append(
self.__scan_spec( self.__scan_process_model(
nested_item.path, nested_item.path,
nested_item.name, nested_item.name,
process_group=process_group, process_group=process_group,
@ -322,22 +341,25 @@ class ProcessModelService(FileSystemService):
# process_group.process_groups.sort() # process_group.process_groups.sort()
return process_group return process_group
def __scan_spec( def __scan_process_model(
self, self,
path: str, path: str,
name: Optional[str] = None, name: Optional[str] = None,
process_group: Optional[ProcessGroup] = None, process_group: Optional[ProcessGroup] = None,
) -> ProcessModelInfo: ) -> ProcessModelInfo:
"""__scan_spec.""" """__scan_process_model."""
spec_path = os.path.join(path, self.WF_JSON_FILE) json_file_path = os.path.join(path, self.PROCESS_MODEL_JSON_FILE)
if os.path.exists(spec_path): if os.path.exists(json_file_path):
with open(spec_path) as wf_json: with open(json_file_path) as wf_json:
data = json.load(wf_json) data = json.load(wf_json)
if "process_group_id" in data: if "process_group_id" in data:
data.pop("process_group_id") data.pop("process_group_id")
spec = ProcessModelInfo(**data) # we don't save `id` in the json file, so we add it back in here.
if spec is None: relative_path = os.path.relpath(path, FileSystemService.root_path())
data["id"] = relative_path
process_model_info = ProcessModelInfo(**data)
if process_model_info is None:
raise ApiError( raise ApiError(
error_code="process_model_could_not_be_loaded_from_disk", error_code="process_model_could_not_be_loaded_from_disk",
message=f"We could not load the process_model from disk with data: {data}", message=f"We could not load the process_model from disk with data: {data}",
@ -349,15 +371,18 @@ class ProcessModelService(FileSystemService):
message="Missing name of process model. It should be given", message="Missing name of process model. It should be given",
) )
spec = ProcessModelInfo( process_model_info = ProcessModelInfo(
id=name, id="",
display_name=name, display_name=name,
description="", description="",
display_order=0, display_order=0,
is_review=False, is_review=False,
) )
with open(spec_path, "w") as wf_json: self.write_json_file(
json.dump(self.WF_SCHEMA.dump(spec), wf_json, indent=4) json_file_path, self.PROCESS_MODEL_SCHEMA.dump(process_model_info)
)
# we don't store `id` in the json files, so we add it in here
process_model_info.id = name
if process_group: if process_group:
spec.process_group = process_group.id process_model_info.process_group = process_group.id
return spec return process_model_info

View File

@ -8,7 +8,6 @@ from typing import Optional
from SpiffWorkflow.bpmn.exceptions import WorkflowTaskExecException # type: ignore from SpiffWorkflow.bpmn.exceptions import WorkflowTaskExecException # type: ignore
from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import Task as SpiffTask # type: ignore
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
CustomBpmnScriptEngine, CustomBpmnScriptEngine,
) )

View File

@ -3,7 +3,6 @@ from typing import Optional
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.models.secret_model import SecretModel from spiffworkflow_backend.models.secret_model import SecretModel
# from cryptography.fernet import Fernet # from cryptography.fernet import Fernet

View File

@ -5,7 +5,6 @@ from typing import Any
import requests import requests
from flask import current_app from flask import current_app
from flask import g from flask import g
from spiffworkflow_backend.services.file_system_service import FileSystemService from spiffworkflow_backend.services.file_system_service import FileSystemService
from spiffworkflow_backend.services.secret_service import SecretService from spiffworkflow_backend.services.secret_service import SecretService

View File

@ -7,7 +7,6 @@ from typing import Optional
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from SpiffWorkflow.bpmn.parser.ValidationException import ValidationException # type: ignore from SpiffWorkflow.bpmn.parser.ValidationException import ValidationException # type: ignore
from spiffworkflow_backend.models.file import File from spiffworkflow_backend.models.file import File
from spiffworkflow_backend.models.file import FileType from spiffworkflow_backend.models.file import FileType
from spiffworkflow_backend.models.file import SpecReference from spiffworkflow_backend.models.file import SpecReference
@ -171,7 +170,7 @@ class SpecFileService(FileSystemService):
ref.is_primary = True ref.is_primary = True
if ref.is_primary: if ref.is_primary:
ProcessModelService().update_spec( ProcessModelService().update_process_model(
process_model_info, process_model_info,
{ {
"primary_process_id": ref.identifier, "primary_process_id": ref.identifier,
@ -197,7 +196,9 @@ class SpecFileService(FileSystemService):
@staticmethod @staticmethod
def full_file_path(spec: ProcessModelInfo, file_name: str) -> str: def full_file_path(spec: ProcessModelInfo, file_name: str) -> str:
"""File_path.""" """File_path."""
return os.path.join(SpecFileService.workflow_path(spec), file_name) return os.path.abspath(
os.path.join(SpecFileService.workflow_path(spec), file_name)
)
@staticmethod @staticmethod
def last_modified(spec: ProcessModelInfo, file_name: str) -> datetime: def last_modified(spec: ProcessModelInfo, file_name: str) -> datetime:

View File

@ -6,7 +6,6 @@ from flask import current_app
from flask import g from flask import g
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.active_task import ActiveTaskModel
from spiffworkflow_backend.models.active_task_user import ActiveTaskUserModel from spiffworkflow_backend.models.active_task_user import ActiveTaskUserModel
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel

View File

@ -2,9 +2,7 @@
"title": "Simple form", "title": "Simple form",
"description": "A simple form example.", "description": "A simple form example.",
"type": "object", "type": "object",
"required": [ "required": ["name"],
"name"
],
"properties": { "properties": {
"name": { "name": {
"type": "string", "type": "string",
@ -14,11 +12,7 @@
"department": { "department": {
"type": "string", "type": "string",
"title": "Department", "title": "Department",
"enum": [ "enum": ["Finance", "HR", "IT"]
"Finance",
"HR",
"IT"
]
} }
} }
} }

View File

@ -1,9 +1,9 @@
{ {
"name": { "name": {
"ui:title": "Name", "ui:title": "Name",
"ui:description": "(Your name)" "ui:description": "(Your name)"
}, },
"department": { "department": {
"ui:title": "Department", "ui:title": "Department",
"ui:description": "(Your department)" "ui:description": "(Your department)"
}, },

View File

@ -11,9 +11,6 @@ from flask import current_app
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from werkzeug.test import TestResponse # type: ignore
from spiffworkflow_backend.models.permission_assignment import Permission from spiffworkflow_backend.models.permission_assignment import Permission
from spiffworkflow_backend.models.permission_target import PermissionTargetModel from spiffworkflow_backend.models.permission_target import PermissionTargetModel
from spiffworkflow_backend.models.process_group import ProcessGroup from spiffworkflow_backend.models.process_group import ProcessGroup
@ -27,6 +24,8 @@ from spiffworkflow_backend.services.authorization_service import AuthorizationSe
from spiffworkflow_backend.services.file_system_service import FileSystemService from spiffworkflow_backend.services.file_system_service import FileSystemService
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from werkzeug.test import TestResponse # type: ignore
# from tests.spiffworkflow_backend.helpers.test_data import logged_in_headers # from tests.spiffworkflow_backend.helpers.test_data import logged_in_headers
@ -137,7 +136,9 @@ class BaseTest:
# make sure we have a group # make sure we have a group
process_group_id, _ = os.path.split(process_model_id) process_group_id, _ = os.path.split(process_model_id)
modified_process_group_id = process_group_id.replace("/", ":") modified_process_group_id = process_group_id.replace("/", ":")
process_group_path = f"{FileSystemService.root_path()}/{process_group_id}" process_group_path = os.path.abspath(
os.path.join(FileSystemService.root_path(), process_group_id)
)
if ProcessModelService().is_group(process_group_path): if ProcessModelService().is_group(process_group_path):
if exception_notification_addresses is None: if exception_notification_addresses is None:

View File

@ -4,7 +4,6 @@ import os
from typing import Optional from typing import Optional
from flask import current_app from flask import current_app
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from spiffworkflow_backend.services.spec_file_service import SpecFileService from spiffworkflow_backend.services.spec_file_service import SpecFileService
@ -39,7 +38,7 @@ class ExampleDataLoader:
is_review=False, is_review=False,
) )
workflow_spec_service = ProcessModelService() workflow_spec_service = ProcessModelService()
workflow_spec_service.add_spec(spec) workflow_spec_service.add_process_model(spec)
bpmn_file_name_with_extension = bpmn_file_name bpmn_file_name_with_extension = bpmn_file_name
if not bpmn_file_name_with_extension: if not bpmn_file_name_with_extension:

View File

@ -1,14 +1,13 @@
"""User.""" """User."""
from typing import Optional from typing import Optional
from tests.spiffworkflow_backend.helpers.example_data import ExampleDataLoader
from spiffworkflow_backend.exceptions.process_entity_not_found_error import ( from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
ProcessEntityNotFoundError, ProcessEntityNotFoundError,
) )
from spiffworkflow_backend.models.process_group import ProcessGroup from spiffworkflow_backend.models.process_group import ProcessGroup
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.example_data import ExampleDataLoader
def assure_process_group_exists(process_group_id: Optional[str] = None) -> ProcessGroup: def assure_process_group_exists(process_group_id: Optional[str] = None) -> ProcessGroup:

View File

@ -2,11 +2,10 @@
import ast import ast
import base64 import base64
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.services.authentication_service import ( from spiffworkflow_backend.services.authentication_service import (
AuthenticationService, AuthenticationService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestAuthentication(BaseTest): class TestAuthentication(BaseTest):

View File

@ -1,9 +1,8 @@
"""Test_logging_service.""" """Test_logging_service."""
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestLoggingService(BaseTest): class TestLoggingService(BaseTest):

View File

@ -3,8 +3,6 @@ import json
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.process_group import ProcessGroup from spiffworkflow_backend.models.process_group import ProcessGroup
from spiffworkflow_backend.models.process_group import ProcessGroupSchema from spiffworkflow_backend.models.process_group import ProcessGroupSchema
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
@ -13,6 +11,7 @@ from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestNestedGroups(BaseTest): class TestNestedGroups(BaseTest):

View File

@ -9,9 +9,6 @@ import pytest
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.exceptions.process_entity_not_found_error import ( from spiffworkflow_backend.exceptions.process_entity_not_found_error import (
ProcessEntityNotFoundError, ProcessEntityNotFoundError,
) )
@ -36,6 +33,8 @@ from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
# from spiffworkflow_backend.services.git_service import GitService # from spiffworkflow_backend.services.git_service import GitService
@ -1830,7 +1829,7 @@ class TestProcessApi(BaseTest):
process_model = ProcessModelService().get_process_model( process_model = ProcessModelService().get_process_model(
process_model_identifier process_model_identifier
) )
ProcessModelService().update_spec( ProcessModelService().update_process_model(
process_model, process_model,
{"fault_or_suspend_on_exception": NotificationType.suspend.value}, {"fault_or_suspend_on_exception": NotificationType.suspend.value},
) )
@ -1885,7 +1884,7 @@ class TestProcessApi(BaseTest):
process_model = ProcessModelService().get_process_model( process_model = ProcessModelService().get_process_model(
process_model_identifier process_model_identifier
) )
ProcessModelService().update_spec( ProcessModelService().update_process_model(
process_model, process_model,
{"exception_notification_addresses": ["with_super_admin_user@example.com"]}, {"exception_notification_addresses": ["with_super_admin_user@example.com"]},
) )

View File

@ -6,15 +6,14 @@ import pytest
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from werkzeug.test import TestResponse # type: ignore
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
from spiffworkflow_backend.models.secret_model import SecretModel from spiffworkflow_backend.models.secret_model import SecretModel
from spiffworkflow_backend.models.secret_model import SecretModelSchema from spiffworkflow_backend.models.secret_model import SecretModelSchema
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from spiffworkflow_backend.services.secret_service import SecretService from spiffworkflow_backend.services.secret_service import SecretService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from werkzeug.test import TestResponse # type: ignore
class SecretServiceTestHelpers(BaseTest): class SecretServiceTestHelpers(BaseTest):

View File

@ -2,15 +2,14 @@
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestGetGroupMembers(BaseTest): class TestGetGroupMembers(BaseTest):

View File

@ -4,9 +4,6 @@ import datetime
import pytz import pytz
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.script_attributes_context import ( from spiffworkflow_backend.models.script_attributes_context import (
ScriptAttributesContext, ScriptAttributesContext,
) )
@ -17,6 +14,8 @@ from spiffworkflow_backend.services.process_instance_processor import (
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestGetLocaltime(BaseTest): class TestGetLocaltime(BaseTest):

View File

@ -1,6 +1,5 @@
"""Test_acceptance_test_fixtures.""" """Test_acceptance_test_fixtures."""
from flask.app import Flask from flask.app import Flask
from spiffworkflow_backend.services.acceptance_test_fixtures import ( from spiffworkflow_backend.services.acceptance_test_fixtures import (
load_acceptance_test_fixtures, load_acceptance_test_fixtures,
) )

View File

@ -2,8 +2,6 @@
import pytest import pytest
from flask import Flask from flask import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.models.user import UserNotFoundError from spiffworkflow_backend.models.user import UserNotFoundError
from spiffworkflow_backend.services.authorization_service import AuthorizationService from spiffworkflow_backend.services.authorization_service import AuthorizationService
@ -14,6 +12,7 @@ from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestAuthorizationService(BaseTest): class TestAuthorizationService(BaseTest):

View File

@ -1,8 +1,6 @@
"""Test_various_bpmn_constructs.""" """Test_various_bpmn_constructs."""
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
@ -10,6 +8,7 @@ from spiffworkflow_backend.services.process_instance_processor import (
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestDotNotation(BaseTest): class TestDotNotation(BaseTest):

View File

@ -1,10 +1,9 @@
"""Test_environment_var_script.""" """Test_environment_var_script."""
from flask import Flask from flask import Flask
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestEnvironmentVarScript(BaseTest): class TestEnvironmentVarScript(BaseTest):

View File

@ -3,12 +3,11 @@ import pytest
from flask import Flask from flask import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
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.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestMessageInstance(BaseTest): class TestMessageInstance(BaseTest):

View File

@ -1,9 +1,6 @@
"""Test_message_service.""" """Test_message_service."""
from flask import Flask from flask import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.message_correlation import MessageCorrelationModel from spiffworkflow_backend.models.message_correlation import MessageCorrelationModel
from spiffworkflow_backend.models.message_correlation_message_instance import ( from spiffworkflow_backend.models.message_correlation_message_instance import (
MessageCorrelationMessageInstanceModel, MessageCorrelationMessageInstanceModel,
@ -18,6 +15,8 @@ from spiffworkflow_backend.services.process_instance_processor import (
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestMessageService(BaseTest): class TestMessageService(BaseTest):

View File

@ -2,12 +2,11 @@
import pytest import pytest
from flask.app import Flask from flask.app import Flask
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.permission_target import ( from spiffworkflow_backend.models.permission_target import (
InvalidPermissionTargetUriError, InvalidPermissionTargetUriError,
) )
from spiffworkflow_backend.models.permission_target import PermissionTargetModel from spiffworkflow_backend.models.permission_target import PermissionTargetModel
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestPermissionTarget(BaseTest): class TestPermissionTarget(BaseTest):

View File

@ -2,15 +2,14 @@
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel
from spiffworkflow_backend.models.permission_target import PermissionTargetModel from spiffworkflow_backend.models.permission_target import PermissionTargetModel
from spiffworkflow_backend.models.principal import PrincipalModel from spiffworkflow_backend.models.principal import PrincipalModel
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.user_service import UserService from spiffworkflow_backend.services.user_service import UserService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
# we think we can get the list of roles for a user. # we think we can get the list of roles for a user.

View File

@ -1,6 +1,5 @@
"""Process Model.""" """Process Model."""
from flask.app import Flask from flask.app import Flask
from spiffworkflow_backend.models.process_group import ProcessGroup from spiffworkflow_backend.models.process_group import ProcessGroup
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService

View File

@ -3,9 +3,6 @@ import pytest
from flask import g from flask import g
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.group import GroupModel from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
@ -19,6 +16,8 @@ from spiffworkflow_backend.services.process_instance_processor import (
from spiffworkflow_backend.services.process_instance_service import ( from spiffworkflow_backend.services.process_instance_service import (
ProcessInstanceService, ProcessInstanceService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestProcessInstanceProcessor(BaseTest): class TestProcessInstanceProcessor(BaseTest):

View File

@ -2,12 +2,11 @@
from typing import Optional from typing import Optional
from flask.app import Flask from flask.app import Flask
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance_report import ( from spiffworkflow_backend.models.process_instance_report import (
ProcessInstanceReportModel, ProcessInstanceReportModel,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
# from tests.spiffworkflow_backend.helpers.test_data import find_or_create_process_group # from tests.spiffworkflow_backend.helpers.test_data import find_or_create_process_group
# from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel # from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel

View File

@ -3,8 +3,6 @@ from typing import Optional
from flask import Flask from flask import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.process_instance_report import ( from spiffworkflow_backend.models.process_instance_report import (
ProcessInstanceReportModel, ProcessInstanceReportModel,
) )
@ -15,6 +13,7 @@ from spiffworkflow_backend.services.process_instance_report_service import (
from spiffworkflow_backend.services.process_instance_report_service import ( from spiffworkflow_backend.services.process_instance_report_service import (
ProcessInstanceReportService, ProcessInstanceReportService,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestProcessInstanceReportFilter(BaseTest): class TestProcessInstanceReportFilter(BaseTest):

View File

@ -2,15 +2,14 @@
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.process_model import ProcessModelInfo
from spiffworkflow_backend.models.spec_reference import SpecReferenceCache from spiffworkflow_backend.models.spec_reference import SpecReferenceCache
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestProcessModel(BaseTest): class TestProcessModel(BaseTest):

View File

@ -1,11 +1,10 @@
"""Test_process_model_service.""" """Test_process_model_service."""
from flask import Flask from flask import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestProcessModelService(BaseTest): class TestProcessModelService(BaseTest):
@ -32,7 +31,9 @@ class TestProcessModelService(BaseTest):
primary_process_id = process_model.primary_process_id primary_process_id = process_model.primary_process_id
assert primary_process_id == "Process_HelloWorld" assert primary_process_id == "Process_HelloWorld"
ProcessModelService().update_spec(process_model, {"display_name": "new_name"}) ProcessModelService().update_process_model(
process_model, {"display_name": "new_name"}
)
assert process_model.display_name == "new_name" assert process_model.display_name == "new_name"
assert process_model.primary_process_id == primary_process_id assert process_model.primary_process_id == primary_process_id

View File

@ -3,13 +3,12 @@ import pytest
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.api.api_error import ApiError from flask_bpmn.api.api_error import ApiError
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestOpenFile(BaseTest): class TestOpenFile(BaseTest):

View File

@ -1,15 +1,14 @@
"""Test Permissions.""" """Test Permissions."""
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from spiffworkflow_backend.services.script_unit_test_runner import PythonScriptContext from spiffworkflow_backend.services.script_unit_test_runner import PythonScriptContext
from spiffworkflow_backend.services.script_unit_test_runner import ScriptUnitTestRunner from spiffworkflow_backend.services.script_unit_test_runner import ScriptUnitTestRunner
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestScriptUnitTestRunner(BaseTest): class TestScriptUnitTestRunner(BaseTest):

View File

@ -1,9 +1,8 @@
"""Test_various_bpmn_constructs.""" """Test_various_bpmn_constructs."""
from flask.app import Flask from flask.app import Flask
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.services.secret_service import SecretService from spiffworkflow_backend.services.secret_service import SecretService
from spiffworkflow_backend.services.service_task_service import ServiceTaskDelegate from spiffworkflow_backend.services.service_task_service import ServiceTaskDelegate
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestServiceTaskDelegate(BaseTest): class TestServiceTaskDelegate(BaseTest):

View File

@ -6,13 +6,12 @@ from flask import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from SpiffWorkflow.bpmn.parser.ValidationException import ValidationException # type: ignore from SpiffWorkflow.bpmn.parser.ValidationException import ValidationException # type: ignore
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.spec_reference import SpecReferenceCache from spiffworkflow_backend.models.spec_reference import SpecReferenceCache
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from spiffworkflow_backend.services.spec_file_service import SpecFileService from spiffworkflow_backend.services.spec_file_service import SpecFileService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
class TestSpecFileService(BaseTest): class TestSpecFileService(BaseTest):

View File

@ -3,11 +3,10 @@ from decimal import Decimal
from flask.app import Flask from flask.app import Flask
from flask_bpmn.models.db import db from flask_bpmn.models.db import db
from spiffworkflow_backend.models.spiff_logging import SpiffLoggingModel
from tests.spiffworkflow_backend.helpers.base_test import BaseTest from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from tests.spiffworkflow_backend.helpers.test_data import load_test_spec from tests.spiffworkflow_backend.helpers.test_data import load_test_spec
from spiffworkflow_backend.models.spiff_logging import SpiffLoggingModel
class TestSpiffLogging(BaseTest): class TestSpiffLogging(BaseTest):
"""TestSpiffLogging.""" """TestSpiffLogging."""

View File

@ -1,13 +1,12 @@
"""Test_various_bpmn_constructs.""" """Test_various_bpmn_constructs."""
from flask.app import Flask from flask.app import Flask
from flask.testing import FlaskClient from flask.testing import FlaskClient
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.models.user import UserModel
from spiffworkflow_backend.services.process_instance_processor import ( from spiffworkflow_backend.services.process_instance_processor import (
ProcessInstanceProcessor, ProcessInstanceProcessor,
) )
from spiffworkflow_backend.services.process_model_service import ProcessModelService from spiffworkflow_backend.services.process_model_service import ProcessModelService
from tests.spiffworkflow_backend.helpers.base_test import BaseTest
class TestVariousBpmnConstructs(BaseTest): class TestVariousBpmnConstructs(BaseTest):

View File

@ -1,7 +1,6 @@
"""Test cases for the __main__ module.""" """Test cases for the __main__ module."""
import pytest import pytest
from click.testing import CliRunner from click.testing import CliRunner
from spiffworkflow_backend import __main__ from spiffworkflow_backend import __main__

View File

@ -837,11 +837,7 @@ export default function ProcessModelEditDiagram() {
}; };
// if a file name is not given then this is a new model and the ReactDiagramEditor component will handle it // if a file name is not given then this is a new model and the ReactDiagramEditor component will handle it
if ( if ((bpmnXmlForDiagramRendering || !params.file_name) && processModel) {
(bpmnXmlForDiagramRendering || !params.file_name) &&
processModel &&
processes.length > 0
) {
const processModelFileName = processModelFile ? processModelFile.name : ''; const processModelFileName = processModelFile ? processModelFile.name : '';
return ( return (
<> <>