mirror of
https://github.com/sartography/spiffworkflow-backend.git
synced 2025-02-22 20:38:08 +00:00
added file to load to all models and add event listeners for create and upate w/ burnettk
This commit is contained in:
parent
c13553ff6d
commit
388edb2df4
1
.flake8
1
.flake8
@ -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
|
||||
|
@ -1,3 +1,5 @@
|
||||
from __future__ import with_statement
|
||||
|
||||
import logging
|
||||
from logging.config import fileConfig
|
||||
|
||||
|
@ -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
11
poetry.lock
generated
@ -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"},
|
||||
|
@ -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"
|
||||
|
@ -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."""
|
||||
|
16
src/spiffworkflow_backend/load_database_models.py
Normal file
16
src/spiffworkflow_backend/load_database_models.py
Normal 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()
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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))
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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())
|
||||
|
@ -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)
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user