Otaceni fotek
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import asyncio
|
||||||
from typing import List, Optional, Annotated, TYPE_CHECKING
|
from typing import List, Optional, Annotated, TYPE_CHECKING
|
||||||
import strawberry
|
import strawberry
|
||||||
from sqlalchemy import select, update
|
from sqlalchemy import select, update
|
||||||
@@ -10,7 +11,7 @@ from graphql_schema.dataloaders.poi import poi_dataloader
|
|||||||
from graphql_schema.sqlalchemy_to_strawberry_type import strawberry_sqlalchemy_type
|
from graphql_schema.sqlalchemy_to_strawberry_type import strawberry_sqlalchemy_type
|
||||||
from graphql_schema.types import ComboboxInput
|
from graphql_schema.types import ComboboxInput
|
||||||
from upload_utils import (
|
from upload_utils import (
|
||||||
get_public_url, handle_file_upload, delete_file, parse_exif_info, generate_thumbnail, file_exists, resize_image
|
get_public_url, handle_file_upload, delete_file, parse_exif_info, generate_thumbnail, file_exists, resize_image, rotate_image
|
||||||
)
|
)
|
||||||
from .helpers.flight import handle_combobox_save
|
from .helpers.flight import handle_combobox_save
|
||||||
|
|
||||||
@@ -149,6 +150,31 @@ class EditPhotoMutation:
|
|||||||
updated_model = await models.Photo.update(db, obj=photo, data=data)
|
updated_model = await models.Photo.update(db, obj=photo, data=data)
|
||||||
return Photo(**updated_model.as_dict())
|
return Photo(**updated_model.as_dict())
|
||||||
|
|
||||||
|
@strawberry.mutation()
|
||||||
|
@authenticated_user_only()
|
||||||
|
async def rotate_photo(self, info, id: int, angle: int) -> Photo:
|
||||||
|
|
||||||
|
async with get_session() as db:
|
||||||
|
query = get_base_query(info.context.user_id)
|
||||||
|
photo = (await db.scalars(query.filter(models.Photo.id == id))).one()
|
||||||
|
|
||||||
|
await asyncio.gather(
|
||||||
|
rotate_image(
|
||||||
|
path=get_photo_basepath(photo.flight_id),
|
||||||
|
filename=photo.filename,
|
||||||
|
angle=angle,
|
||||||
|
),
|
||||||
|
rotate_image(
|
||||||
|
path=get_photo_basepath(photo.flight_id)+"/thumbs",
|
||||||
|
filename=photo.filename,
|
||||||
|
angle=angle,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
return Photo(**photo.as_dict())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@strawberry.type
|
@strawberry.type
|
||||||
class DeletePhotoMutation:
|
class DeletePhotoMutation:
|
||||||
|
|||||||
+22
-1
@@ -63,7 +63,9 @@ async def parse_exif_info(path: str, filename: str) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
async def resize_image(
|
async def resize_image(
|
||||||
path: str, filename: str, new_width: int, quality: int = 90, dest_path: str = None, dest_filename: str = None
|
path: str, filename: str, new_width: int, quality: int = 90,
|
||||||
|
dest_path: Optional[str] = None,
|
||||||
|
dest_filename: Optional[str] = None
|
||||||
):
|
):
|
||||||
if not dest_path:
|
if not dest_path:
|
||||||
dest_path = path
|
dest_path = path
|
||||||
@@ -84,6 +86,25 @@ async def resize_image(
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
async def rotate_image(
|
||||||
|
path: str,
|
||||||
|
filename: str,
|
||||||
|
angle: int,
|
||||||
|
dest_path: Optional[str] = None,
|
||||||
|
dest_filename: Optional[str] = None
|
||||||
|
):
|
||||||
|
if not dest_path:
|
||||||
|
dest_path = path
|
||||||
|
|
||||||
|
if not dest_filename:
|
||||||
|
dest_filename = filename
|
||||||
|
|
||||||
|
img = Image.open(f"{path}/{filename}")
|
||||||
|
img = img.rotate(angle, Image.LANCZOS, expand=True)
|
||||||
|
check_directories(dest_path)
|
||||||
|
img.save(f"{dest_path}/{dest_filename}", 'JPEG', quality=100)
|
||||||
|
|
||||||
|
|
||||||
async def generate_thumbnail(path: str, filename: str, quality: int = 90):
|
async def generate_thumbnail(path: str, filename: str, quality: int = 90):
|
||||||
return await resize_image(
|
return await resize_image(
|
||||||
path, filename,
|
path, filename,
|
||||||
|
|||||||
Reference in New Issue
Block a user