mirror of
https://github.com/sartography/cr-connect-workflow.git
synced 2025-02-23 21:28:32 +00:00
Added a File class, that we wrap around the FileModel so the api endpoints don't change, but File no longer holds refences to versions or dates of the file_data model, we figure this out based on a clean database structure. The ApprovalFile is directly related to the file_data_model - so no chance that a reviewer would review the incorrect version of a file.py Noticed that our FileType enum called "bpmn" "bpmm", hope this doesn't screw someone up. Workflows are directly related to the data_models that create the workflow spec it needs. So the files should always be there. There are no more hashes, and thus no more hash errors where it can't find the files to rebuild the workflow.py Not much to report here, other than I broke every single test in the system at one point. So I'm super concerned about this, and will be testing it a lot before creating the pull request.
115 lines
4.3 KiB
Python
115 lines
4.3 KiB
Python
import enum
|
|
|
|
from marshmallow import INCLUDE
|
|
from sqlalchemy import func
|
|
|
|
from crc import db, ma
|
|
from crc.models.file import FileModel, FileDataModel
|
|
from crc.models.study import StudyModel
|
|
from crc.models.workflow import WorkflowModel
|
|
|
|
|
|
class ApprovalStatus(enum.Enum):
|
|
WAITING = "WAITING" # no one has done jack.
|
|
APPROVED = "APPROVED" # approved by the reviewer
|
|
DECLINED = "DECLINED" # rejected by the reviewer
|
|
CANCELED = "CANCELED" # The document was replaced with a new version and this review is no longer needed.
|
|
|
|
|
|
class ApprovalFile(db.Model):
|
|
file_data_id = db.Column(db.Integer, db.ForeignKey(FileDataModel.id), primary_key=True)
|
|
approval_id = db.Column(db.Integer, db.ForeignKey("approval.id"), primary_key=True)
|
|
|
|
approval = db.relationship("ApprovalModel")
|
|
file_data = db.relationship(FileDataModel)
|
|
|
|
|
|
class ApprovalModel(db.Model):
|
|
__tablename__ = 'approval'
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
study_id = db.Column(db.Integer, db.ForeignKey(StudyModel.id), nullable=False)
|
|
study = db.relationship(StudyModel, backref='approval', cascade='all,delete')
|
|
workflow_id = db.Column(db.Integer, db.ForeignKey(WorkflowModel.id), nullable=False)
|
|
workflow = db.relationship(WorkflowModel)
|
|
approver_uid = db.Column(db.String) # Not linked to user model, as they may not have logged in yet.
|
|
status = db.Column(db.String)
|
|
message = db.Column(db.String)
|
|
date_created = db.Column(db.DateTime(timezone=True), default=func.now())
|
|
version = db.Column(db.Integer) # Incremented integer, so 1,2,3 as requests are made.
|
|
approval_files = db.relationship(ApprovalFile, back_populates="approval",
|
|
cascade="all, delete, delete-orphan",
|
|
order_by=ApprovalFile.file_data_id)
|
|
|
|
|
|
class Approval(object):
|
|
|
|
@classmethod
|
|
def from_model(cls, model: ApprovalModel):
|
|
instance = cls()
|
|
instance.id = model.id
|
|
instance.study_id = model.study_id
|
|
instance.workflow_id = model.workflow_id
|
|
instance.version = model.version
|
|
instance.approver_uid = model.approver_uid
|
|
instance.status = model.status
|
|
instance.message = model.message
|
|
instance.date_created = model.date_created
|
|
instance.version = model.version
|
|
instance.title = ''
|
|
if model.study:
|
|
instance.title = model.study.title
|
|
|
|
# TODO: Use ldap lookup
|
|
instance.approver = {}
|
|
instance.approver['uid'] = 'bgb22'
|
|
instance.approver['display_name'] = 'Billy Bob (bgb22)'
|
|
instance.approver['title'] = 'E42:He\'s a hoopy frood'
|
|
instance.approver['department'] = 'E0:EN-Eng Study of Parallel Universes'
|
|
|
|
instance.associated_files = []
|
|
for approval_file in model.approval_files:
|
|
associated_file = {}
|
|
associated_file['id'] = approval_file.file.id
|
|
associated_file['name'] = approval_file.file.name
|
|
associated_file['content_type'] = approval_file.file.content_type
|
|
instance.associated_files.append(associated_file)
|
|
|
|
return instance
|
|
|
|
|
|
class ApprovalSchema(ma.Schema):
|
|
class Meta:
|
|
model = Approval
|
|
fields = ["id", "study_id", "workflow_id", "version", "title",
|
|
"version", "status", "approver", "associated_files"]
|
|
unknown = INCLUDE
|
|
|
|
|
|
# Carlos: Here is the data structure I was trying to imagine.
|
|
# If I were to continue down my current traing of thought, I'd create
|
|
# another class called just "Approval" that can take an ApprovalModel from the
|
|
# database and construct a data structure like this one, that can
|
|
# be provided to the API at an /approvals endpoint with GET and PUT
|
|
# dat = { "approvals": [
|
|
# {"id": 1,
|
|
# "study_id": 20,
|
|
# "workflow_id": 454,
|
|
# "study_title": "Dan Funk (dhf8r)", # Really it's just the name of the Principal Investigator
|
|
# "workflow_version": "21",
|
|
# "approver": { # Pulled from ldap
|
|
# "uid": "bgb22",
|
|
# "display_name": "Billy Bob (bgb22)",
|
|
# "title": "E42:He's a hoopy frood",
|
|
# "department": "E0:EN-Eng Study of Parallel Universes",
|
|
# },
|
|
# "files": [
|
|
# {
|
|
# "id": 124,
|
|
# "name": "ResearchRestart.docx",
|
|
# "content_type": "docx-something-whatever"
|
|
# }
|
|
# ]
|
|
# }
|
|
# ...
|
|
# ]
|