Files
modbison/backend/app/models/user.py
T

57 lines
2.5 KiB
Python

from datetime import date
from typing import Optional
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Date, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.database import Base
class UserRole:
USER = "user"
MODERATOR = "moderator"
ADMIN = "admin"
@staticmethod
def choices():
return [UserRole.USER, UserRole.MODERATOR, UserRole.ADMIN]
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
username = Column(String(50), unique=True, index=True, nullable=False)
email = Column(String(120), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
date_of_birth = Column(Date, nullable=True)
is_active = Column(Boolean, default=True)
role = Column(Enum(UserRole.USER, UserRole.MODERATOR, UserRole.ADMIN), default=UserRole.USER, nullable=False)
banned_until = Column(DateTime(timezone=True), nullable=True)
suspended_until = Column(DateTime(timezone=True), nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
sessions = relationship("Session", back_populates="user", cascade="all, delete-orphan")
worlds = relationship("World", back_populates="owner")
assets = relationship("Asset", back_populates="owner")
reports_made = relationship("Report", back_populates="reporter", foreign_keys="Report.reporter_id")
reports_resolved = relationship("Report", back_populates="resolved_by_user", foreign_keys="Report.resolved_by")
moderation_actions_created = relationship("ModerationAction", back_populates="moderator", foreign_keys="ModerationAction.moderator_id")
moderation_actions_target = relationship("ModerationAction", back_populates="target_user", foreign_keys="ModerationAction.target_user_id")
appeals = relationship("Appeal", back_populates="user", foreign_keys="Appeal.user_id")
appeals_reviewed = relationship("Appeal", back_populates="reviewer", foreign_keys="Appeal.reviewed_by")
@property
def is_adult(self) -> bool:
"""Return True if the user is 18 or older based on date_of_birth."""
if self.date_of_birth is None:
return False
today = date.today()
age = today.year - self.date_of_birth.year
# Adjust if birthday hasn't occurred yet this year
if (today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day):
age -= 1
return age >= 18