"""User account related models""" from sqlalchemy.sql import func from db import db from models.user_project import UserProject class User(db.Model): """User account. Attributes: id: Primary key. email: User's email. external_id: User's External ID, used to match user's Decibel account with his Sony account. updated_at: Timestamp of the last account synchronization. labels: A user is assigned to one or more labels. He can work only with projects that belong to these labels. """ __tablename__ = "User" id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(100), nullable=False, unique=True) external_id = db.Column(db.String(50), nullable=False, unique=True) updated_at = db.Column(db.TIMESTAMP(timezone=True), nullable=False, server_default=func.current_timestamp()) name = db.Column(db.String, nullable=False) phone = db.Column(db.String, nullable=False, server_default="") is_service_account = db.Column(db.Boolean, nullable=False, server_default="FALSE") is_admin = db.Column(db.Boolean, nullable=False, server_default="FALSE") date_time_format = db.Column(db.SmallInteger, nullable=False, server_default="1") manager_id = db.Column(db.Integer, db.ForeignKey('User.id'), nullable=True) manager = db.relationship('User', remote_side=[id]) labels = db.relationship("Label", secondary="UserLabel", back_populates="users") connectors = db.relationship("Connector", back_populates="owner") user_project = db.relationship("UserProject", foreign_keys=[UserProject.user_id]) metric_fields = db.relationship("MetricsField", secondary="UserMetricsField") def __str__(self): return self.email # M2M relationship between users and labels user_label = db.Table( "UserLabel", db.Model.metadata, db.Column("user_id", db.Integer, db.ForeignKey("User.id", ondelete="CASCADE"), primary_key=True, index=True), db.Column("label_id", db.Integer, db.ForeignKey("Label.id"), primary_key=True, index=True), )