Source code for mdvtools.dbutils.dbmodels

from flask_sqlalchemy import SQLAlchemy
from datetime import datetime

[docs] db = SQLAlchemy()
[docs] class User(db.Model):
[docs] __tablename__ = 'users'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] email = db.Column(db.String(255), unique=True, nullable=False, default='')
[docs] confirmed_at = db.Column(db.DateTime, nullable=True)
[docs] password = db.Column(db.String(255), nullable=False, default='')
[docs] is_active = db.Column(db.Boolean, nullable=False, default=False)
[docs] first_name = db.Column(db.String(50), nullable=False, default='')
[docs] last_name = db.Column(db.String(50), nullable=False, default='')
[docs] administrator = db.Column(db.Boolean, nullable=False, default=False)
[docs] institution = db.Column(db.Text, nullable=True)
[docs] projects = db.relationship('UserProject', backref='user', lazy=True)
[docs] jobs = db.relationship('Job', backref='user', lazy=True)
[docs] permissions = db.relationship('Permission', backref='user', lazy=True)
[docs] preferences = db.relationship('UserPreference', backref='user', lazy=True)
#shared_objects = db.relationship('SharedObject', foreign_keys='SharedObject.shared_with', backref='shared_with_user', lazy=True)
[docs] class Project(db.Model):
[docs] __tablename__ = 'projects'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] name = db.Column(db.String(255), nullable=False, default='unnamed_project')
[docs] path = db.Column(db.String(1024), nullable=False, unique=True)
[docs] created_timestamp = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] is_deleted = db.Column(db.Boolean, nullable=False, default=False)
[docs] deleted_timestamp = db.Column(db.DateTime, nullable=True)
[docs] update_timestamp = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] accessed_timestamp = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] owner = db.Column(db.Integer)
[docs] type = db.Column(db.Text)
[docs] data = db.Column(db.JSON)
[docs] is_public = db.Column(db.Boolean, nullable=False, default=False)
[docs] date_made_public = db.Column(db.DateTime)
[docs] status = db.Column(db.Text)
[docs] genome = db.Column(db.String, db.ForeignKey('genomes.name'))
[docs] parent = db.Column(db.Integer)
[docs] description = db.Column(db.Text)
[docs] access_level = db.Column(db.String(50), nullable=False, default='editable') # Default access level
[docs] users = db.relationship('UserProject', backref='project', lazy=True)
[docs] files = db.relationship('File', backref='project', lazy=True)
[docs] __table_args__ = ( db.Index('idx_projects_genome', 'genome'), db.Index('idx_projects_owner', 'owner'), )
[docs] class File(db.Model):
[docs] __tablename__ = 'files'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] name = db.Column(db.String(255), nullable=False)
[docs] file_path = db.Column(db.String(255), nullable=False, unique=True)
[docs] upload_timestamp = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] update_timestamp = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
[docs] project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), nullable=False)
#project = db.relationship('Project', backref=db.backref('files', lazy=True))
[docs] class UserProject(db.Model):
[docs] __tablename__ = 'user_projects'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
[docs] project_id = db.Column(db.Integer, db.ForeignKey('projects.id'), nullable=False)
[docs] can_read = db.Column(db.Boolean, nullable=False, default=False)
[docs] can_write = db.Column(db.Boolean, nullable=False, default=False)
[docs] class Genome(db.Model):
[docs] __tablename__ = 'genomes'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] name = db.Column(db.String(50), nullable=False, unique=True)
[docs] label = db.Column(db.Text)
[docs] data = db.Column(db.JSON)
[docs] database = db.Column(db.Text)
[docs] date_added = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] connections = db.Column(db.Integer)
[docs] icon = db.Column(db.Text)
[docs] is_public = db.Column(db.Boolean, nullable=False, default=True)
[docs] chrom_sizes = db.Column(db.JSON)
[docs] small_icon = db.Column(db.Text)
[docs] projects = db.relationship('Project', backref='genomes', lazy=True)
[docs] class Job(db.Model):
[docs] __tablename__ = 'jobs'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] inputs = db.Column(db.JSON)
[docs] user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
[docs] outputs = db.Column(db.JSON)
[docs] sent_on = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] status = db.Column(db.String(200))
[docs] class_name = db.Column(db.String(200))
[docs] genome = db.Column(db.String(100))
[docs] finished_on = db.Column(db.DateTime)
[docs] is_deleted = db.Column(db.Boolean, nullable=False, default=False)
[docs] type = db.Column(db.String(200))
[docs] class Permission(db.Model):
[docs] __tablename__ = 'permissions'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
[docs] permission = db.Column(db.String(200), nullable=False)
[docs] value = db.Column(db.String(200), nullable=False)
[docs] class SharedObject(db.Model):
[docs] __tablename__ = 'shared_objects'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] owner = db.Column(db.Integer)
[docs] shared_with = db.Column(db.Integer)
[docs] object_id = db.Column(db.Integer)
[docs] date_shared = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] level = db.Column(db.Text, nullable=False, default='view')
[docs] class UserPreference(db.Model):
[docs] __tablename__ = 'user_preferences'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] preference = db.Column(db.Text, nullable=False)
[docs] data = db.Column(db.JSON)
[docs] user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
[docs] class ViewSet(db.Model):
[docs] __tablename__ = 'view_sets'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] table_name = db.Column(db.String(100))
[docs] name = db.Column(db.String(200))
[docs] description = db.Column(db.Text)
[docs] date_added = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] date_modified = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
[docs] owner = db.Column(db.Integer, default=0)
[docs] is_public = db.Column(db.Boolean, default=False)
[docs] fields = db.Column(db.JSON)
[docs] data = db.Column(db.JSON)
[docs] date_made_public = db.Column(db.DateTime)
[docs] status = db.Column(db.Text)
[docs] is_deleted = db.Column(db.Boolean, default=False)
[docs] class GeneSet(db.Model):
[docs] __tablename__ = 'gene_sets'
[docs] id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[docs] name = db.Column(db.String(100), nullable=False)
[docs] table_name = db.Column(db.String(150))
[docs] data = db.Column(db.JSON)
[docs] date_added = db.Column(db.DateTime, nullable=False, default=datetime.now)
[docs] date_modified = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
[docs] is_deleted = db.Column(db.Boolean, default=False)
[docs] description = db.Column(db.Text)
# Indexes db.Index('idx_genes_name', GeneSet.name) db.Index('idx_views_table_name', ViewSet.table_name) db.Index('idx_views_name', ViewSet.name) """ @db.event.listens_for(File, 'after_insert') @db.event.listens_for(File, 'after_update') @db.event.listens_for(File, 'after_delete') def update_project_timestamp(mapper, connection, target): try: # Ensure target.project is the correct way to access the associated Project print("--------Event Listener on File") project = target.project print(project) if project: # Update the project's timestamp project.update_timestamp = datetime.now() db.session.commit() print(f"Updated project timestamp for project ID {project.id}") else: print(f"No associated project found for file ID {target.id}") except Exception as e: print(f"Error updating project timestamp: {e}") db.session.rollback() # Rollback in case of an error """