"""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 src.backend.models.api.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) measurement_interval_minutes: Optional[int] = Field(None, ge=1, le=1440) # 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) measurement_interval_minutes: Optional[int] = Field(None, ge=1, le=1440) 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 measurement_interval_minutes: Optional[int] = 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 src.backend.models.api.task import TaskResponse # noqa: E402 RecipeVersionResponse.model_rebuild() RecipeResponse.model_rebuild()