Coverage for opt/mealie/lib/python3.12/site-packages/mealie/routes/explore/controller_public_cookbooks.py: 35%
40 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 uuid import UUID 1a
3from fastapi import APIRouter, Depends, HTTPException 1a
4from pydantic import UUID4 1a
6from mealie.routes._base import controller 1a
7from mealie.routes._base.base_controllers import BasePublicHouseholdExploreController 1a
8from mealie.schema.cookbook.cookbook import ReadCookBook 1a
9from mealie.schema.make_dependable import make_dependable 1a
10from mealie.schema.response.pagination import PaginationBase, PaginationQuery 1a
12router = APIRouter(prefix="/cookbooks") 1a
15@controller(router) 1a
16class PublicCookbooksController(BasePublicHouseholdExploreController): 1a
17 @property 1a
18 def cross_household_cookbooks(self): 1a
19 return self.cross_household_repos.cookbooks
21 @router.get("", response_model=PaginationBase[ReadCookBook]) 1a
22 def get_all( 1a
23 self,
24 q: PaginationQuery = Depends(make_dependable(PaginationQuery)),
25 search: str | None = None,
26 ) -> PaginationBase[ReadCookBook]:
27 public_filter = "(household.preferences.privateHousehold = FALSE AND public = TRUE)"
28 if q.query_filter:
29 q.query_filter = f"({q.query_filter}) AND {public_filter}"
30 else:
31 q.query_filter = public_filter
33 response = self.cross_household_cookbooks.page_all(
34 pagination=q,
35 override=ReadCookBook,
36 search=search,
37 )
39 response.set_pagination_guides(self.get_explore_url_path(router.url_path_for("get_all")), q.model_dump())
40 return response
42 @router.get("/{item_id}", response_model=ReadCookBook) 1a
43 def get_one(self, item_id: UUID4 | str) -> ReadCookBook: 1a
44 NOT_FOUND_EXCEPTION = HTTPException(404, "cookbook not found")
45 if isinstance(item_id, UUID):
46 match_attr = "id"
47 else:
48 try:
49 UUID(item_id)
50 match_attr = "id"
51 except ValueError:
52 match_attr = "slug"
53 cookbook = self.cross_household_cookbooks.get_one(item_id, match_attr)
55 if not cookbook or not cookbook.public:
56 raise NOT_FOUND_EXCEPTION
57 household = self.repos.households.get_one(cookbook.household_id)
58 if not household or household.preferences.private_household:
59 raise NOT_FOUND_EXCEPTION
61 return cookbook