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
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 03:04 +0000
1from functools import cached_property
3from fastapi import APIRouter, Depends
4from pydantic import UUID4
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
21router = APIRouter(prefix="/groups/labels", tags=["Groups: Multi Purpose Labels"], route_class=MealieCrudRoute)
24@controller(router)
25class MultiPurposeLabelsController(BaseCrudController):
26 @cached_property
27 def service(self):
28 return MultiPurposeLabelService(self.repos)
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.")
35 return self.repos.group_multi_purpose_labels
37 # =======================================================================
38 # CRUD Operations
40 @property
41 def mixins(self) -> HttpRepo:
42 return HttpRepo(self.repo, self.logger, self.registered_exceptions, self.t("generic.server-error"))
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 )
52 response.set_pagination_guides(router.url_path_for("get_all"), q.model_dump())
53 return response
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
67 @router.get("/{item_id}", response_model=MultiPurposeLabelOut)
68 def get_one(self, item_id: UUID4):
69 return self.repo.get_one(item_id)
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
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