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

1from pydantic import UUID4, ConfigDict, field_validator 

2from sqlalchemy.orm import selectinload 

3from sqlalchemy.orm.interfaces import LoaderOption 

4 

5from mealie.db.models.recipe import RecipeModel, Tool 

6from mealie.schema._mealie import MealieModel 

7 

8 

9class RecipeToolCreate(MealieModel): 

10 name: str 

11 households_with_tool: list[str] = [] 

12 

13 

14class RecipeToolSave(RecipeToolCreate): 

15 group_id: UUID4 

16 

17 

18class RecipeToolOut(RecipeToolCreate): 

19 id: UUID4 

20 group_id: UUID4 

21 slug: str 

22 

23 model_config = ConfigDict(from_attributes=True) 

24 

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 [] 

29 

30 try: 

31 return [household.slug for household in v] 

32 except AttributeError: 

33 return v 

34 

35 def is_on_hand(self, household_slug: str) -> bool: 

36 return household_slug in self.households_with_tool 

37 

38 @classmethod 

39 def loader_options(cls) -> list[LoaderOption]: 

40 return [ 

41 selectinload(Tool.households_with_tool), 

42 ] 

43 

44 

45class RecipeToolResponse(RecipeToolOut): 

46 recipes: list["RecipeSummary"] = [] 

47 model_config = ConfigDict(from_attributes=True) 

48 

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 ] 

57 

58 

59from .recipe import RecipeSummary # noqa: E402 

60 

61RecipeToolResponse.model_rebuild()