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

1from datetime import datetime 

2from typing import Annotated 

3 

4from pydantic import UUID4, ConfigDict, StringConstraints, field_validator 

5from sqlalchemy.orm import joinedload, selectinload 

6from sqlalchemy.orm.interfaces import LoaderOption 

7 

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 

13 

14from .household_preferences import ReadHouseholdPreferences, UpdateHouseholdPreferences 

15 

16 

17class HouseholdRecipeBase(MealieModel): 

18 last_made: datetime | None = None 

19 

20 

21class HouseholdRecipeSummary(HouseholdRecipeBase): 

22 recipe_id: UUID4 

23 model_config = ConfigDict(from_attributes=True) 

24 

25 

26class HouseholdRecipeCreate(HouseholdRecipeBase): 

27 household_id: UUID4 

28 recipe_id: UUID4 

29 

30 

31class HouseholdRecipeUpdate(HouseholdRecipeBase): ... 

32 

33 

34class HouseholdRecipeOut(HouseholdRecipeCreate): 

35 id: UUID4 

36 model_config = ConfigDict(from_attributes=True) 

37 

38 @classmethod 

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

40 return [ 

41 joinedload(HouseholdToRecipe.household), 

42 ] 

43 

44 

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) 

49 

50 

51class HouseholdSave(HouseholdCreate): 

52 group_id: UUID4 

53 

54 

55class UpdateHousehold(HouseholdSave): 

56 id: UUID4 

57 slug: str 

58 

59 

60class UpdateHouseholdAdmin(HouseholdSave): 

61 id: UUID4 

62 preferences: UpdateHouseholdPreferences | None = None 

63 

64 

65class HouseholdSummary(UpdateHousehold): 

66 preferences: ReadHouseholdPreferences | None = None 

67 model_config = ConfigDict(from_attributes=True) 

68 

69 

70class HouseholdUserSummary(MealieModel): 

71 id: UUID4 

72 full_name: str 

73 model_config = ConfigDict(from_attributes=True) 

74 

75 

76class HouseholdInDB(HouseholdSummary): 

77 group: str 

78 users: list[HouseholdUserSummary] | None = None 

79 webhooks: list[ReadWebhook] = [] 

80 model_config = ConfigDict(from_attributes=True) 

81 

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 ] 

91 

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 

96 

97 try: 

98 return v.name 

99 except AttributeError: 

100 return v 

101 

102 

103class HouseholdPagination(PaginationBase): 

104 items: list[HouseholdInDB]