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

38 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 03:04 +0000

1from pydantic import UUID4, ConfigDict 

2from sqlalchemy.orm import selectinload 

3from sqlalchemy.orm.interfaces import LoaderOption 

4 

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

6from mealie.schema._mealie import MealieModel 

7 

8 

9class CategoryIn(MealieModel): 

10 name: str 

11 

12 

13class CategorySave(CategoryIn): 

14 group_id: UUID4 

15 

16 

17class CategoryBase(CategoryIn): 

18 id: UUID4 

19 group_id: UUID4 | None = None 

20 slug: str 

21 model_config = ConfigDict(from_attributes=True) 

22 

23 

24class CategoryOut(CategoryBase): 

25 slug: str 

26 group_id: UUID4 

27 model_config = ConfigDict(from_attributes=True) 

28 

29 

30class RecipeCategoryResponse(CategoryBase): 

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

32 model_config = ConfigDict(from_attributes=True) 

33 

34 

35class TagIn(CategoryIn): 

36 pass 

37 

38 

39class TagSave(TagIn): 

40 group_id: UUID4 

41 

42 

43class TagBase(CategoryBase): 

44 pass 

45 

46 

47class TagOut(TagSave): 

48 id: UUID4 

49 slug: str 

50 model_config = ConfigDict(from_attributes=True) 

51 

52 

53class RecipeTagResponse(RecipeCategoryResponse): 

54 @classmethod 

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

56 return [ 

57 selectinload(Tag.recipes).joinedload(RecipeModel.recipe_category), 

58 selectinload(Tag.recipes).joinedload(RecipeModel.tags), 

59 selectinload(Tag.recipes).joinedload(RecipeModel.tools), 

60 ] 

61 

62 

63from mealie.schema.recipe.recipe import RecipeSummary # noqa: E402 

64 

65RecipeCategoryResponse.model_rebuild() 

66RecipeTagResponse.model_rebuild()