from datetime import datetime from typing import Literal from pydantic import BaseModel, ConfigDict, Field IngredientKind = Literal["item", "section_header"] class IngredientIn(BaseModel): kind: IngredientKind = "item" quantity: str | None = None unit: str | None = None text: str class IngredientOut(IngredientIn): model_config = ConfigDict(from_attributes=True) id: int class StepIn(BaseModel): text: str class StepOut(StepIn): model_config = ConfigDict(from_attributes=True) id: int class RecipeIn(BaseModel): name: str = Field(min_length=1) category: str | None = None preptime: str | None = None cooktime: str | None = None baketime: str | None = None cooltime: str | None = None marinade_time: str | None = None robot_time: str | None = None servings: str | None = None notes: str | None = None kcal: str | None = None kh: str | None = None protein: str | None = None fett: str | None = None ingredients: list[IngredientIn] = Field(default_factory=list) steps: list[StepIn] = Field(default_factory=list) class RecipeSummary(BaseModel): model_config = ConfigDict(from_attributes=True) id: int name: str slug: str category: str | None image_filename: str | None class RecipeOut(BaseModel): model_config = ConfigDict(from_attributes=True) id: int name: str slug: str category: str | None image_filename: str | None preptime: str | None cooktime: str | None baketime: str | None cooltime: str | None marinade_time: str | None robot_time: str | None servings: str | None notes: str | None kcal: str | None kh: str | None protein: str | None fett: str | None created_at: datetime updated_at: datetime ingredients: list[IngredientOut] steps: list[StepOut]