Coverage for opt/mealie/lib/python3.12/site-packages/mealie/schema/household/household.py: 97%
63 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1from datetime import datetime
2from typing import Annotated
4from pydantic import UUID4, ConfigDict, StringConstraints, field_validator
5from sqlalchemy.orm import joinedload, selectinload
6from sqlalchemy.orm.interfaces import LoaderOption
8from mealie.db.models.household import Household, HouseholdToRecipe
9from mealie.db.models.users.users import User
10from mealie.schema._mealie.mealie_model import MealieModel
11from mealie.schema.household.webhook import ReadWebhook
12from mealie.schema.response.pagination import PaginationBase
14from .household_preferences import ReadHouseholdPreferences, UpdateHouseholdPreferences
17class HouseholdRecipeBase(MealieModel):
18 last_made: datetime | None = None
21class HouseholdRecipeSummary(HouseholdRecipeBase):
22 recipe_id: UUID4
23 model_config = ConfigDict(from_attributes=True)
26class HouseholdRecipeCreate(HouseholdRecipeBase):
27 household_id: UUID4
28 recipe_id: UUID4
31class HouseholdRecipeUpdate(HouseholdRecipeBase): ...
34class HouseholdRecipeOut(HouseholdRecipeCreate):
35 id: UUID4
36 model_config = ConfigDict(from_attributes=True)
38 @classmethod
39 def loader_options(cls) -> list[LoaderOption]:
40 return [
41 joinedload(HouseholdToRecipe.household),
42 ]
45class HouseholdCreate(MealieModel):
46 group_id: UUID4 | None = None
47 name: Annotated[str, StringConstraints(strip_whitespace=True, min_length=1)]
48 model_config = ConfigDict(from_attributes=True)
51class HouseholdSave(HouseholdCreate):
52 group_id: UUID4
55class UpdateHousehold(HouseholdSave):
56 id: UUID4
57 slug: str
60class UpdateHouseholdAdmin(HouseholdSave):
61 id: UUID4
62 preferences: UpdateHouseholdPreferences | None = None
65class HouseholdSummary(UpdateHousehold):
66 preferences: ReadHouseholdPreferences | None = None
67 model_config = ConfigDict(from_attributes=True)
70class HouseholdUserSummary(MealieModel):
71 id: UUID4
72 full_name: str
73 model_config = ConfigDict(from_attributes=True)
76class HouseholdInDB(HouseholdSummary):
77 group: str
78 users: list[HouseholdUserSummary] | None = None
79 webhooks: list[ReadWebhook] = []
80 model_config = ConfigDict(from_attributes=True)
82 @classmethod
83 def loader_options(cls) -> list[LoaderOption]:
84 return [
85 joinedload(Household.group),
86 joinedload(Household.webhooks),
87 joinedload(Household.preferences),
88 selectinload(Household.users).joinedload(User.group),
89 selectinload(Household.users).joinedload(User.tokens),
90 ]
92 @field_validator("group", mode="before")
93 def convert_group_to_name(cls, v):
94 if not v or isinstance(v, str):
95 return v
97 try:
98 return v.name
99 except AttributeError:
100 return v
103class HouseholdPagination(PaginationBase):
104 items: list[HouseholdInDB]