Coverage for opt/mealie/lib/python3.12/site-packages/mealie/schema/recipe/recipe_tool.py: 84%
36 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1from pydantic import UUID4, ConfigDict, field_validator
2from sqlalchemy.orm import selectinload
3from sqlalchemy.orm.interfaces import LoaderOption
5from mealie.db.models.recipe import RecipeModel, Tool
6from mealie.schema._mealie import MealieModel
9class RecipeToolCreate(MealieModel):
10 name: str
11 households_with_tool: list[str] = []
14class RecipeToolSave(RecipeToolCreate):
15 group_id: UUID4
18class RecipeToolOut(RecipeToolCreate):
19 id: UUID4
20 group_id: UUID4
21 slug: str
23 model_config = ConfigDict(from_attributes=True)
25 @field_validator("households_with_tool", mode="before")
26 def convert_households_to_slugs(cls, v):
27 if not v: 27 ↛ 30line 27 didn't jump to line 30 because the condition on line 27 was always true
28 return []
30 try:
31 return [household.slug for household in v]
32 except AttributeError:
33 return v
35 def is_on_hand(self, household_slug: str) -> bool:
36 return household_slug in self.households_with_tool
38 @classmethod
39 def loader_options(cls) -> list[LoaderOption]:
40 return [
41 selectinload(Tool.households_with_tool),
42 ]
45class RecipeToolResponse(RecipeToolOut):
46 recipes: list["RecipeSummary"] = []
47 model_config = ConfigDict(from_attributes=True)
49 @classmethod
50 def loader_options(cls) -> list[LoaderOption]:
51 return [
52 selectinload(Tool.households_with_tool),
53 selectinload(Tool.recipes).joinedload(RecipeModel.recipe_category),
54 selectinload(Tool.recipes).joinedload(RecipeModel.tags),
55 selectinload(Tool.recipes).joinedload(RecipeModel.tools),
56 ]
59from .recipe import RecipeSummary # noqa: E402
61RecipeToolResponse.model_rebuild()