from datetime import datetime, timezone from sqlalchemy import String, Text, Integer, DateTime, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base def utcnow() -> datetime: return datetime.now(timezone.utc) class Problem(Base): __tablename__ = "problems" id: Mapped[int] = mapped_column(primary_key=True) contest_id: Mapped[int] = mapped_column(ForeignKey("contests.id", ondelete="CASCADE"), nullable=False) title: Mapped[str] = mapped_column(String(255), nullable=False) description: Mapped[str] = mapped_column(Text, nullable=False) input_format: Mapped[str | None] = mapped_column(Text, nullable=True) output_format: Mapped[str | None] = mapped_column(Text, nullable=True) constraints: Mapped[str | None] = mapped_column(Text, nullable=True) time_limit_ms: Mapped[int] = mapped_column(Integer, default=1000) memory_limit_kb: Mapped[int] = mapped_column(Integer, default=262144) # 256 MB total_points: Mapped[int] = mapped_column(Integer, default=100) order_index: Mapped[int] = mapped_column(Integer, default=0) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=utcnow) # Relationships contest = relationship("Contest", back_populates="problems") test_cases = relationship("TestCase", back_populates="problem", cascade="all, delete-orphan") submissions = relationship("Submission", back_populates="problem", cascade="all, delete-orphan", passive_deletes=True)