from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
[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]
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
[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
"""