"""Pydantic schemas for Recipe and RecipeVersion operations.""" from datetime import datetime from typing import Optional, TYPE_CHECKING from pydantic import BaseModel, ConfigDict, Field if TYPE_CHECKING: from schemas.task import TaskResponse class RecipeCreate(BaseModel): """Schema for creating a new recipe.""" code: str = Field(..., min_length=1, max_length=100) name: str = Field(..., min_length=1, max_length=255) description: Optional[str] = None image_path: Optional[str] = Field(None, max_length=500) # Optional task-level fields for the initial technical drawing file_path: Optional[str] = Field(None, max_length=500) file_type: Optional[str] = Field(None, pattern="^(image|pdf)$") annotations_json: Optional[dict] = None class RecipeUpdate(BaseModel): """Schema for updating a recipe (creates new version).""" name: Optional[str] = Field(None, min_length=1, max_length=255) description: Optional[str] = None image_path: Optional[str] = Field(None, max_length=500) change_notes: Optional[str] = None # Task-level fields: saved to the first task of the new version file_path: Optional[str] = Field(None, max_length=500) file_type: Optional[str] = Field(None, pattern="^(image|pdf)$") annotations_json: Optional[dict] = None class RecipeVersionResponse(BaseModel): """Schema for recipe version response.""" model_config = ConfigDict(from_attributes=True) id: int recipe_id: int version_number: int is_current: bool created_by: int created_at: datetime change_notes: Optional[str] = None tasks: list["TaskResponse"] = [] class RecipeResponse(BaseModel): """Schema for recipe response.""" model_config = ConfigDict(from_attributes=True) id: int code: str name: str description: Optional[str] = None image_path: Optional[str] = None created_by: int created_at: datetime active: bool current_version: Optional[RecipeVersionResponse] = None class RecipeListResponse(BaseModel): """Schema for paginated recipe list.""" items: list[RecipeResponse] total: int page: int per_page: int pages: int # Forward reference imports for model_rebuild from schemas.task import TaskResponse # noqa: E402 RecipeVersionResponse.model_rebuild() RecipeResponse.model_rebuild()