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:32 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-25 15:32 +0000
1from datetime import date 1a
2from enum import Enum 1a
3from typing import Annotated 1a
4from uuid import UUID 1a
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
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
19class PlanEntryType(str, Enum): 1a
20 breakfast = "breakfast" 1a
21 lunch = "lunch" 1a
22 dinner = "dinner" 1a
23 side = "side" 1a
26class CreateRandomEntry(MealieModel): 1a
27 date: date 1a
28 entry_type: PlanEntryType = PlanEntryType.dinner 1a
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
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: 1bcdefghji
42 raise ValueError(f"`recipe_id={value}` or `title={info.data['title']}` must be provided") 1bcdefghji
44 return value 1bcdefghji
47class UpdatePlanEntry(CreatePlanEntry): 1a
48 id: int 1a
49 group_id: UUID 1a
50 user_id: UUID 1a
53class SavePlanEntry(CreatePlanEntry): 1a
54 group_id: UUID 1a
55 user_id: UUID 1a
56 model_config = ConfigDict(from_attributes=True) 1a
59class ReadPlanEntry(UpdatePlanEntry): 1a
60 household_id: UUID 1a
61 recipe: RecipeSummary | None = None 1a
62 model_config = ConfigDict(from_attributes=True) 1a
64 @classmethod 1a
65 def loader_options(cls) -> list[LoaderOption]: 1a
66 return [ 1kbcdefghi
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 ]
74class PlanEntryPagination(PaginationBase): 1a
75 items: list[ReadPlanEntry] 1a