all tests are passing with new spec tables w/ burnettk
This commit is contained in:
parent
8e83d0effd
commit
df5fbfcd3c
|
@ -58,10 +58,16 @@ from spiffworkflow_backend.models.process_instance_data import (
|
|||
) # noqa: F401
|
||||
|
||||
from spiffworkflow_backend.models.bpmn_process import BpmnProcessModel # noqa: F401
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel # noqa: F401
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import (
|
||||
BpmnProcessDefinitionModel,
|
||||
) # noqa: F401
|
||||
from spiffworkflow_backend.models.task import TaskModel # noqa: F401
|
||||
from spiffworkflow_backend.models.task_definition import TaskDefinitionModel # noqa: F401
|
||||
from spiffworkflow_backend.models.task_definition import (
|
||||
TaskDefinitionModel,
|
||||
) # noqa: F401
|
||||
from spiffworkflow_backend.models.json_data import JsonDataModel # noqa: F401
|
||||
from spiffworkflow_backend.models.bpmn_process_definition_relationship import BpmnProcessDefinitionRelationshipModel # noqa: F401
|
||||
from spiffworkflow_backend.models.bpmn_process_definition_relationship import (
|
||||
BpmnProcessDefinitionRelationshipModel,
|
||||
) # noqa: F401
|
||||
|
||||
add_listeners()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import ForeignKey
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel
|
||||
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
from __future__ import annotations
|
||||
from sqlalchemy import UniqueConstraint
|
||||
from sqlalchemy.orm import deferred
|
||||
from sqlalchemy import ForeignKey
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel
|
||||
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy import UniqueConstraint
|
||||
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import (
|
||||
BpmnProcessDefinitionModel,
|
||||
)
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
|
||||
|
@ -12,10 +14,16 @@ class BpmnProcessDefinitionRelationshipModel(SpiffworkflowBaseDBModel):
|
|||
__tablename__ = "bpmn_process_definition_relationship"
|
||||
__table_args__ = (
|
||||
UniqueConstraint(
|
||||
"bpmn_process_definition_parent_id", "bpmn_process_definition_child_id", name="bpmn_process_definition_relationship_unique"
|
||||
"bpmn_process_definition_parent_id",
|
||||
"bpmn_process_definition_child_id",
|
||||
name="bpmn_process_definition_relationship_unique",
|
||||
),
|
||||
)
|
||||
|
||||
id: int = db.Column(db.Integer, primary_key=True)
|
||||
bpmn_process_definition_parent_id: int = db.Column(ForeignKey(BpmnProcessDefinitionModel.id), nullable=False) # type: ignore
|
||||
bpmn_process_definition_child_id: int = db.Column(ForeignKey(BpmnProcessDefinitionModel.id), nullable=False) # type: ignore
|
||||
bpmn_process_definition_parent_id: int = db.Column(
|
||||
ForeignKey(BpmnProcessDefinitionModel.id), nullable=False
|
||||
) # type: ignore
|
||||
bpmn_process_definition_child_id: int = db.Column(
|
||||
ForeignKey(BpmnProcessDefinitionModel.id), nullable=False
|
||||
) # type: ignore
|
||||
|
|
|
@ -1,7 +1,4 @@
|
|||
from __future__ import annotations
|
||||
from sqlalchemy.orm import deferred
|
||||
from sqlalchemy import ForeignKey
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel
|
||||
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
"""Process_instance."""
|
||||
from __future__ import annotations
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel
|
||||
|
||||
from typing import Any
|
||||
from typing import cast
|
||||
|
@ -16,6 +15,9 @@ from sqlalchemy.orm import relationship
|
|||
from sqlalchemy.orm import validates
|
||||
|
||||
from spiffworkflow_backend.helpers.spiff_enum import SpiffEnum
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import (
|
||||
BpmnProcessDefinitionModel,
|
||||
)
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
from spiffworkflow_backend.models.process_instance_data import ProcessInstanceDataModel
|
||||
|
@ -75,7 +77,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel):
|
|||
)
|
||||
process_instance_data = relationship("ProcessInstanceDataModel", cascade="delete")
|
||||
|
||||
bpmn_process_definition_id: int = db.Column(ForeignKey(BpmnProcessDefinitionModel.id), nullable=True) # type: ignore
|
||||
bpmn_process_definition_id: int = db.Column(
|
||||
ForeignKey(BpmnProcessDefinitionModel.id), nullable=True
|
||||
) # type: ignore
|
||||
bpmn_process_definition = relationship(BpmnProcessDefinitionModel)
|
||||
|
||||
active_human_tasks = relationship(
|
||||
|
|
|
@ -149,6 +149,7 @@ from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
|||
# "data": {}
|
||||
# },
|
||||
|
||||
|
||||
@dataclass
|
||||
class SpiffStepDetailsModel(SpiffworkflowBaseDBModel):
|
||||
"""SpiffStepDetailsModel."""
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
"""Task."""
|
||||
import enum
|
||||
from dataclasses import dataclass
|
||||
from sqlalchemy import ForeignKey
|
||||
from spiffworkflow_backend.models.bpmn_process import BpmnProcessModel
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
from typing import Any
|
||||
from typing import Optional
|
||||
from typing import Union
|
||||
|
@ -13,6 +9,11 @@ import marshmallow
|
|||
from marshmallow import Schema
|
||||
from marshmallow_enum import EnumField # type: ignore
|
||||
from SpiffWorkflow.task import TaskStateNames
|
||||
from sqlalchemy import ForeignKey
|
||||
|
||||
from spiffworkflow_backend.models.bpmn_process import BpmnProcessModel
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
from spiffworkflow_backend.models.task_definition import TaskDefinitionModel # type: ignore
|
||||
|
||||
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
from __future__ import annotations
|
||||
from sqlalchemy.orm import relationship
|
||||
from sqlalchemy import UniqueConstraint
|
||||
from sqlalchemy import ForeignKey
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel
|
||||
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy import UniqueConstraint
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import (
|
||||
BpmnProcessDefinitionModel,
|
||||
)
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.db import SpiffworkflowBaseDBModel
|
||||
|
||||
|
@ -12,12 +15,16 @@ class TaskDefinitionModel(SpiffworkflowBaseDBModel):
|
|||
__tablename__ = "task_definition"
|
||||
__table_args__ = (
|
||||
UniqueConstraint(
|
||||
"bpmn_process_definition_id", "bpmn_identifier", name="task_definition_unique"
|
||||
"bpmn_process_definition_id",
|
||||
"bpmn_identifier",
|
||||
name="task_definition_unique",
|
||||
),
|
||||
)
|
||||
|
||||
id: int = db.Column(db.Integer, primary_key=True)
|
||||
bpmn_process_definition_id: int = db.Column(ForeignKey(BpmnProcessDefinitionModel.id), nullable=False) # type: ignore
|
||||
bpmn_process_definition_id: int = db.Column(
|
||||
ForeignKey(BpmnProcessDefinitionModel.id), nullable=False
|
||||
) # type: ignore
|
||||
bpmn_process_definition = relationship(BpmnProcessDefinitionModel)
|
||||
|
||||
bpmn_identifier: str = db.Column(db.String(255), nullable=False, index=True)
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
"""Process_instance_processor."""
|
||||
import _strptime
|
||||
from spiffworkflow_backend.models import serialized_bpmn_definition # type: ignore
|
||||
from spiffworkflow_backend.models.bpmn_process_definition_relationship import BpmnProcessDefinitionRelationshipModel # noqa: F401
|
||||
import decimal
|
||||
import json
|
||||
import logging
|
||||
|
@ -57,8 +55,13 @@ from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore
|
|||
from sqlalchemy import text
|
||||
|
||||
from spiffworkflow_backend.exceptions.api_error import ApiError
|
||||
from spiffworkflow_backend.models import bpmn_process_definition_relationship
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import BpmnProcessDefinitionModel
|
||||
from spiffworkflow_backend.models import serialized_bpmn_definition # type: ignore
|
||||
from spiffworkflow_backend.models.bpmn_process_definition import (
|
||||
BpmnProcessDefinitionModel,
|
||||
)
|
||||
from spiffworkflow_backend.models.bpmn_process_definition_relationship import (
|
||||
BpmnProcessDefinitionRelationshipModel,
|
||||
) # noqa: F401
|
||||
from spiffworkflow_backend.models.db import db
|
||||
from spiffworkflow_backend.models.file import File
|
||||
from spiffworkflow_backend.models.file import FileType
|
||||
|
@ -525,6 +528,22 @@ class ProcessInstanceProcessor:
|
|||
self.bpmn_process_instance
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _get_definition_dict_for_bpmn_process_definition(cls, bpmn_process_definition: BpmnProcessDefinitionModel) -> dict:
|
||||
task_definitions = TaskDefinitionModel.query.filter_by(
|
||||
bpmn_process_definition_id=bpmn_process_definition.id
|
||||
).all()
|
||||
bpmn_process_definition_dict: dict = json.loads(
|
||||
bpmn_process_definition.properties_json
|
||||
)
|
||||
bpmn_process_definition_dict["task_specs"] = {}
|
||||
for task_definition in task_definitions:
|
||||
bpmn_process_definition_dict["task_specs"][
|
||||
task_definition.bpmn_identifier
|
||||
] = json.loads(task_definition.properties_json)
|
||||
return bpmn_process_definition_dict
|
||||
|
||||
|
||||
@classmethod
|
||||
def _get_full_bpmn_json(cls, process_instance_model: ProcessInstanceModel) -> dict:
|
||||
if process_instance_model.serialized_bpmn_definition_id is None:
|
||||
|
@ -534,24 +553,28 @@ class ProcessInstanceProcessor:
|
|||
# loaded_json: dict = json.loads(serialized_bpmn_definition.static_json) # or "{}")
|
||||
|
||||
serialized_bpmn_definition = {}
|
||||
bpmn_process_definition = BpmnProcessDefinitionModel.query.filter_by(id=process_instance_model.bpmn_process_definition_id).first()
|
||||
task_definitions = TaskDefinitionModel.query.filter_by(bpmn_process_definition_id=process_instance_model.bpmn_process_definition_id).all()
|
||||
bpmn_process_definition = BpmnProcessDefinitionModel.query.filter_by(
|
||||
id=process_instance_model.bpmn_process_definition_id
|
||||
).first()
|
||||
if bpmn_process_definition is not None:
|
||||
serialized_bpmn_definition = {"serializer_version": cls.SERIALIZER_VERSION, "spec": {}, "subprocess_specs": {}}
|
||||
bpmn_process_definition_dict = json.loads(bpmn_process_definition.properties_json)
|
||||
bpmn_process_definition_dict['task_specs'] = {}
|
||||
for task_definition in task_definitions:
|
||||
bpmn_process_definition_dict['task_specs'][task_definition.bpmn_identifier] = json.loads(task_definition.properties_json)
|
||||
serialized_bpmn_definition['spec'] = bpmn_process_definition_dict
|
||||
serialized_bpmn_definition = {
|
||||
"serializer_version": cls.SERIALIZER_VERSION,
|
||||
"spec": {},
|
||||
"subprocess_specs": {},
|
||||
}
|
||||
serialized_bpmn_definition['spec'] = cls._get_definition_dict_for_bpmn_process_definition(bpmn_process_definition)
|
||||
|
||||
bpmn_process_subprocess_definitions = BpmnProcessDefinitionRelationshipModel.query.filter_by(bpmn_process_definition_parent_id=bpmn_process_definition.id).all()
|
||||
for bpmn_process_subprocess_definition in bpmn_process_subprocess_definitions:
|
||||
subprocess_task_definitions = TaskDefinitionModel.query.filter_by(bpmn_process_definition_id=bpmn_process_subprocess_definition.id).all()
|
||||
bpmn_process_subprocess_dict = json.loads(bpmn_process_definition.properties_json)
|
||||
bpmn_process_subprocess_dict['task_specs'] = {}
|
||||
for subprocess_task_definition in subprocess_task_definitions:
|
||||
bpmn_process_subprocess_dict['task_specs'][subprocess_task_definition.bpmn_identifier] = json.loads(subprocess_task_definition.properties_json)
|
||||
serialized_bpmn_definition['subprocess_specs'][bpmn_process_subprocess_definition.bpmn_identifier] = bpmn_process_subprocess_dict
|
||||
bpmn_process_subprocess_definitions = (
|
||||
BpmnProcessDefinitionRelationshipModel.query.filter_by(
|
||||
bpmn_process_definition_parent_id=bpmn_process_definition.id
|
||||
).all()
|
||||
)
|
||||
for (
|
||||
bpmn_process_subprocess_definition
|
||||
) in bpmn_process_subprocess_definitions:
|
||||
serialized_bpmn_definition["subprocess_specs"][
|
||||
bpmn_process_subprocess_definition.bpmn_identifier
|
||||
] = cls._get_definition_dict_for_bpmn_process_definition(bpmn_process_subprocess_definition)
|
||||
loaded_json: dict = serialized_bpmn_definition
|
||||
|
||||
process_instance_data = process_instance_model.process_instance_data
|
||||
|
@ -934,19 +957,25 @@ class ProcessInstanceProcessor:
|
|||
db.session.add(process_instance_data)
|
||||
self.process_instance_model.process_instance_data = process_instance_data
|
||||
|
||||
|
||||
def _store_bpmn_process_definition(self, process_bpmn_properties: dict, bpmn_process_definition_parent: Optional[BpmnProcessDefinitionModel] = None) -> BpmnProcessDefinitionModel:
|
||||
process_bpmn_identifier = process_bpmn_properties['name']
|
||||
def _store_bpmn_process_definition(
|
||||
self,
|
||||
process_bpmn_properties: dict,
|
||||
bpmn_process_definition_parent: Optional[BpmnProcessDefinitionModel] = None,
|
||||
) -> BpmnProcessDefinitionModel:
|
||||
process_bpmn_identifier = process_bpmn_properties["name"]
|
||||
new_hash_digest = sha256(
|
||||
json.dumps(process_bpmn_properties, sort_keys=True).encode("utf8")
|
||||
).hexdigest()
|
||||
bpmn_process_definition: Optional[BpmnProcessDefinitionModel] = BpmnProcessDefinitionModel.query.filter_by(
|
||||
hash=new_hash_digest
|
||||
).first()
|
||||
bpmn_process_definition: Optional[BpmnProcessDefinitionModel] = (
|
||||
BpmnProcessDefinitionModel.query.filter_by(hash=new_hash_digest).first()
|
||||
)
|
||||
if bpmn_process_definition is None:
|
||||
task_specs = process_bpmn_properties.pop("task_specs")
|
||||
bpmn_process_definition = BpmnProcessDefinitionModel(
|
||||
hash=new_hash_digest, bpmn_identifier=process_bpmn_identifier, properties_json=json.dumps(process_bpmn_properties), type="process"
|
||||
hash=new_hash_digest,
|
||||
bpmn_identifier=process_bpmn_identifier,
|
||||
properties_json=json.dumps(process_bpmn_properties),
|
||||
type="process",
|
||||
)
|
||||
db.session.add(bpmn_process_definition)
|
||||
|
||||
|
@ -955,15 +984,17 @@ class ProcessInstanceProcessor:
|
|||
bpmn_process_definition=bpmn_process_definition,
|
||||
bpmn_identifier=task_bpmn_identifier,
|
||||
properties_json=json.dumps(task_bpmn_properties),
|
||||
typename=task_bpmn_properties['typename'],
|
||||
typename=task_bpmn_properties["typename"],
|
||||
)
|
||||
db.session.add(task_definition)
|
||||
|
||||
if bpmn_process_definition_parent:
|
||||
bpmn_process_definition_relationship = BpmnProcessDefinitionRelationshipModel.query.filter_by(
|
||||
bpmn_process_definition_relationship = (
|
||||
BpmnProcessDefinitionRelationshipModel.query.filter_by(
|
||||
bpmn_process_definition_parent_id=bpmn_process_definition_parent.id,
|
||||
bpmn_process_definition_child_id=bpmn_process_definition.id,
|
||||
).first()
|
||||
)
|
||||
if bpmn_process_definition_relationship is None:
|
||||
bpmn_process_definition_relationship = BpmnProcessDefinitionRelationshipModel(
|
||||
bpmn_process_definition_parent_id=bpmn_process_definition_parent.id,
|
||||
|
@ -987,11 +1018,16 @@ class ProcessInstanceProcessor:
|
|||
else:
|
||||
process_instance_data_dict[bpmn_key] = bpmn_dict[bpmn_key]
|
||||
|
||||
bpmn_process_definition_parent = self._store_bpmn_process_definition(bpmn_spec_dict['spec'])
|
||||
for process_bpmn_properties in bpmn_spec_dict['subprocess_specs'].values():
|
||||
self._store_bpmn_process_definition(process_bpmn_properties, bpmn_process_definition_parent)
|
||||
self.process_instance_model.bpmn_process_definition = bpmn_process_definition_parent
|
||||
|
||||
bpmn_process_definition_parent = self._store_bpmn_process_definition(
|
||||
bpmn_spec_dict["spec"]
|
||||
)
|
||||
for process_bpmn_properties in bpmn_spec_dict["subprocess_specs"].values():
|
||||
self._store_bpmn_process_definition(
|
||||
process_bpmn_properties, bpmn_process_definition_parent
|
||||
)
|
||||
self.process_instance_model.bpmn_process_definition = (
|
||||
bpmn_process_definition_parent
|
||||
)
|
||||
|
||||
# # FIXME: always save new hash until we get updated Spiff without loopresettask
|
||||
# # if self.process_instance_model.serialized_bpmn_definition_id is None:
|
||||
|
|
Loading…
Reference in New Issue