fix: error when trying to change recipe image (#5771)

Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
This commit is contained in:
Mario Džoić
2025-08-16 10:41:46 +02:00
committed by GitHub
parent 6cbc308d83
commit c41a4a52ed
7 changed files with 115 additions and 26 deletions

View File

@@ -85,7 +85,6 @@ class RepositoryGeneric[Schema: MealieModel, Model: SqlAlchemyBase]:
def _filter_builder(self, **kwargs) -> dict[str, Any]:
dct = {}
if self.group_id:
dct["group_id"] = self.group_id
if self.household_id:
@@ -146,7 +145,11 @@ class RepositoryGeneric[Schema: MealieModel, Model: SqlAlchemyBase]:
return self.session.execute(self._query().filter_by(**fltr)).unique().scalars().one()
def get_one(
self, value: str | int | UUID4, key: str | None = None, any_case=False, override_schema=None
self,
value: str | int | UUID4,
key: str | None = None,
any_case=False,
override_schema=None,
) -> Schema | None:
key = key or self.primary_key
eff_schema = override_schema or self.schema

View File

@@ -523,12 +523,12 @@ class RecipeController(BaseRecipeController):
@router.put("/{slug}/image", response_model=UpdateImageResponse, tags=["Recipe: Images and Assets"])
def update_recipe_image(self, slug: str, image: bytes = File(...), extension: str = Form(...)):
recipe = self.mixins.get_one(slug)
data_service = RecipeDataService(recipe.id)
data_service.write_image(image, extension)
new_version = self.recipes.update_image(slug, extension)
return UpdateImageResponse(image=new_version)
try:
new_version = self.service.update_recipe_image(slug, image, extension)
return UpdateImageResponse(image=new_version)
except Exception as e:
self.handle_exceptions(e)
return None
@router.post("/{slug}/assets", response_model=RecipeAsset, tags=["Recipe: Images and Assets"])
def upload_recipe_asset(
@@ -550,7 +550,7 @@ class RecipeController(BaseRecipeController):
file_name = f"{file_slug}.{extension}"
asset_in = RecipeAsset(name=name, icon=icon, file_name=file_name)
recipe = self.mixins.get_one(slug)
recipe = self.service.get_one(slug)
dest = recipe.asset_dir / file_name
@@ -567,9 +567,9 @@ class RecipeController(BaseRecipeController):
if not dest.is_file():
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR)
recipe = self.mixins.get_one(slug)
recipe.assets.append(asset_in)
if recipe.assets is not None:
recipe.assets.append(asset_in)
self.mixins.update_one(recipe, slug)
self.service.update_one(slug, recipe)
return asset_in

View File

@@ -408,6 +408,16 @@ class RecipeService(RecipeServiceBase):
self.check_assets(new_data, recipe.slug)
return new_data
def update_recipe_image(self, slug: str, image: bytes, extension: str):
recipe = self.get_one(slug)
if not self.can_update(recipe):
raise exceptions.PermissionDenied("You do not have permission to edit this recipe.")
data_service = RecipeDataService(recipe.id)
data_service.write_image(image, extension)
return self.group_recipes.update_image(slug, extension)
def patch_one(self, slug_or_id: str | UUID, patch_data: Recipe) -> Recipe:
recipe: Recipe = self._pre_update_check(slug_or_id, patch_data)