Coverage for opt/mealie/lib/python3.12/site-packages/mealie/schema/recipe/recipe_tool.py: 84%

36 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-11-25 17:29 +0000

1from pydantic import UUID4, ConfigDict, field_validator 1a

2from sqlalchemy.orm import selectinload 1a

3from sqlalchemy.orm.interfaces import LoaderOption 1a

4 

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

6from mealie.schema._mealie import MealieModel 1a

7 

8 

9class RecipeToolCreate(MealieModel): 1a

10 name: str 1a

11 households_with_tool: list[str] = [] 1a

12 

13 

14class RecipeToolSave(RecipeToolCreate): 1a

15 group_id: UUID4 1a

16 

17 

18class RecipeToolOut(RecipeToolCreate): 1a

19 id: UUID4 1a

20 group_id: UUID4 1a

21 slug: str 1a

22 

23 model_config = ConfigDict(from_attributes=True) 1a

24 

25 @field_validator("households_with_tool", mode="before") 1a

26 def convert_households_to_slugs(cls, v): 1a

27 if not v: 27 ↛ 30line 27 didn't jump to line 30 because the condition on line 27 was always true1fghicdjklemnopqrsb

28 return [] 1fghicdjklemnopqrsb

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: 1a

36 return household_slug in self.households_with_tool 

37 

38 @classmethod 1a

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

40 return [ 1cdeb

41 selectinload(Tool.households_with_tool), 

42 ] 

43 

44 

45class RecipeToolResponse(RecipeToolOut): 1a

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

47 model_config = ConfigDict(from_attributes=True) 1a

48 

49 @classmethod 1a

50 def loader_options(cls) -> list[LoaderOption]: 1a

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 1a

60 

61RecipeToolResponse.model_rebuild() 1a