diff --git a/spiffworkflow-backend/migrations/env.py b/spiffworkflow-backend/migrations/env.py index 630e381a..68feded2 100644 --- a/spiffworkflow-backend/migrations/env.py +++ b/spiffworkflow-backend/migrations/env.py @@ -1,3 +1,5 @@ +from __future__ import with_statement + import logging from logging.config import fileConfig diff --git a/spiffworkflow-backend/migrations/versions/70223f5c7b98_.py b/spiffworkflow-backend/migrations/versions/37079935891c_.py similarity index 97% rename from spiffworkflow-backend/migrations/versions/70223f5c7b98_.py rename to spiffworkflow-backend/migrations/versions/37079935891c_.py index 0d920944..7bd8ff31 100644 --- a/spiffworkflow-backend/migrations/versions/70223f5c7b98_.py +++ b/spiffworkflow-backend/migrations/versions/37079935891c_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 70223f5c7b98 +Revision ID: 37079935891c Revises: -Create Date: 2022-11-20 19:54:45.061376 +Create Date: 2022-11-24 11:44:47.149204 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '70223f5c7b98' +revision = '37079935891c' down_revision = None branch_labels = None depends_on = None @@ -97,14 +97,12 @@ def upgrade(): sa.Column('id', sa.Integer(), nullable=False), sa.Column('message_model_id', sa.Integer(), nullable=False), sa.Column('process_model_identifier', sa.String(length=50), nullable=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.f('ix_message_triggerable_process_model_process_model_identifier'), 'message_triggerable_process_model', ['process_model_identifier'], unique=False) op.create_table('principal', sa.Column('id', sa.Integer(), nullable=False), @@ -120,6 +118,7 @@ def upgrade(): op.create_table('process_instance', sa.Column('id', sa.Integer(), nullable=False), sa.Column('process_model_identifier', sa.String(length=255), nullable=False), + sa.Column('process_model_display_name', sa.String(length=255), nullable=False), sa.Column('process_group_identifier', sa.String(length=50), nullable=False), sa.Column('process_initiator_id', sa.Integer(), nullable=False), sa.Column('bpmn_json', sa.JSON(), nullable=True), @@ -135,6 +134,7 @@ def upgrade(): sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_process_instance_process_group_identifier'), 'process_instance', ['process_group_identifier'], unique=False) + op.create_index(op.f('ix_process_instance_process_model_display_name'), 'process_instance', ['process_model_display_name'], unique=False) op.create_index(op.f('ix_process_instance_process_model_identifier'), 'process_instance', ['process_model_identifier'], unique=False) op.create_table('process_instance_report', sa.Column('id', sa.Integer(), nullable=False), @@ -300,11 +300,11 @@ def downgrade(): op.drop_index(op.f('ix_process_instance_report_created_by_id'), 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_model_display_name'), 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') diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/api.yml b/spiffworkflow-backend/src/spiffworkflow_backend/api.yml index 23cd66c5..e7dc00fe 100755 --- a/spiffworkflow-backend/src/spiffworkflow_backend/api.yml +++ b/spiffworkflow-backend/src/spiffworkflow_backend/api.yml @@ -1665,10 +1665,6 @@ components: type: integer x-nullable: true example: 12 - study_id: - type: integer - x-nullable: true - example: 42 user_id: type: string x-nullable: true @@ -1793,8 +1789,6 @@ components: type: integer num_tasks_incomplete: type: integer - study_id: - type: integer example: id: 291234 @@ -1929,9 +1923,6 @@ components: workflow_id: example: 42 type: integer - study_id: - example: 187 - type: integer user_uid: example: "dhf8r" type: string diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py index 9e4c3928..cc883465 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/message_triggerable_process_model.py @@ -16,8 +16,6 @@ class MessageTriggerableProcessModel(SpiffworkflowBaseDBModel): ForeignKey(MessageModel.id), nullable=False, unique=True ) process_model_identifier: str = db.Column(db.String(50), nullable=False, index=True) - # fixme: Maybe we don't need this anymore? - process_group_identifier: str = db.Column(db.String(50), nullable=False, index=True) updated_at_in_seconds: int = db.Column(db.Integer) created_at_in_seconds: int = db.Column(db.Integer) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py index 2e94e994..7068af65 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py @@ -74,6 +74,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): process_model_identifier: str = db.Column( db.String(255), nullable=False, index=True ) + process_model_display_name: str = db.Column( + db.String(255), nullable=False, index=True + ) process_group_identifier: str = db.Column(db.String(50), nullable=False, index=True) process_initiator_id: int = db.Column(ForeignKey(UserModel.id), nullable=False) process_initiator = relationship("UserModel") @@ -166,23 +169,18 @@ class ProcessInstanceApi: status: ProcessInstanceStatus, next_task: Task | None, process_model_identifier: str, - process_group_identifier: str, + process_model_display_name: str, completed_tasks: int, updated_at_in_seconds: int, - is_review: bool, - title: str, ) -> None: """__init__.""" self.id = id self.status = status self.next_task = next_task # The next task that requires user input. - # self.navigation = navigation fixme: would be a hotness. self.process_model_identifier = process_model_identifier - self.process_group_identifier = process_group_identifier + self.process_model_display_name = process_model_display_name self.completed_tasks = completed_tasks self.updated_at_in_seconds = updated_at_in_seconds - self.title = title - self.is_review = is_review class ProcessInstanceApiSchema(Schema): @@ -196,24 +194,14 @@ class ProcessInstanceApiSchema(Schema): "id", "status", "next_task", - "navigation", "process_model_identifier", - "process_group_identifier", "completed_tasks", "updated_at_in_seconds", - "is_review", - "title", - "study_id", - "state", ] unknown = INCLUDE status = EnumField(ProcessInstanceStatus) next_task = marshmallow.fields.Nested(TaskSchema, dump_only=True, required=False) - navigation = marshmallow.fields.List( - marshmallow.fields.Nested(NavigationItemSchema, dump_only=True) - ) - state = marshmallow.fields.String(allow_none=True) @marshmallow.post_load def make_process_instance( @@ -224,73 +212,10 @@ class ProcessInstanceApiSchema(Schema): "id", "status", "next_task", - "navigation", "process_model_identifier", - "process_group_identifier", "completed_tasks", "updated_at_in_seconds", - "is_review", - "title", - "study_id", - "state", ] filtered_fields = {key: data[key] for key in keys} filtered_fields["next_task"] = TaskSchema().make_task(data["next_task"]) return ProcessInstanceApi(**filtered_fields) - - -@dataclass -class ProcessInstanceMetadata: - """ProcessInstanceMetadata.""" - - id: int - display_name: str | None = None - description: str | None = None - spec_version: str | None = None - state: str | None = None - status: str | None = None - completed_tasks: int | None = None - is_review: bool | None = None - state_message: str | None = None - process_model_identifier: str | None = None - process_group_id: str | None = None - - @classmethod - def from_process_instance( - cls, process_instance: ProcessInstanceModel, process_model: ProcessModelInfo - ) -> ProcessInstanceMetadata: - """From_process_instance.""" - instance = cls( - id=process_instance.id, - display_name=process_model.display_name, - description=process_model.description, - process_group_id=process_model.process_group, - state_message=process_instance.state_message, - status=process_instance.status, - completed_tasks=process_instance.completed_tasks, - is_review=process_model.is_review, - process_model_identifier=process_instance.process_model_identifier, - ) - return instance - - -class ProcessInstanceMetadataSchema(Schema): - """ProcessInstanceMetadataSchema.""" - - status = EnumField(ProcessInstanceStatus) - - class Meta: - """Meta.""" - - model = ProcessInstanceMetadata - additional = [ - "id", - "display_name", - "description", - "state", - "completed_tasks", - "process_group_id", - "is_review", - "state_message", - ] - unknown = INCLUDE diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py index 7aee257f..4f5ee2ad 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_model.py @@ -34,7 +34,6 @@ class ProcessModelInfo: primary_file_name: str | None = None primary_process_id: str | None = None display_order: int | None = 0 - is_review: bool = False files: list[File] | None = field(default_factory=list[File]) fault_or_suspend_on_exception: str = NotificationType.fault.value exception_notification_addresses: list[str] = field(default_factory=list) @@ -72,7 +71,6 @@ class ProcessModelInfoSchema(Schema): display_order = marshmallow.fields.Integer(allow_none=True) primary_file_name = marshmallow.fields.String(allow_none=True) primary_process_id = marshmallow.fields.String(allow_none=True) - is_review = marshmallow.fields.Boolean(allow_none=True) files = marshmallow.fields.List(marshmallow.fields.Nested("FileSchema")) fault_or_suspend_on_exception = marshmallow.fields.String() exception_notification_addresses = marshmallow.fields.List( diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 80887a6e..61febccb 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -349,7 +349,7 @@ class ProcessInstanceProcessor: check_sub_specs(test_spec, 5) self.process_model_identifier = process_instance_model.process_model_identifier - # self.process_group_identifier = process_instance_model.process_group_identifier + self.process_model_display_name = process_instance_model.process_model_display_name try: self.bpmn_process_instance = self.__get_bpmn_process_instance( diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py index 34ec6a26..905a9dbb 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py @@ -12,6 +12,7 @@ from spiffworkflow_backend.models.active_task import ActiveTaskModel from spiffworkflow_backend.models.process_instance import ProcessInstanceApi from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus +from spiffworkflow_backend.models.process_model import ProcessModelInfo from spiffworkflow_backend.models.task import MultiInstanceType from spiffworkflow_backend.models.task import Task from spiffworkflow_backend.models.user import UserModel @@ -30,7 +31,7 @@ class ProcessInstanceService: @staticmethod def create_process_instance( - process_model_identifier: str, + process_model: ProcessModelInfo, user: UserModel, ) -> ProcessInstanceModel: """Get_process_instance_from_spec.""" @@ -38,8 +39,8 @@ class ProcessInstanceService: process_instance_model = ProcessInstanceModel( status=ProcessInstanceStatus.not_started.value, process_initiator=user, - process_model_identifier=process_model_identifier, - process_group_identifier="", + process_model_identifier=process_model.id, + process_model_display_name=process_model.display_name, start_in_seconds=round(time.time()), bpmn_version_control_type="git", bpmn_version_control_identifier=current_git_revision, @@ -88,20 +89,15 @@ class ProcessInstanceService: process_model = process_model_service.get_process_model( processor.process_model_identifier ) - is_review_value = process_model.is_review if process_model else False title_value = process_model.display_name if process_model else "" process_instance_api = ProcessInstanceApi( id=processor.get_process_instance_id(), status=processor.get_status(), next_task=None, - # navigation=navigation, process_model_identifier=processor.process_model_identifier, - process_group_identifier="", - # total_tasks=len(navigation), + process_model_display_name=processor.process_model_display_name, completed_tasks=processor.process_instance_model.completed_tasks, updated_at_in_seconds=processor.process_instance_model.updated_at_in_seconds, - is_review=is_review_value, - title=title_value, ) next_task_trying_again = next_task diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py index ba3039cd..20bc226c 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_model_service.py @@ -429,7 +429,6 @@ class ProcessModelService(FileSystemService): display_name=name, description="", display_order=0, - is_review=False, ) self.write_json_file( json_file_path, self.PROCESS_MODEL_SCHEMA.dump(process_model_info) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py index f02e3a6f..5b808536 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/spec_file_service.py @@ -176,7 +176,6 @@ class SpecFileService(FileSystemService): { "primary_process_id": ref.identifier, "primary_file_name": file_name, - "is_review": ref.has_lanes, }, ) SpecFileService.update_caches(ref) diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py index c93a70f8..0ecbbc96 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/base_test.py @@ -149,7 +149,6 @@ class BaseTest: id=process_model_id, display_name=process_model_display_name, description=process_model_description, - is_review=False, primary_process_id=primary_process_id, primary_file_name=primary_file_name, fault_or_suspend_on_exception=fault_or_suspend_on_exception, diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py index befd2602..250e2c15 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/helpers/example_data.py @@ -36,7 +36,6 @@ class ExampleDataLoader: display_name=display_name, description=description, display_order=display_order, - is_review=False, ) workflow_spec_service = ProcessModelService() workflow_spec_service.add_process_model(spec) diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py index 6e9858b3..aab43fc1 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py @@ -332,14 +332,12 @@ class TestProcessApi(BaseTest): ) assert process_model.id == process_model_identifier assert process_model.display_name == "Cooooookies" - assert process_model.is_review is False assert process_model.primary_file_name is None assert process_model.primary_process_id is None process_model.display_name = "Updated Display Name" process_model.primary_file_name = "superduper.bpmn" process_model.primary_process_id = "superduper" - process_model.is_review = True # not in the include list, so get ignored modified_process_model_identifier = process_model_identifier.replace("/", ":") response = client.put( @@ -353,7 +351,6 @@ class TestProcessApi(BaseTest): assert response.json["display_name"] == "Updated Display Name" assert response.json["primary_file_name"] == "superduper.bpmn" assert response.json["primary_process_id"] == "superduper" - assert response.json["is_review"] is False def test_process_model_list_all( self,