Source code for app.model.orm.project

import re
from typing import List

import sqlalchemy as sql
from sqlalchemy.orm import (
    Mapped,
    mapped_column,
    relationship,
)

from app.model.orm.orm_base import OrmBase


[docs] class Project(OrmBase): """ A collection of studies. It has a fixed ``publicId`` identifier starting with the prefix "PMGDB". """
[docs] __tablename__ = 'Projects'
[docs] publicId: Mapped[str] = mapped_column(sql.String(100), primary_key=True)
[docs] uuid: Mapped[str] = mapped_column(sql.String(100), nullable=False)
[docs] ownerUuid: Mapped[str] = mapped_column(sql.ForeignKey('Users.uuid'))
[docs] owner: Mapped['User'] = relationship(back_populates='ownedProjects')
[docs] name: Mapped[str] = mapped_column(sql.String(255), nullable=False)
[docs] description: Mapped[str] = mapped_column(sql.String, nullable=False)
[docs] projectUsers: Mapped[List['ProjectUser']] = relationship(back_populates="project")
[docs] studies: Mapped[List['Study']] = relationship(back_populates="project")
@property
[docs] def studyUuids(self): return [s.uuid for s in self.studies]
@property
[docs] def managerUuids(self): return {pu.userUniqueID for pu in self.projectUsers}
@staticmethod
[docs] def generate_public_id(db_session): last_string_id = db_session.scalars( sql.select(Project.publicId) .order_by(Project.publicId.desc()) .limit(1) ).one_or_none() if last_string_id: last_numeric_id = int(re.sub(r'PMGDB0*', '', last_string_id)) else: last_numeric_id = 0 return "PMGDB{:06d}".format(last_numeric_id + 1)