Source code for app.model.orm.user

from datetime import datetime
from typing import List

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

from app.model.orm.orm_base import OrmBase
from app.model.lib import orcid


[docs] class User(OrmBase): """ A visitor to the site that is identified by ORCID. Every project and study need to be owned by a specific user and may be editable by other users. This ensures a trace for who uploaded a particular study in case moderation or editing is needed. """
[docs] __tablename__ = 'Users'
# A relationship representing ownership of these records. Clearing them out # should directly delete them so they can be replaced.
[docs] owner_relationship = lambda: relationship( back_populates='user', cascade='all, delete-orphan', )
[docs] id: Mapped[int] = mapped_column(primary_key=True)
[docs] uuid: Mapped[str] = mapped_column(sql.String(100), nullable=False)
[docs] orcidId: Mapped[str] = mapped_column(sql.String(100), nullable=False)
[docs] orcidToken: Mapped[str] = mapped_column(sql.String(100), nullable=True)
[docs] apiKey: Mapped[str] = mapped_column(sql.String(100), nullable=True)
[docs] name: Mapped[str] = mapped_column(sql.String(255), nullable=False)
[docs] isAdmin: Mapped[bool] = mapped_column(sql.Boolean, nullable=False, default=False)
[docs] createdAt: Mapped[datetime] = mapped_column(UtcDateTime, server_default=sql.FetchedValue())
[docs] updatedAt: Mapped[datetime] = mapped_column(UtcDateTime, server_default=sql.FetchedValue())
[docs] lastLoginAt: Mapped[datetime] = mapped_column(UtcDateTime, nullable=True)
[docs] ownedProjects: Mapped[List['Project']] = relationship(back_populates='owner')
[docs] ownedStudies: Mapped[List['Study']] = relationship(back_populates='owner')
[docs] submissions: Mapped[List['Submission']] = relationship( back_populates='user', )
[docs] studyUsers: Mapped[List['StudyUser']] = owner_relationship()
[docs] managedStudies: Mapped[List['Study']] = relationship( secondary='StudyUsers', viewonly=True, )
[docs] projectUsers: Mapped[List['ProjectUser']] = owner_relationship()
[docs] managedProjects: Mapped[List['Project']] = relationship( secondary='ProjectUsers', viewonly=True, )
[docs] workspaces: Mapped[List['Workspace']] = owner_relationship()
@property
[docs] def orcidUrl(self): return orcid.get_user_url(self)
[docs] def __str__(self): return f"<User id={self.id} name={self.name}>"