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

50 statements  

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

1from functools import cached_property 1a

2 

3from fastapi import APIRouter, Depends 1a

4from pydantic import UUID4 1a

5 

6from mealie.routes._base.base_controllers import BaseCrudController 1a

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

8from mealie.routes._base.mixins import HttpRepo 1a

9from mealie.routes._base.routers import MealieCrudRoute 1a

10from mealie.schema.labels import ( 1a

11 MultiPurposeLabelCreate, 

12 MultiPurposeLabelOut, 

13 MultiPurposeLabelSummary, 

14 MultiPurposeLabelUpdate, 

15) 

16from mealie.schema.labels.multi_purpose_label import MultiPurposeLabelPagination 1a

17from mealie.schema.response.pagination import PaginationQuery 1a

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

19from mealie.services.group_services.labels_service import MultiPurposeLabelService 1a

20 

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

22 

23 

24@controller(router) 1a

25class MultiPurposeLabelsController(BaseCrudController): 1a

26 @cached_property 1a

27 def service(self): 1a

28 return MultiPurposeLabelService(self.repos) 1defghijkb

29 

30 @cached_property 1a

31 def repo(self): 1a

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

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

34 

35 return self.repos.group_multi_purpose_labels 1cb

36 

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

38 # CRUD Operations 

39 

40 @property 1a

41 def mixins(self) -> HttpRepo: 1a

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

43 

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

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

46 response = self.repo.page_all( 1c

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()) 1c

53 return response 1c

54 

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

56 def create_one(self, data: MultiPurposeLabelCreate): 1a

57 new_label = self.service.create_one(data) 1defghijkb

58 self.publish_event( 1defghijkb

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 1defghijkb

66 

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

68 def get_one(self, item_id: UUID4): 1a

69 return self.repo.get_one(item_id) 

70 

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

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

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

84 def delete_one(self, item_id: UUID4): 1a

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