from datetime import date from typing import List, Optional, TYPE_CHECKING from pydantic import BaseModel, Field # Shared properties class MovieBase(BaseModel): title: str release_date: Optional[date] = None overview: Optional[str] = None poster_path: Optional[str] = None runtime: Optional[int] = None rating: Optional[float] = Field(None, ge=0, le=10) # Properties to receive on movie creation class MovieCreate(MovieBase): director_id: Optional[int] = None genre_ids: List[int] = [] actor_ids: List[int] = [] # Properties to receive on movie update class MovieUpdate(MovieBase): title: Optional[str] = None director_id: Optional[int] = None genre_ids: Optional[List[int]] = None actor_ids: Optional[List[int]] = None # Properties shared by models stored in DB class MovieInDBBase(MovieBase): id: int director_id: Optional[int] = None class Config: from_attributes = True # Properties to return to client class Movie(MovieInDBBase): pass # Properties properties stored in DB class MovieInDB(MovieInDBBase): pass # Forward references for circular imports if TYPE_CHECKING: from app.api.schemas.director import Director from app.api.schemas.genre import Genre from app.api.schemas.actor import Actor # Properties for movie with details class MovieDetails(Movie): director: Optional["Director"] = None genres: List["Genre"] = [] actors: List["Actor"] = [] # Import the forward references after the class definitions # to avoid circular import issues from app.api.schemas.director import Director # noqa: E402 from app.api.schemas.genre import Genre # noqa: E402 from app.api.schemas.actor import Actor # noqa: E402 # Update forward references MovieDetails.model_rebuild() # Properties for list class MovieList(BaseModel): data: List[Movie] total: int