added file to load to all models and add event listeners for create and upate w/ burnettk

This commit is contained in:
jasquat 2022-06-21 12:10:47 -04:00
parent c13553ff6d
commit 388edb2df4
20 changed files with 55 additions and 26 deletions

View File

@ -18,3 +18,4 @@ per-file-ignores =
# migrations are autogenerated from "flask db migration" so ignore them
migrations/*:D
src/spiffworkflow_backend/config/testing.py:S105
src/spiffworkflow_backend/load_database_models.py:F401

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: b988942cdd3d
Revision ID: c09e95d03bac
Revises:
Create Date: 2022-06-20 10:24:45.372883
Create Date: 2022-06-21 10:41:50.430102
"""
from alembic import op
@ -10,7 +10,7 @@ import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b988942cdd3d'
revision = 'c09e95d03bac'
down_revision = None
branch_labels = None
depends_on = None
@ -57,7 +57,7 @@ def upgrade():
sa.Column('bpmn_json', sa.JSON(), nullable=True),
sa.Column('start_in_seconds', sa.Integer(), nullable=True),
sa.Column('end_in_seconds', sa.Integer(), nullable=True),
sa.Column('last_updated', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
sa.Column('last_updated', sa.DateTime(timezone=True), nullable=True),
sa.Column('process_initiator_id', sa.Integer(), nullable=False),
sa.Column('status', sa.Enum('not_started', 'user_input_required', 'waiting', 'complete', 'erroring', name='processinstancestatus'), nullable=True),
sa.ForeignKeyConstraint(['process_initiator_id'], ['user.id'], ),

11
poetry.lock generated
View File

@ -611,7 +611,7 @@ description = "Flask Bpmn"
category = "main"
optional = false
python-versions = "^3.7"
develop = false
develop = true
[package.dependencies]
click = "^8.0.1"
@ -629,10 +629,8 @@ spiffworkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "ma
werkzeug = "*"
[package.source]
type = "git"
url = "https://github.com/sartography/flask-bpmn"
reference = "main"
resolved_reference = "2926754a06c2da290067966bb3d18e3fbb7bff86"
type = "directory"
url = "../flask-bpmn"
[[package]]
name = "flask-cors"
@ -2056,7 +2054,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-
[metadata]
lock-version = "1.1"
python-versions = "^3.8"
content-hash = "3b904d4d870e7e1350000302779598858703ed9011b45681a649772603ec484d"
content-hash = "15f411e02a398487612fbb12e260b1ec384fd23397002479b1b4683da574de66"
[metadata.files]
alabaster = [
@ -3142,6 +3140,7 @@ sqlalchemy = [
{file = "SQLAlchemy-1.4.37-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:d9050b0c4a7f5538650c74aaba5c80cd64450e41c206f43ea6d194ae6d060ff9"},
{file = "SQLAlchemy-1.4.37-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b4c92823889cf9846b972ee6db30c0e3a92c0ddfc76c6060a6cda467aa5fb694"},
{file = "SQLAlchemy-1.4.37-cp27-cp27m-win32.whl", hash = "sha256:b55932fd0e81b43f4aff397c8ad0b3c038f540af37930423ab8f47a20b117e4c"},
{file = "SQLAlchemy-1.4.37-cp27-cp27m-win_amd64.whl", hash = "sha256:4a17c1a1152ca4c29d992714aa9df3054da3af1598e02134f2e7314a32ef69d8"},
{file = "SQLAlchemy-1.4.37-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:ffe487570f47536b96eff5ef2b84034a8ba4e19aab5ab7647e677d94a119ea55"},
{file = "SQLAlchemy-1.4.37-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:78363f400fbda80f866e8e91d37d36fe6313ff847ded08674e272873c1377ea5"},
{file = "SQLAlchemy-1.4.37-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee34c85cbda7779d66abac392c306ec78c13f5c73a1f01b8b767916d4895d23"},

View File

@ -30,9 +30,9 @@ werkzeug = "*"
spiffworkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"}
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

@ -14,6 +14,8 @@ from spiffworkflow_backend.routes.api_blueprint import api_blueprint
from spiffworkflow_backend.routes.process_api_blueprint import process_api_blueprint
from spiffworkflow_backend.routes.user_blueprint import user_blueprint
import spiffworkflow_backend.load_database_models
def create_app() -> flask.app.Flask:
"""Create_app."""

View File

@ -0,0 +1,16 @@
"""Loads and sets up all database models for SQLAlchemy."""
from flask_bpmn.models.db import add_listeners # type: ignore
from spiffworkflow_backend.models.data_store import DataStoreModel
from spiffworkflow_backend.models.file import FileModel
from spiffworkflow_backend.models.permission_assignment import PermissionAssignmentModel
from spiffworkflow_backend.models.permission_target import PermissionTargetModel
from spiffworkflow_backend.models.principal import PrincipalModel
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
from spiffworkflow_backend.models.process_instance_report import ProcessInstanceReportModel
from spiffworkflow_backend.models.task_event import TaskEventModel
from spiffworkflow_backend.models.user_group_assignment import UserGroupAssignmentModel
from spiffworkflow_backend.models.user import UserModel
add_listeners()

View File

@ -1,10 +1,11 @@
"""Data_store."""
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from flask_marshmallow.sqla import SQLAlchemyAutoSchema # type: ignore
from sqlalchemy import func
class DataStoreModel(db.Model):
class DataStoreModel(SpiffworkflowBaseDBModel):
"""DataStoreModel."""
__tablename__ = "data_store"

View File

@ -5,6 +5,7 @@ from dataclasses import field
from typing import Optional
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from marshmallow import INCLUDE
from marshmallow import Schema
from sqlalchemy import func
@ -14,7 +15,7 @@ from sqlalchemy.orm import relationship
from spiffworkflow_backend.models.data_store import DataStoreModel
class FileModel(db.Model):
class FileModel(SpiffworkflowBaseDBModel):
"""FileModel."""
__tablename__ = "file"

View File

@ -2,6 +2,7 @@
import enum
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import Enum
from sqlalchemy import ForeignKey
@ -24,7 +25,7 @@ class Permission(enum.Enum):
view_instance = 3
class PermissionAssignmentModel(db.Model): # type: ignore
class PermissionAssignmentModel(SpiffworkflowBaseDBModel): # type: ignore
"""PermissionAssignmentModel."""
__tablename__ = "permission_assignment"

View File

@ -1,5 +1,6 @@
"""PermissionTarget."""
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy.schema import CheckConstraint
# from sqlalchemy import ForeignKey # type: ignore
@ -8,7 +9,7 @@ from sqlalchemy.schema import CheckConstraint
# from spiffworkflow_backend.models.process_model import ProcessModel
class PermissionTargetModel(db.Model): # type: ignore
class PermissionTargetModel(SpiffworkflowBaseDBModel): # type: ignore
"""PermissionTargetModel."""
__tablename__ = "permission_target"

View File

@ -1,5 +1,6 @@
"""Principal."""
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.schema import CheckConstraint
@ -7,7 +8,7 @@ from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user import UserModel
class PrincipalModel(db.Model): # type: ignore
class PrincipalModel(SpiffworkflowBaseDBModel): # type: ignore
"""PrincipalModel."""
__tablename__ = "principal"

View File

@ -3,6 +3,7 @@ import enum
import marshmallow
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from marshmallow import INCLUDE
from marshmallow import Schema
from marshmallow_enum import EnumField # type: ignore
@ -71,7 +72,7 @@ class ProcessInstanceStatus(enum.Enum):
erroring = "erroring"
class ProcessInstanceModel(db.Model): # type: ignore
class ProcessInstanceModel(SpiffworkflowBaseDBModel): # type: ignore
"""ProcessInstanceModel."""
__tablename__ = "process_instance"
@ -81,7 +82,7 @@ class ProcessInstanceModel(db.Model): # type: ignore
bpmn_json = deferred(db.Column(db.JSON))
start_in_seconds = db.Column(db.Integer)
end_in_seconds = db.Column(db.Integer)
last_updated = db.Column(db.DateTime(timezone=True), server_default=func.now())
last_updated = db.Column(db.DateTime(timezone=True))
process_initiator_id = db.Column(ForeignKey(UserModel.id), nullable=False)
process_initiator = relationship("UserModel")
status = db.Column(db.Enum(ProcessInstanceStatus))

View File

@ -1,5 +1,6 @@
"""Process_instance."""
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy import func
from sqlalchemy.orm import deferred
@ -8,7 +9,7 @@ from sqlalchemy.orm import relationship
from spiffworkflow_backend.models.user import UserModel
class ProcessInstanceReportModel(db.Model): # type: ignore
class ProcessInstanceReportModel(SpiffworkflowBaseDBModel): # type: ignore
"""ProcessInstanceReportModel."""
__tablename__ = "process_instance_report"

View File

@ -4,6 +4,7 @@ from __future__ import annotations
import enum
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from marshmallow import fields
from marshmallow import INCLUDE
from marshmallow import Schema
@ -26,7 +27,7 @@ class TaskAction(enum.Enum):
ASSIGNMENT = "ASSIGNMENT" # Whenever the lane changes between tasks we assign the task to specific user.
class TaskEventModel(db.Model):
class TaskEventModel(SpiffworkflowBaseDBModel):
"""TaskEventModel."""
__tablename__ = "task_event"

View File

@ -6,6 +6,7 @@ import marshmallow
from flask import current_app
from flask_bpmn.api.api_error import ApiError
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from marshmallow import Schema
from sqlalchemy.orm import relationship
@ -13,7 +14,7 @@ from spiffworkflow_backend.models.group import GroupModel
from spiffworkflow_backend.models.user_group_assignment import UserGroupAssignmentModel
class UserModel(db.Model): # type: ignore
class UserModel(SpiffworkflowBaseDBModel): # type: ignore
"""UserModel."""
__tablename__ = "user"
@ -96,7 +97,7 @@ class UserModelSchema(Schema):
username = marshmallow.fields.String(required=True)
class AdminSessionModel(db.Model):
class AdminSessionModel(SpiffworkflowBaseDBModel):
"""AdminSessionModel."""
__tablename__ = "admin_session"

View File

@ -1,10 +1,11 @@
"""UserGroupAssignment."""
from flask_bpmn.models.db import db
from flask_bpmn.models.db import SpiffworkflowBaseDBModel
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship
class UserGroupAssignmentModel(db.Model): # type: ignore
class UserGroupAssignmentModel(SpiffworkflowBaseDBModel): # type: ignore
"""UserGroupAssignmentModel."""
__tablename__ = "user_group_assignment"

View File

@ -338,7 +338,6 @@ class ProcessInstanceProcessor:
self.process_instance_model.completed_tasks = sum(
1 for t in user_tasks if t.state in complete_states
)
self.process_instance_model.last_updated = datetime.utcnow()
if self.process_instance_model.start_in_seconds is None:
self.process_instance_model.start_in_seconds = round(time.time())

View File

@ -37,7 +37,6 @@ class ProcessInstanceService:
process_initiator=user,
process_model_identifier=process_model_identifier,
process_group_identifier=process_group_identifier,
last_updated=datetime.now(),
start_in_seconds=round(time.time()),
)
db.session.add(process_instance_model)

View File

@ -556,6 +556,7 @@ def test_process_instance_create(
response = create_process_instance(
app, client, test_process_group_id, test_process_model_id, headers
)
assert response.json['last_updated'] is not None
assert response.json["status"] == "complete"
assert response.json["process_model_identifier"] == test_process_model_id
assert response.json["data"]["current_user"]["username"] == "test_user1"