feat: Show Cookbooks from Other Households (#4452)

This commit is contained in:
Michael Genson
2024-11-05 13:57:30 -06:00
committed by GitHub
parent 8983745106
commit 87f4b23711
13 changed files with 264 additions and 55 deletions

View File

@@ -2,6 +2,7 @@ from collections.abc import Callable
from logging import Logger
from typing import Generic, TypeVar
import sqlalchemy.exc
from fastapi import HTTPException, status
from pydantic import UUID4, BaseModel
@@ -57,10 +58,16 @@ class HttpRepo(Generic[C, R, U]):
# Respond
msg = self.get_exception_message(ex)
raise HTTPException(
status.HTTP_400_BAD_REQUEST,
detail=ErrorResponse.respond(message=msg, exception=str(ex)),
)
if isinstance(ex, sqlalchemy.exc.NoResultFound):
raise HTTPException(
status.HTTP_404_NOT_FOUND,
detail=ErrorResponse.respond(message=msg, exception=str(ex)),
)
else:
raise HTTPException(
status.HTTP_400_BAD_REQUEST,
detail=ErrorResponse.respond(message=msg, exception=str(ex)),
)
def create_one(self, data: C) -> R | None:
item: R | None = None

View File

@@ -6,6 +6,7 @@ from fastapi import APIRouter, Depends, HTTPException
from pydantic import UUID4
from mealie.core.exceptions import mealie_registered_exceptions
from mealie.repos.all_repositories import get_repositories
from mealie.routes._base import BaseCrudController, controller
from mealie.routes._base.mixins import HttpRepo
from mealie.routes._base.routers import MealieCrudRoute
@@ -26,9 +27,13 @@ router = APIRouter(prefix="/households/cookbooks", tags=["Households: Cookbooks"
@controller(router)
class GroupCookbookController(BaseCrudController):
@cached_property
def repo(self):
def cookbooks(self):
return self.repos.cookbooks
@cached_property
def group_cookbooks(self):
return get_repositories(self.session, group_id=self.group_id, household_id=None).cookbooks
def registered_exceptions(self, ex: type[Exception]) -> str:
registered = {
**mealie_registered_exceptions(self.translator),
@@ -38,14 +43,15 @@ class GroupCookbookController(BaseCrudController):
@cached_property
def mixins(self):
return HttpRepo[CreateCookBook, ReadCookBook, UpdateCookBook](
self.repo,
self.cookbooks,
self.logger,
self.registered_exceptions,
)
@router.get("", response_model=CookBookPagination)
def get_all(self, q: PaginationQuery = Depends(PaginationQuery)):
response = self.repo.page_all(
# Fetch all cookbooks for the group, rather than the household
response = self.group_cookbooks.page_all(
pagination=q,
override=ReadCookBook,
)
@@ -106,7 +112,8 @@ class GroupCookbookController(BaseCrudController):
except ValueError:
match_attr = "slug"
cookbook = self.repo.get_one(item_id, match_attr)
# Allow fetching other households' cookbooks
cookbook = self.group_cookbooks.get_one(item_id, match_attr)
if cookbook is None:
raise HTTPException(status_code=404)

View File

@@ -105,8 +105,8 @@ class BaseRecipeController(BaseCrudController):
return get_repositories(self.session, group_id=self.group_id, household_id=None).recipes
@cached_property
def cookbooks_repo(self) -> RepositoryGeneric[ReadCookBook, CookBook]:
return self.repos.cookbooks
def group_cookbooks(self) -> RepositoryGeneric[ReadCookBook, CookBook]:
return get_repositories(self.session, group_id=self.group_id, household_id=None).cookbooks
@cached_property
def service(self) -> RecipeService:
@@ -354,7 +354,7 @@ class RecipeController(BaseRecipeController):
cb_match_attr = "id"
except ValueError:
cb_match_attr = "slug"
cookbook_data = self.cookbooks_repo.get_one(search_query.cookbook, cb_match_attr)
cookbook_data = self.group_cookbooks.get_one(search_query.cookbook, cb_match_attr)
if cookbook_data is None:
raise HTTPException(status_code=404, detail="cookbook not found")