From 7174a05bd26ce8251f742e9f9f32438312c07832 Mon Sep 17 00:00:00 2001 From: coder-bot Date: Tue, 18 Aug 2026 20:20:53 +0000 Subject: [PATCH] Recovered orphaned WIP before switching to a new task --- backend/app/models/__init__.py | 5 +++- backend/app/models/appeal.py | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 backend/app/models/appeal.py diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 96e2dc3..8e95c5b 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -2,5 +2,8 @@ from app.models.user import User from app.models.session import Session from app.models.world import World from app.models.asset import Asset +from app.models.report import Report +from app.models.moderation_action import ModerationAction +from app.models.appeal import Appeal -__all__ = ["User", "Session", "World", "Asset"] +__all__ = ["User", "Session", "World", "Asset", "Report", "ModerationAction", "Appeal"] diff --git a/backend/app/models/appeal.py b/backend/app/models/appeal.py new file mode 100644 index 0000000..1442c7a --- /dev/null +++ b/backend/app/models/appeal.py @@ -0,0 +1,47 @@ +"""Appeal model for Trust & Safety.""" + +from datetime import datetime +from typing import Optional + +from sqlalchemy import ( + Column, + Integer, + Text, + DateTime, + ForeignKey, +) +from sqlalchemy.dialects.postgresql import ENUM +from sqlalchemy.orm import relationship +from sqlalchemy.sql import func +import enum + +from app.database import Base + + +class AppealStatus(str, enum.Enum): + PENDING = "pending" + APPROVED = "approved" + REJECTED = "rejected" + + +class Appeal(Base): + __tablename__ = "appeals" + + id = Column(Integer, primary_key=True, autoincrement=True) + moderation_action_id = Column( + Integer, ForeignKey("moderation_actions.id", ondelete="CASCADE"), nullable=False + ) + user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) + reason = Column(Text, nullable=False) + status = Column( + ENUM(AppelStatus, name="appeal_status", create_type=False), + default=AppealStatus.PENDING, + ) + reviewed_by = Column(Integer, ForeignKey("users.id", ondelete="SET NULL"), nullable=True) + reviewed_at = Column(DateTime(timezone=True), nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) + + # Relationships + moderation_action = relationship("ModerationAction", back_populates="appeals") + user = relationship("User", foreign_keys=[user_id]) + reviewer = relationship("User", foreign_keys=[reviewed_by])