"""Appeal model for moderation actions.""" from datetime import datetime from typing import Optional from sqlalchemy import ( Column, Enum, ForeignKey, Integer, String, Text, DateTime, CheckConstraint, ) from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.database import Base class Appeal(Base): __tablename__ = "appeals" # Status values APPEAL_STATUS = Enum( "pending", "approved", "rejected", name="appeal_status", create_type=False, ) id = Column(Integer, primary_key=True, index=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( APPEAL_STATUS, nullable=False, default=APPEAL_STATUS.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") reviewer = relationship( "User", foreign_keys=[reviewed_by], backref="reviewed_appeals", ) __table_args__ = ( CheckConstraint( "status IN ('pending', 'approved', 'rejected')", name="check_appeal_status", ), )