Coverage for opt/mealie/lib/python3.12/site-packages/mealie/routes/households/controller_household_self_service.py: 67%

63 statements  

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

1from functools import cached_property 1a

2 

3from fastapi import Depends, HTTPException, status 1a

4 

5from mealie.routes._base.base_controllers import BaseUserController 1a

6from mealie.routes._base.controller import controller 1a

7from mealie.routes._base.routers import UserAPIRouter 1a

8from mealie.schema.household import HouseholdInDB, HouseholdRecipeSummary 1a

9from mealie.schema.household.household_permissions import SetPermissions 1a

10from mealie.schema.household.household_preferences import ReadHouseholdPreferences, UpdateHouseholdPreferences 1a

11from mealie.schema.household.household_statistics import HouseholdStatistics 1a

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

13from mealie.schema.user.user import UserOut 1a

14from mealie.services.household_services.household_service import HouseholdService 1a

15 

16router = UserAPIRouter(prefix="/households", tags=["Households: Self Service"]) 1a

17 

18 

19@controller(router) 1a

20class HouseholdSelfServiceController(BaseUserController): 1a

21 @cached_property 1a

22 def service(self) -> HouseholdService: 1a

23 return HouseholdService(self.group_id, self.household_id, self.repos) 1Cb

24 

25 @router.get("/self", response_model=HouseholdInDB) 1a

26 def get_logged_in_user_household(self): 1a

27 """Returns the Household Data for the Current User""" 

28 return self.household 1cdEeflgymhnoipqjrsktuFGvzb

29 

30 @router.get("/self/recipes/{recipe_slug}", response_model=HouseholdRecipeSummary) 1a

31 def get_household_recipe(self, recipe_slug: str): 1a

32 """Returns recipe data for the current household""" 

33 response = self.service.get_household_recipe(recipe_slug) 

34 if not response: 34 ↛ 37line 34 didn't jump to line 37 because the condition on line 34 was always true

35 raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Recipe not found") 

36 

37 return response 

38 

39 @router.get("/members", response_model=PaginationBase[UserOut]) 1a

40 def get_household_members(self, q: PaginationQuery = Depends()): 1a

41 """Returns all users belonging to the current household""" 

42 

43 qf_part = f"household_id={self.household_id}" 1cBdeflgymhnoipqjrsxktAuwvzb

44 if q.query_filter: 1cBdeflgymhnoipqjrsxktAuwvzb

45 q.query_filter = f"({q.query_filter}) AND {qf_part}" 1cBdeflgyhnijxkAwzb

46 else: 

47 q.query_filter = qf_part 1cdefgmhoipqjrsktAuwvb

48 

49 response = self.repos.users.page_all(q, override=UserOut) 1cBdeflgymhnoipqjrsxktAuwvzb

50 

51 response.set_pagination_guides(router.url_path_for("get_household_members"), q.model_dump()) 1cdeflgmhnoipqjrsxktuwvb

52 return response 1cdeflgmhnoipqjrsxktuwvb

53 

54 @router.get("/preferences", response_model=ReadHouseholdPreferences) 1a

55 def get_household_preferences(self): 1a

56 return self.household.preferences 

57 

58 @router.put("/preferences", response_model=ReadHouseholdPreferences) 1a

59 def update_household_preferences(self, new_pref: UpdateHouseholdPreferences): 1a

60 self.checks.can_manage_household() 1Db

61 

62 return self.repos.household_preferences.update(self.household_id, new_pref) 1Db

63 

64 @router.put("/permissions", response_model=UserOut) 1a

65 def set_member_permissions(self, permissions: SetPermissions): 1a

66 self.checks.can_manage() 

67 

68 target_user = self.repos.users.get_one(permissions.user_id) 

69 

70 if not target_user: 

71 raise HTTPException(status.HTTP_404_NOT_FOUND, detail="User not found") 

72 

73 if target_user.group_id != self.group_id: 

74 raise HTTPException(status.HTTP_403_FORBIDDEN, detail="User is not a member of this group") 

75 

76 if target_user.household_id != self.household_id: 

77 raise HTTPException(status.HTTP_403_FORBIDDEN, detail="User is not a member of this household") 

78 

79 if target_user.id == self.user.id: 

80 raise HTTPException(status.HTTP_403_FORBIDDEN, detail="User is not allowed to change their own permissions") 

81 

82 target_user.can_invite = permissions.can_invite 

83 target_user.can_manage = permissions.can_manage 

84 target_user.can_manage_household = permissions.can_manage_household 

85 target_user.can_organize = permissions.can_organize 

86 

87 return self.repos.users.update(permissions.user_id, target_user) 

88 

89 @router.get("/statistics", response_model=HouseholdStatistics) 1a

90 def get_statistics(self): 1a

91 return self.service.calculate_statistics() 1C