Coverage for opt/mealie/lib/python3.12/site-packages/mealie/routes/groups/controller_labels.py: 94%

50 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 03:04 +0000

1from functools import cached_property 

2 

3from fastapi import APIRouter, Depends 

4from pydantic import UUID4 

5 

6from mealie.routes._base.base_controllers import BaseCrudController 

7from mealie.routes._base.controller import controller 

8from mealie.routes._base.mixins import HttpRepo 

9from mealie.routes._base.routers import MealieCrudRoute 

10from mealie.schema.labels import ( 

11 MultiPurposeLabelCreate, 

12 MultiPurposeLabelOut, 

13 MultiPurposeLabelSummary, 

14 MultiPurposeLabelUpdate, 

15) 

16from mealie.schema.labels.multi_purpose_label import MultiPurposeLabelPagination 

17from mealie.schema.response.pagination import PaginationQuery 

18from mealie.services.event_bus_service.event_types import EventLabelData, EventOperation, EventTypes 

19from mealie.services.group_services.labels_service import MultiPurposeLabelService 

20 

21router = APIRouter(prefix="/groups/labels", tags=["Groups: Multi Purpose Labels"], route_class=MealieCrudRoute) 

22 

23 

24@controller(router) 

25class MultiPurposeLabelsController(BaseCrudController): 

26 @cached_property 

27 def service(self): 

28 return MultiPurposeLabelService(self.repos) 

29 

30 @cached_property 

31 def repo(self): 

32 if not self.user: 32 ↛ 33line 32 didn't jump to line 33 because the condition on line 32 was never true

33 raise Exception("No user is logged in.") 

34 

35 return self.repos.group_multi_purpose_labels 

36 

37 # ======================================================================= 

38 # CRUD Operations 

39 

40 @property 

41 def mixins(self) -> HttpRepo: 

42 return HttpRepo(self.repo, self.logger, self.registered_exceptions, self.t("generic.server-error")) 

43 

44 @router.get("", response_model=MultiPurposeLabelPagination) 

45 def get_all(self, q: PaginationQuery = Depends(PaginationQuery), search: str | None = None): 

46 response = self.repo.page_all( 

47 pagination=q, 

48 override=MultiPurposeLabelSummary, 

49 search=search, 

50 ) 

51 

52 response.set_pagination_guides(router.url_path_for("get_all"), q.model_dump()) 

53 return response 

54 

55 @router.post("", response_model=MultiPurposeLabelOut) 

56 def create_one(self, data: MultiPurposeLabelCreate): 

57 new_label = self.service.create_one(data) 

58 self.publish_event( 

59 event_type=EventTypes.label_created, 

60 document_data=EventLabelData(operation=EventOperation.create, label_id=new_label.id), 

61 group_id=new_label.group_id, 

62 household_id=None, 

63 message=self.t("notifications.generic-created", name=new_label.name), 

64 ) 

65 return new_label 

66 

67 @router.get("/{item_id}", response_model=MultiPurposeLabelOut) 

68 def get_one(self, item_id: UUID4): 

69 return self.repo.get_one(item_id) 

70 

71 @router.put("/{item_id}", response_model=MultiPurposeLabelOut) 

72 def update_one(self, item_id: UUID4, data: MultiPurposeLabelUpdate): 

73 label = self.mixins.update_one(data, item_id) 

74 self.publish_event( 

75 event_type=EventTypes.label_updated, 

76 document_data=EventLabelData(operation=EventOperation.update, label_id=label.id), 

77 group_id=label.group_id, 

78 household_id=None, 

79 message=self.t("notifications.generic-updated", name=label.name), 

80 ) 

81 return label 

82 

83 @router.delete("/{item_id}", response_model=MultiPurposeLabelOut) 

84 def delete_one(self, item_id: UUID4): 

85 label = self.mixins.delete_one(item_id) 

86 if label: 86 ↛ 94line 86 didn't jump to line 94 because the condition on line 86 was always true

87 self.publish_event( 

88 event_type=EventTypes.label_deleted, 

89 document_data=EventLabelData(operation=EventOperation.delete, label_id=label.id), 

90 group_id=label.group_id, 

91 household_id=None, 

92 message=self.t("notifications.generic-deleted", name=label.name), 

93 ) 

94 return label