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:32 +0000

1from uuid import UUID 1a

2 

3from fastapi import APIRouter, Depends, HTTPException 1a

4from pydantic import UUID4 1a

5 

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

11 

12router = APIRouter(prefix="/cookbooks") 1a

13 

14 

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 

20 

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 

32 

33 response = self.cross_household_cookbooks.page_all( 

34 pagination=q, 

35 override=ReadCookBook, 

36 search=search, 

37 ) 

38 

39 response.set_pagination_guides(self.get_explore_url_path(router.url_path_for("get_all")), q.model_dump()) 

40 return response 

41 

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) 

54 

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 

60 

61 return cookbook