WIP checkpoint: Trust & Safety: Moderation data model + Alembic migration

This commit is contained in:
2026-08-18 18:28:11 +00:00
parent 25a8900357
commit 9c6390e73b
+20 -1
View File
@@ -1,13 +1,23 @@
from datetime import date
from typing import Optional
from sqlalchemy import Column, Integer, String, Boolean, DateTime, Date
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"
@@ -17,12 +27,21 @@ class User(Base):
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: