Coverage for opt/mealie/lib/python3.12/site-packages/mealie/schema/household/household.py: 93%

63 statements  

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

1from datetime import datetime 1a

2from typing import Annotated 1a

3 

4from pydantic import UUID4, ConfigDict, StringConstraints, field_validator 1a

5from sqlalchemy.orm import joinedload, selectinload 1a

6from sqlalchemy.orm.interfaces import LoaderOption 1a

7 

8from mealie.db.models.household import Household, HouseholdToRecipe 1a

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

10from mealie.schema._mealie.mealie_model import MealieModel 1a

11from mealie.schema.household.webhook import ReadWebhook 1a

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

13 

14from .household_preferences import ReadHouseholdPreferences, UpdateHouseholdPreferences 1a

15 

16 

17class HouseholdRecipeBase(MealieModel): 1a

18 last_made: datetime | None = None 1a

19 

20 

21class HouseholdRecipeSummary(HouseholdRecipeBase): 1a

22 recipe_id: UUID4 1a

23 model_config = ConfigDict(from_attributes=True) 1a

24 

25 

26class HouseholdRecipeCreate(HouseholdRecipeBase): 1a

27 household_id: UUID4 1a

28 recipe_id: UUID4 1a

29 

30 

31class HouseholdRecipeUpdate(HouseholdRecipeBase): ... 1a

32 

33 

34class HouseholdRecipeOut(HouseholdRecipeCreate): 1a

35 id: UUID4 1a

36 model_config = ConfigDict(from_attributes=True) 1a

37 

38 @classmethod 1a

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

40 return [ 

41 joinedload(HouseholdToRecipe.household), 

42 ] 

43 

44 

45class HouseholdCreate(MealieModel): 1a

46 group_id: UUID4 | None = None 1a

47 name: Annotated[str, StringConstraints(strip_whitespace=True, min_length=1)] 1a

48 model_config = ConfigDict(from_attributes=True) 1a

49 

50 

51class HouseholdSave(HouseholdCreate): 1a

52 group_id: UUID4 1a

53 

54 

55class UpdateHousehold(HouseholdSave): 1a

56 id: UUID4 1a

57 slug: str 1a

58 

59 

60class UpdateHouseholdAdmin(HouseholdSave): 1a

61 id: UUID4 1a

62 preferences: UpdateHouseholdPreferences | None = None 1a

63 

64 

65class HouseholdSummary(UpdateHousehold): 1a

66 preferences: ReadHouseholdPreferences | None = None 1a

67 model_config = ConfigDict(from_attributes=True) 1a

68 

69 

70class HouseholdUserSummary(MealieModel): 1a

71 id: UUID4 1a

72 full_name: str 1a

73 model_config = ConfigDict(from_attributes=True) 1a

74 

75 

76class HouseholdInDB(HouseholdSummary): 1a

77 group: str 1a

78 users: list[HouseholdUserSummary] | None = None 1a

79 webhooks: list[ReadWebhook] = [] 1a

80 model_config = ConfigDict(from_attributes=True) 1a

81 

82 @classmethod 1a

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

84 return [ 1bcdefghijkl

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") 1a

93 def convert_group_to_name(cls, v): 1a

94 if not v or isinstance(v, str): 94 ↛ 95line 94 didn't jump to line 95 because the condition on line 94 was never true1ambcdefghijkl

95 return v 

96 

97 try: 1ambcdefghijkl

98 return v.name 1ambcdefghijkl

99 except AttributeError: 

100 return v 

101 

102 

103class HouseholdPagination(PaginationBase): 1a

104 items: list[HouseholdInDB] 1a