Coverage for opt/mealie/lib/python3.12/site-packages/mealie/routes/users/images.py: 54%
26 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
1import shutil 1a
2from uuid import uuid4 1a
4from fastapi import File, HTTPException, UploadFile, status 1a
5from pydantic import UUID4 1a
7from mealie.core.dependencies import get_temporary_path 1a
8from mealie.pkgs import cache, img 1a
9from mealie.routes._base import BaseUserController, controller 1a
10from mealie.routes._base.routers import UserAPIRouter 1a
11from mealie.routes.users._helpers import assert_user_change_allowed 1a
12from mealie.schema.user import PrivateUser 1a
14router = UserAPIRouter(prefix="", tags=["Users: Images"]) 1a
17@controller(router) 1a
18class UserImageController(BaseUserController): 1a
19 @router.post("/{id}/image") 1a
20 def update_user_image( 1a
21 self,
22 id: UUID4,
23 profile: UploadFile = File(...),
24 ):
25 """Updates a User Image"""
26 with get_temporary_path() as temp_path:
27 assert_user_change_allowed(id, self.user, self.user)
29 # use a generated uuid and ignore the filename so we don't
30 # need to worry about sanitizing user inputs.
31 temp_img = temp_path.joinpath(str(uuid4()))
33 with temp_img.open("wb") as buffer:
34 shutil.copyfileobj(profile.file, buffer)
36 image = img.PillowMinifier.to_webp(temp_img)
37 dest = PrivateUser.get_directory(id) / "profile.webp"
39 shutil.copyfile(image, dest)
41 self.repos.users.patch(id, {"cache_key": cache.new_key()})
43 if not dest.is_file():
44 raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR)