From 898c08fa628e14215880ca66893302153c193ba3 Mon Sep 17 00:00:00 2001 From: jasquat Date: Wed, 29 Jun 2022 16:19:07 -0400 Subject: [PATCH] added active task model and some support to send back the form json w/ burnettk --- migrations/env.py | 2 ++ .../{a650f4061955_.py => 602d035583e9_.py} | 14 ++++++---- poetry.lock | 22 ++++++--------- pyproject.toml | 7 +++-- .../models/active_task.py | 9 ++++-- .../models/process_instance.py | 2 +- .../routes/admin_blueprint/admin_blueprint.py | 5 ++++ .../routes/process_api_blueprint.py | 5 ++++ .../services/process_instance_processor.py | 28 +++++++++++++------ 9 files changed, 61 insertions(+), 33 deletions(-) rename migrations/versions/{a650f4061955_.py => 602d035583e9_.py} (95%) diff --git a/migrations/env.py b/migrations/env.py index 630e381a..68feded2 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -1,3 +1,5 @@ +from __future__ import with_statement + import logging from logging.config import fileConfig diff --git a/migrations/versions/a650f4061955_.py b/migrations/versions/602d035583e9_.py similarity index 95% rename from migrations/versions/a650f4061955_.py rename to migrations/versions/602d035583e9_.py index 9b4de3ee..4daddc11 100644 --- a/migrations/versions/a650f4061955_.py +++ b/migrations/versions/602d035583e9_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: a650f4061955 +Revision ID: 602d035583e9 Revises: -Create Date: 2022-06-28 15:15:08.319053 +Create Date: 2022-06-29 15:53:50.319748 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = 'a650f4061955' +revision = '602d035583e9' down_revision = None branch_labels = None depends_on = None @@ -48,7 +48,9 @@ def upgrade(): 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.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('group_id'), + sa.UniqueConstraint('user_id') ) op.create_table('process_instance', sa.Column('id', sa.Integer(), nullable=False), @@ -94,10 +96,12 @@ def upgrade(): sa.Column('process_instance_id', sa.Integer(), nullable=False), sa.Column('assigned_principal_id', sa.Integer(), nullable=True), sa.Column('process_instance_data', sa.Text(), nullable=True), - sa.Column('status', sa.String(length=50), nullable=False), + sa.Column('status', sa.String(length=20), nullable=False), + sa.Column('form_file_name', 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(['assigned_principal_id'], ['principal.id'], ), + sa.ForeignKeyConstraint(['process_instance_id'], ['process_instance.id'], ), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('task_id', 'process_instance_id', name='active_task_unique') ) diff --git a/poetry.lock b/poetry.lock index 2fd35a91..35c5ce90 100644 --- a/poetry.lock +++ b/poetry.lock @@ -598,7 +598,7 @@ description = "Flask Bpmn" category = "main" optional = false python-versions = "^3.7" -develop = false +develop = true [package.dependencies] click = "^8.0.1" @@ -612,14 +612,12 @@ flask-migrate = "*" flask-restful = "*" sentry-sdk = "0.14.4" sphinx-autoapi = "^1.8.4" -spiffworkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} +spiffworkflow = {path = "/home/jason/projects/github/sartography/SpiffWorkflow", develop = true} werkzeug = "*" [package.source] -type = "git" -url = "https://github.com/sartography/flask-bpmn" -reference = "main" -resolved_reference = "3dbe2117afb378eaff71872080b45453a61a129d" +type = "directory" +url = "../flask-bpmn" [[package]] name = "flask-cors" @@ -1717,11 +1715,11 @@ test = ["pytest"] [[package]] name = "SpiffWorkflow" version = "1.1.7" -description = "" +description = "A workflow framework and BPMN/DMN Processor" category = "main" optional = false python-versions = "*" -develop = false +develop = true [package.dependencies] celery = "*" @@ -1731,10 +1729,8 @@ lxml = "*" pytz = "*" [package.source] -type = "git" -url = "https://github.com/sartography/SpiffWorkflow" -reference = "main" -resolved_reference = "26fa5865aa636dd70006a07c7e6233d93464684b" +type = "directory" +url = "../SpiffWorkflow" [[package]] name = "sqlalchemy" @@ -2021,7 +2017,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest- [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "5b14a72a62346e76294a4c854e48dac9c6d8ce353c5d6a269dc08635d008054f" +content-hash = "ca131da7f816bbda38aa2aea41679280d6d941bb79cd98d7d057db34acc1489a" [metadata.files] alabaster = [ diff --git a/pyproject.toml b/pyproject.toml index 055508a2..1861553f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,12 +27,13 @@ flask-marshmallow = "*" flask-migrate = "*" flask-restful = "*" werkzeug = "*" -spiffworkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} +# spiffworkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} +spiffworkflow = {develop = true, path = "/home/jason/projects/github/sartography/SpiffWorkflow"} sentry-sdk = "0.14.4" sphinx-autoapi = "^1.8.4" -# flask-bpmn = {develop = true, path = "/home/jason/projects/github/sartography/flask-bpmn"} +flask-bpmn = {develop = true, path = "/home/jason/projects/github/sartography/flask-bpmn"} # flask-bpmn = {develop = true, path = "/Users/kevin/projects/github/sartography/flask-bpmn"} -flask-bpmn = {git = "https://github.com/sartography/flask-bpmn", rev = "main"} +# flask-bpmn = {git = "https://github.com/sartography/flask-bpmn", rev = "main"} mysql-connector-python = "^8.0.29" pytest-flask = "^1.2.0" pytest-flask-sqlalchemy = "^1.1.0" diff --git a/src/spiffworkflow_backend/models/active_task.py b/src/spiffworkflow_backend/models/active_task.py index 57136687..ac00dc37 100644 --- a/src/spiffworkflow_backend/models/active_task.py +++ b/src/spiffworkflow_backend/models/active_task.py @@ -2,12 +2,14 @@ from __future__ import annotations from dataclasses import dataclass +from typing import Optional from flask_bpmn.models.db import db from flask_bpmn.models.db import SpiffworkflowBaseDBModel from sqlalchemy import ForeignKey from spiffworkflow_backend.models.principal import PrincipalModel +from spiffworkflow_backend.models.process_instance import ProcessInstanceModel @dataclass @@ -21,12 +23,15 @@ class ActiveTaskModel(SpiffworkflowBaseDBModel): ), ) + form_json: Optional[str] + bpmn_json: str = "" id: int = db.Column(db.Integer, primary_key=True) task_id: str = db.Column(db.String(50), nullable=False) - process_instance_id: int = db.Column(db.Integer, nullable=False) + process_instance_id: int = db.Column(ForeignKey(ProcessInstanceModel.id), nullable=False) assigned_principal_id: int = db.Column(ForeignKey(PrincipalModel.id)) process_instance_data: str = db.Column(db.Text) - status: str = db.Column(db.String(50), nullable=False) + status: str = db.Column(db.String(20), nullable=False) + form_file_name: Optional[str] = db.Column(db.String(50)) updated_at_in_seconds: int = db.Column(db.Integer) created_at_in_seconds: int = db.Column(db.Integer) diff --git a/src/spiffworkflow_backend/models/process_instance.py b/src/spiffworkflow_backend/models/process_instance.py index 21ef9c60..70583a0b 100644 --- a/src/spiffworkflow_backend/models/process_instance.py +++ b/src/spiffworkflow_backend/models/process_instance.py @@ -80,7 +80,7 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): """ProcessInstanceModel.""" __tablename__ = "process_instance" - id: int = db.Column(db.Integer, primary_key=True) + id = db.Column(db.Integer, primary_key=True) process_model_identifier: str = db.Column(db.String(50), 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) diff --git a/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py b/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py index 3c19596e..a5cac9ac 100644 --- a/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py +++ b/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py @@ -30,6 +30,11 @@ admin_blueprint = Blueprint( ALLOWED_BPMN_EXTENSIONS = {"bpmn", "dmn"} +@admin_blueprint.before_app_first_request +def before_first_request() -> None: + token() + + @admin_blueprint.route("/token", methods=["GET"]) def token() -> str: """Token.""" diff --git a/src/spiffworkflow_backend/routes/process_api_blueprint.py b/src/spiffworkflow_backend/routes/process_api_blueprint.py index a2bedfe2..4dc2e8e6 100644 --- a/src/spiffworkflow_backend/routes/process_api_blueprint.py +++ b/src/spiffworkflow_backend/routes/process_api_blueprint.py @@ -481,6 +481,11 @@ def task_show(task_id: int) -> flask.wrappers.Response: ) ) + process_instance = ProcessInstanceModel.query.filter_by(id=active_task_assigned_to_me.process_instance_id).first() + process_model = get_process_model(process_instance.process_model_identifier, process_instance.process_group_identifier) + file_contents = SpecFileService.get_data(process_model, active_task_assigned_to_me.form_file_name) + active_task_assigned_to_me.form_json = str(file_contents) + return active_task_assigned_to_me diff --git a/src/spiffworkflow_backend/services/process_instance_processor.py b/src/spiffworkflow_backend/services/process_instance_processor.py index e1dc4d18..a7bd03ca 100644 --- a/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/src/spiffworkflow_backend/services/process_instance_processor.py @@ -312,6 +312,7 @@ class ProcessInstanceProcessor: bpmn_process_instance.data[ ProcessInstanceProcessor.VALIDATION_PROCESS_KEY ] = validate_only + print(f"bpmn_process_instance: {bpmn_process_instance}") return bpmn_process_instance def save(self) -> None: @@ -336,15 +337,24 @@ class ProcessInstanceProcessor: ready_or_waiting_tasks = self.get_all_ready_or_waiting_tasks() for ready_or_waiting_task in ready_or_waiting_tasks: - active_task = ActiveTaskModel( - task_id=str(ready_or_waiting_task.id), - process_instance_id=self.process_instance_model.id, - # FIXME: look for the correct principal based on ready_or_waiting_task.lane - assigned_principal_id=PrincipalModel.query.first().id, - process_instance_data=json.dumps(self.get_data()), - status=ready_or_waiting_task.state.name, - ) - db.session.add(active_task) + # filter out non-usertasks + if not self.bpmn_process_instance._is_engine_task(ready_or_waiting_task.task_spec): + extensions = ready_or_waiting_task.task_spec.extensions + + form_file_name = None + if 'formKey' in extensions: + form_file_name = extensions['formKey'] + + active_task = ActiveTaskModel( + task_id=str(ready_or_waiting_task.id), + process_instance_id=self.process_instance_model.id, + # FIXME: look for the correct principal based on ready_or_waiting_task.lane + assigned_principal_id=PrincipalModel.query.first().id, + process_instance_data=json.dumps(self.get_data()), + status=ready_or_waiting_task.state.name, + form_file_name=form_file_name + ) + db.session.add(active_task) db.session.commit()