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

51 statements  

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

1from datetime import date 1a

2from enum import Enum 1a

3from typing import Annotated 1a

4from uuid import UUID 1a

5 

6from pydantic import ConfigDict, Field, field_validator 1a

7from pydantic_core.core_schema import ValidationInfo 1a

8from sqlalchemy.orm import selectinload 1a

9from sqlalchemy.orm.interfaces import LoaderOption 1a

10 

11from mealie.db.models.household import GroupMealPlan 1a

12from mealie.db.models.recipe import RecipeModel 1a

13from mealie.db.models.users.users import User 1a

14from mealie.schema._mealie import MealieModel 1a

15from mealie.schema.recipe.recipe import RecipeSummary 1a

16from mealie.schema.response.pagination import PaginationBase 1a

17 

18 

19class PlanEntryType(str, Enum): 1a

20 breakfast = "breakfast" 1a

21 lunch = "lunch" 1a

22 dinner = "dinner" 1a

23 side = "side" 1a

24 

25 

26class CreateRandomEntry(MealieModel): 1a

27 date: date 1a

28 entry_type: PlanEntryType = PlanEntryType.dinner 1a

29 

30 

31class CreatePlanEntry(MealieModel): 1a

32 date: date 1a

33 entry_type: PlanEntryType = PlanEntryType.breakfast 1a

34 title: str = "" 1a

35 text: str = "" 1a

36 recipe_id: Annotated[UUID | None, Field(validate_default=True)] = None 1a

37 

38 @field_validator("recipe_id") 1a

39 @classmethod 1a

40 def id_or_title(cls, value, info: ValidationInfo): 1a

41 if bool(value) is False and bool(info.data["title"]) is False: 1bcdefghijklmno

42 raise ValueError(f"`recipe_id={value}` or `title={info.data['title']}` must be provided") 1bcdefghijklmno

43 

44 return value 1bcdefghijklmno

45 

46 

47class UpdatePlanEntry(CreatePlanEntry): 1a

48 id: int 1a

49 group_id: UUID 1a

50 user_id: UUID 1a

51 

52 

53class SavePlanEntry(CreatePlanEntry): 1a

54 group_id: UUID 1a

55 user_id: UUID 1a

56 model_config = ConfigDict(from_attributes=True) 1a

57 

58 

59class ReadPlanEntry(UpdatePlanEntry): 1a

60 household_id: UUID 1a

61 recipe: RecipeSummary | None = None 1a

62 model_config = ConfigDict(from_attributes=True) 1a

63 

64 @classmethod 1a

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

66 return [ 1bcdefghijklmno

67 selectinload(GroupMealPlan.recipe).joinedload(RecipeModel.recipe_category), 

68 selectinload(GroupMealPlan.recipe).joinedload(RecipeModel.tags), 

69 selectinload(GroupMealPlan.recipe).joinedload(RecipeModel.tools), 

70 selectinload(GroupMealPlan.user).load_only(User.household_id), 

71 ] 

72 

73 

74class PlanEntryPagination(PaginationBase): 1a

75 items: list[ReadPlanEntry] 1a