added active task model and some support to send back the form json w/ burnettk

This commit is contained in:
jasquat 2022-06-29 16:19:07 -04:00
parent 5fd85eadda
commit 898c08fa62
9 changed files with 61 additions and 33 deletions

View File

@ -1,3 +1,5 @@
from __future__ import with_statement
import logging
from logging.config import fileConfig

View File

@ -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')
)

22
poetry.lock generated
View File

@ -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 = [

View File

@ -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"

View File

@ -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)

View File

@ -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)

View File

@ -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."""

View File

@ -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

View File

@ -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()