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
« prev ^ index » next coverage.py v7.10.6, created at 2025-11-25 15:32 +0000
1from functools import cached_property 1a
3from fastapi import APIRouter, Depends 1a
4from pydantic import UUID4 1a
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
21router = APIRouter(prefix="/groups/labels", tags=["Groups: Multi Purpose Labels"], route_class=MealieCrudRoute) 1a
24@controller(router) 1a
25class MultiPurposeLabelsController(BaseCrudController): 1a
26 @cached_property 1a
27 def service(self): 1a
28 return MultiPurposeLabelService(self.repos) 1defghijkb
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.")
35 return self.repos.group_multi_purpose_labels 1cb
37 # =======================================================================
38 # CRUD Operations
40 @property 1a
41 def mixins(self) -> HttpRepo: 1a
42 return HttpRepo(self.repo, self.logger, self.registered_exceptions, self.t("generic.server-error"))
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 )
52 response.set_pagination_guides(router.url_path_for("get_all"), q.model_dump()) 1c
53 return response 1c
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
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)
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
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