From 7c23d36d7c8029a8244590ee0278a5a9c619174f Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 12 Apr 2022 13:23:50 -0400 Subject: [PATCH] Add DocumentModel that combines FileModel and FileDataModel --- crc/models/file.py | 30 +++++++++++++ .../versions/92d554ab6e32_file_refactor.py | 45 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 migrations/versions/92d554ab6e32_file_refactor.py diff --git a/crc/models/file.py b/crc/models/file.py index 9c3e5d88..928d5b44 100644 --- a/crc/models/file.py +++ b/crc/models/file.py @@ -62,6 +62,27 @@ CONTENT_TYPES = { } +class DocumentModel(db.Model): + __tablename__ = 'document' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String, nullable=False) + type = db.Column(db.String, nullable=False) + content_type = db.Column(db.String, nullable=False) + workflow_id = db.Column(db.Integer, db.ForeignKey('workflow.id'), nullable=True) + task_spec = db.Column(db.String, nullable=True) + irb_doc_code = db.Column(db.String, nullable=False) # Code reference to the documents.xlsx reference file. + # TODO: Fix relationship with data_store table, then add this back in + # data_stores = relationship(DataStoreModel, cascade="all,delete", backref="file") + md5_hash = db.Column(UUID(as_uuid=True), unique=False, nullable=False) + data = deferred(db.Column(db.LargeBinary)) # Don't load it unless you have to. + # TODO: Determine whether size is used (in frontend/bpmn) + # size = db.Column(db.Integer, default=0) # Do we need this? + date_modified = db.Column(db.DateTime(timezone=True), onupdate=func.now()) + date_created = db.Column(db.DateTime(timezone=True), server_default=func.now()) + user_uid = db.Column(db.String, db.ForeignKey('user.uid'), nullable=True) + archived = db.Column(db.Boolean, default=False) + + class FileDataModel(db.Model): __tablename__ = 'file_data' id = db.Column(db.Integer, primary_key=True) @@ -143,6 +164,15 @@ class File(object): return instance +class DocumentModelSchema(SQLAlchemyAutoSchema): + class Meta: + model = DocumentModel + load_instance = True + include_relationships = True + include_fk = True # Includes foreign keys + unknown = EXCLUDE + + class FileModelSchema(SQLAlchemyAutoSchema): class Meta: model = FileModel diff --git a/migrations/versions/92d554ab6e32_file_refactor.py b/migrations/versions/92d554ab6e32_file_refactor.py new file mode 100644 index 00000000..6ade535d --- /dev/null +++ b/migrations/versions/92d554ab6e32_file_refactor.py @@ -0,0 +1,45 @@ +"""File refactor + +Revision ID: 92d554ab6e32 +Revises: a345e44ecd27 +Create Date: 2022-04-08 10:46:46.422328 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + + +# revision identifiers, used by Alembic. +revision = '92d554ab6e32' +down_revision = 'a345e44ecd27' +branch_labels = None +depends_on = None + + +def upgrade(): + # TODO: Fix data_store references and include data_stores, decide whether to keep size + # data_stores = relationship(DataStoreModel, cascade="all,delete", backref="file") + # size = db.Column(db.Integer, default=0) # Do we need this? + op.create_table('document', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(), nullable=True), + sa.Column('type', sa.String, nullable=False), + sa.Column('content_type', sa.String(), nullable=True), + sa.Column('workflow_id', sa.Integer(), nullable=True), + sa.Column('task_spec', sa.String, nullable=True), + sa.Column('irb_doc_code', sa.String, nullable=False), + sa.Column('md5_hash', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('data', sa.LargeBinary(), nullable=True), + sa.Column('date_modified', sa.DateTime(timezone=True), nullable=True, onupdate=sa.func.now()), + sa.Column('date_created', sa.DateTime(timezone=True), nullable=True, server_default=sa.func.now()), + sa.Column('user_uid', sa.String(), nullable=True), + sa.Column('archived', sa.Boolean(), default=False), + sa.PrimaryKeyConstraint('id'), + sa.ForeignKeyConstraint(['user_uid'], ['user.uid'], ), + sa.ForeignKeyConstraint(['workflow_id'], ['workflow.id'], ), + ) + + +def downgrade(): + op.drop_table('document')