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 15:48 +0000
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-25 15:48 +0000
1from functools import cached_property 1a
3from fastapi import Depends, HTTPException, status 1a
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
16router = UserAPIRouter(prefix="/households", tags=["Households: Self Service"]) 1a
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)
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 1mcdeifjgnokhb
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")
37 return response
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"""
43 qf_part = f"household_id={self.household_id}" 1mcdelifjgnokhb
44 if q.query_filter: 1mcdelifjgnokhb
45 q.query_filter = f"({q.query_filter}) AND {qf_part}" 1mcdelifgohb
46 else:
47 q.query_filter = qf_part 1mcdelfjgnkhb
49 response = self.repos.users.page_all(q, override=UserOut) 1mcdelifjgnokhb
51 response.set_pagination_guides(router.url_path_for("get_household_members"), q.model_dump()) 1cdelifjgkhb
52 return response 1cdelifjgkhb
54 @router.get("/preferences", response_model=ReadHouseholdPreferences) 1a
55 def get_household_preferences(self): 1a
56 return self.household.preferences
58 @router.put("/preferences", response_model=ReadHouseholdPreferences) 1a
59 def update_household_preferences(self, new_pref: UpdateHouseholdPreferences): 1a
60 self.checks.can_manage_household() 1p
62 return self.repos.household_preferences.update(self.household_id, new_pref) 1p
64 @router.put("/permissions", response_model=UserOut) 1a
65 def set_member_permissions(self, permissions: SetPermissions): 1a
66 self.checks.can_manage()
68 target_user = self.repos.users.get_one(permissions.user_id)
70 if not target_user:
71 raise HTTPException(status.HTTP_404_NOT_FOUND, detail="User not found")
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")
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")
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")
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
87 return self.repos.users.update(permissions.user_id, target_user)
89 @router.get("/statistics", response_model=HouseholdStatistics) 1a
90 def get_statistics(self): 1a
91 return self.service.calculate_statistics()