import json import uuid from datetime import datetime from pydantic import BaseModel, model_validator class ChampionshipCreate(BaseModel): title: str description: str | None = None location: str | None = None event_date: datetime | None = None registration_open_at: datetime | None = None registration_close_at: datetime | None = None form_url: str | None = None entry_fee: float | None = None video_max_duration: int | None = None judges: list[dict] | None = None # [{name, bio, instagram}] categories: list[str] | None = None status: str = "draft" image_url: str | None = None class ChampionshipUpdate(BaseModel): title: str | None = None description: str | None = None location: str | None = None event_date: datetime | None = None registration_open_at: datetime | None = None registration_close_at: datetime | None = None form_url: str | None = None entry_fee: float | None = None video_max_duration: int | None = None judges: list[dict] | None = None categories: list[str] | None = None status: str | None = None image_url: str | None = None class ChampionshipOut(BaseModel): model_config = {"from_attributes": True} id: uuid.UUID title: str description: str | None location: str | None event_date: datetime | None registration_open_at: datetime | None registration_close_at: datetime | None form_url: str | None entry_fee: float | None video_max_duration: int | None judges: list[dict] | None categories: list[str] | None status: str source: str instagram_media_id: str | None image_url: str | None created_at: datetime updated_at: datetime @model_validator(mode="before") @classmethod def parse_json_fields(cls, v): # judges and categories are stored as JSON strings in the DB if hasattr(v, "__dict__"): raw_j = getattr(v, "judges", None) raw_c = getattr(v, "categories", None) if isinstance(raw_j, str): v.__dict__["judges"] = json.loads(raw_j) if isinstance(raw_c, str): v.__dict__["categories"] = json.loads(raw_c) return v