c09710f4e5
Departments are now a customizable per-project list (standard + custom), matching the existing custom task type/status pattern, instead of a fixed 7-value enum. They're usable directly on tasks (new field, independent of assignee) and continue to drive team member department roles.
43 lines
2.2 KiB
Python
43 lines
2.2 KiB
Python
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Enum
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
from database import Base
|
|
import enum
|
|
|
|
|
|
class UserRole(str, enum.Enum):
|
|
DIRECTOR = "director"
|
|
COORDINATOR = "coordinator"
|
|
ARTIST = "artist"
|
|
DEVELOPER = "developer"
|
|
|
|
|
|
class User(Base):
|
|
__tablename__ = "users"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
email = Column(String, unique=True, index=True, nullable=False)
|
|
password_hash = Column(String, nullable=False)
|
|
first_name = Column(String, nullable=False)
|
|
last_name = Column(String, nullable=False)
|
|
role = Column(Enum(UserRole), nullable=False, default=UserRole.ARTIST)
|
|
is_admin = Column(Boolean, default=False, nullable=False)
|
|
is_approved = Column(Boolean, default=False, nullable=False)
|
|
avatar_url = Column(String, nullable=True)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
|
|
|
# Relationships
|
|
project_memberships = relationship("ProjectMember", back_populates="user", cascade="all, delete-orphan")
|
|
assigned_tasks = relationship("Task", foreign_keys="Task.assigned_user_id", back_populates="assigned_user")
|
|
submissions = relationship("Submission", foreign_keys="Submission.user_id", back_populates="user")
|
|
reviews = relationship("Review", foreign_keys="Review.reviewer_id", back_populates="reviewer")
|
|
production_notes = relationship("ProductionNote", foreign_keys="ProductionNote.user_id", back_populates="user")
|
|
task_attachments = relationship("TaskAttachment", foreign_keys="TaskAttachment.user_id", back_populates="user")
|
|
api_keys = relationship("APIKey", back_populates="user", cascade="all, delete-orphan")
|
|
notifications = relationship("Notification", back_populates="user", cascade="all, delete-orphan")
|
|
notification_preferences = relationship("UserNotificationPreference", back_populates="user", uselist=False, cascade="all, delete-orphan")
|
|
roles = relationship("Role", secondary="user_roles", back_populates="users")
|
|
|
|
def __repr__(self):
|
|
return f"<User(id={self.id}, email='{self.email}', role='{self.role}')>" |