Source code for app.model.orm.workspace

from typing import List
from datetime import datetime

import sqlalchemy as sql
from sqlalchemy.orm import (
    Mapped,
    mapped_column,
    relationship,
)
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy_utc.sqltypes import UtcDateTime

from app.model.orm.orm_base import OrmBase


[docs] class Workspace(OrmBase): """ A space where users can upload data that is not linked to a study. The actual data instances are in `WorkspaceEntry` records. This is a container for them that is linked to a specific user with a specific name. It can be made public or kept private (the default). """
[docs] __tablename__ = 'Workspaces'
[docs] id: Mapped[int] = mapped_column(primary_key=True)
[docs] name: Mapped[str] = mapped_column(sql.String(255), nullable=False, default="default")
[docs] userId: Mapped[int] = mapped_column(sql.ForeignKey('Users.id'), nullable=False)
[docs] user: Mapped['User'] = relationship(back_populates="workspaces")
[docs] entries: Mapped[List['WorkspaceEntry']] = relationship( back_populates="workspace", cascade='all, delete-orphan', order_by='WorkspaceEntry.id', )
[docs] modelingResults: Mapped[List['ModelingResult']] = relationship( secondary='WorkspaceEntries', viewonly=True, )
[docs] createdAt: Mapped[datetime] = mapped_column(UtcDateTime, server_default=sql.FetchedValue())
[docs] updatedAt: Mapped[datetime] = mapped_column(UtcDateTime, server_default=sql.FetchedValue())
[docs] publishedAt: Mapped[datetime] = mapped_column(UtcDateTime, nullable=True)
@property
[docs] def uploadedEntries(self): return [e for e in self.entries if e.sourceType == 'upload']
@property
[docs] def apiEntries(self): return [e for e in self.entries if e.sourceType == 'api']
@hybrid_property
[docs] def isPublished(self): return self.publishedAt != None
[docs] def visible_to_user(self, user): return self.isPublished or self.user == user
[docs] def manageable_by_user(self, user): return self.user == user