Esempio n. 1
0
class User(db.Model):
    __tablename__ = "users"

    id: str = db.Column(GUID, primary_key=True, default=generate_uuid)
    name: str = db.Column(db.String(80), unique=True)

    email: str = db.Column(db.TEXT)
    token: str = db.Column(db.String(50),
                           unique=True,
                           default=generate_str_uuid)

    home_folder_id: str = db.Column(GUID, db.ForeignKey("folders.id"))
    home_folder: "Folder" = db.relationship("Folder",
                                            foreign_keys="User.home_folder_id",
                                            backref="home_user")

    trash_folder_id: str = db.Column(GUID, db.ForeignKey("folders.id"))
    trash_folder: "Folder" = db.relationship(
        "Folder", foreign_keys="User.trash_folder_id", backref="trash_user")

    figshare_personal_token: str = db.Column(db.String(128), nullable=True)

    def __str__(self):
        return "name: {}, home_folder: {}, trash_folder: {}".format(
            self.name, self.home_folder.name, self.trash_folder.name)
Esempio n. 2
0
class DataFile(db.Model):
    __tablename__ = "datafiles"

    id: str = db.Column(GUID, primary_key=True, default=generate_uuid)
    name: str = db.Column(db.String(80))
    type: str = db.Column(db.String(20))

    dataset_version_id: str = db.Column(GUID,
                                        db.ForeignKey("dataset_versions.id"))
    dataset_version: "DatasetVersion" = db.relationship(
        "DatasetVersion",
        foreign_keys=[dataset_version_id],
        backref=db.backref(__tablename__, cascade="all, delete-orphan"),
    )

    # these two columns really belong to VirtualDataFile, but SQLAlchemy seems to have some problems with
    # self-referencing FKs. Moved here to get it to work, but assume these will be both None unless the type is
    # VirtualDataFile. Also underlying_data_file_id is always None. Use underlying_data_file.id instead if you want the ID
    underlying_data_file_id = db.Column(GUID, db.ForeignKey("datafiles.id"))
    underlying_data_file = db.relationship("DataFile", remote_side=[id])

    __table_args__ = (
        UniqueConstraint("dataset_version_id", "name"),
        CheckConstraint(
            "(type = 'virtual' and underlying_data_file_id is not null) or (type = 's3') or (type = 'gcs')",
            name="typedcheck",
        ),
    )

    __mapper_args__ = {
        "polymorphic_on": type,
        "polymorphic_identity": "abstract"
    }
Esempio n. 3
0
class Entry(db.Model):
    __tablename__ = "entries"

    id: str = db.Column(GUID, primary_key=True, default=generate_uuid)
    name: str = db.Column(db.Text, nullable=False)
    type: str = db.Column(db.String(50))
    creation_date: datetime.datetime = db.Column(
        db.DateTime, default=datetime.datetime.utcnow)

    creator_id: str = db.Column(GUID, db.ForeignKey("users.id"))

    creator: User = db.relationship("User",
                                    foreign_keys="Entry.creator_id",
                                    backref=__tablename__)

    description: str = db.Column(db.Text)

    __mapper_args__ = {
        "polymorphic_identity": classmethod.__class__.__name__,
        "polymorphic_on": type,
        "with_polymorphic": "*",
    }

    def __str__(self):
        return "Entry name: {}".format(self.name)
Esempio n. 4
0
class ThirdPartyDataFileLink(db.Model):
    __tablename__ = "third_party_datafile_links"

    id: str = db.Column(GUID, primary_key=True, default=generate_uuid)
    type: str = db.Column(db.String(50))
    __mapper_args__ = {
        "polymorphic_on": type,
        "polymorphic_identity": "abstract"
    }
Esempio n. 5
0
class ConversionCache(db.Model):
    __tablename__ = "conversion_cache"

    id: str = db.Column(GUID, primary_key=True, default=generate_uuid)

    dataset_version_id: str = db.Column(GUID,
                                        db.ForeignKey("dataset_versions.id"))

    datafile_name: str = db.Column(db.String(80))

    format: str = db.Column(db.String(80))

    status: str = db.Column(db.Text)

    task_id: str = db.Column(db.Text)

    urls_as_json: str = db.Column(db.Text)

    state: ConversionEntryState = db.Column(db.Enum(ConversionEntryState))
Esempio n. 6
0
class Group(db.Model):
    __tablename__ = "groups"

    id: str = db.Column(db.INTEGER, primary_key=True, autoincrement=True)

    name: str = db.Column(db.String(80))

    users: List[User] = db.relationship(User.__name__,
                                        secondary=group_user_association_table,
                                        backref=__tablename__)

    def __repr__(self):
        return "Group {}".format(self.name)
Esempio n. 7
0
class ThirdPartyDatasetVersionLink(db.Model):
    __tablename__ = "third_party_dataset_version_links"

    id: str = db.Column(GUID, primary_key=True, default=generate_uuid)
    type: str = db.Column(db.String(50))

    creator_id: str = db.Column(GUID, db.ForeignKey("users.id"))
    creator: User = db.relationship(
        "User",
        foreign_keys="ThirdPartyDatasetVersionLink.creator_id",
        backref=__tablename__,
    )

    __mapper_args__ = {
        "polymorphic_on": type,
        "polymorphic_identity": "abstract"
    }
Esempio n. 8
0
from flask_migrate import Migrate

from sqlalchemy import event, UniqueConstraint, CheckConstraint
from sqlalchemy.orm import backref
from sqlalchemy.ext.declarative import declared_attr

from typing import Dict, List

import taiga2.conv as conversion
from taiga2.extensions import db

migrate = Migrate()

# Base = declarative_base()

GUID = db.String(80)


def generate_uuid():
    return uuid.uuid4().hex


def generate_str_uuid():
    return str(uuid.uuid4())


# Associations #

# Association table for Many to Many relationship between folder and entries
# As discussed in december 2016 with Philip Montgomery, we decided an entry could have multiple folders containing it
folder_entry_association_table = db.Table(