Create dedicated image upload model

This commit is contained in:
2025-02-28 15:06:47 +01:00
parent 7b23196071
commit c236092c4f
9 changed files with 149 additions and 59 deletions

View File

@ -1,12 +1,7 @@
from io import BytesIO
from pathlib import Path
from typing import Annotated
from uuid import uuid4
import annotated_types
from django.conf import settings
from django.core.files.base import ContentFile
from django.db import transaction
from django.db.models import F
from django.http import HttpResponse
from ninja import Query, UploadedFile
@ -14,11 +9,11 @@ from ninja_extra import ControllerBase, api_controller, paginate, route
from ninja_extra.exceptions import PermissionDenied
from ninja_extra.pagination import PageNumberPaginationExtra
from ninja_extra.schemas import PaginatedResponseSchema
from PIL import Image, UnidentifiedImageError
from PIL import UnidentifiedImageError
from club.models import Mailing
from core.auth.api_permissions import CanAccessLookup, CanView, IsOldSubscriber
from core.models import Group, SithFile, User
from core.models import Group, QuickUploadImage, SithFile, User
from core.schemas import (
FamilyGodfatherSchema,
GroupSchema,
@ -49,47 +44,15 @@ class UploadController(ControllerBase):
message=f"{file.name} isn't a file image", status_code=415
)
def convert_image(file: UploadedFile) -> ContentFile:
content = BytesIO()
Image.open(BytesIO(file.read())).save(
fp=content, format="webp", optimize=True
)
return ContentFile(content.getvalue())
try:
converted = convert_image(file)
image = QuickUploadImage.create_from_uploaded(
file, uploader=self.context.request.user
)
except UnidentifiedImageError:
return self.create_response(
message=f"{file.name} can't be processed", status_code=415
)
with transaction.atomic():
parent = SithFile.objects.filter(parent=None, name="upload").first()
if parent is None:
root = User.objects.get(id=settings.SITH_ROOT_USER_ID)
parent = SithFile.objects.create(
parent=None,
name="upload",
owner=root,
)
image = SithFile(
parent=parent,
name=f"{Path(file.name).stem}_{uuid4()}.webp",
file=converted,
owner=self.context.request.user,
is_folder=False,
mime_type="img/webp",
size=converted.size,
moderator=self.context.request.user,
is_moderated=True,
)
image.file.name = image.name
image.clean()
image.save()
image.view_groups.add(
Group.objects.filter(id=settings.SITH_GROUP_PUBLIC_ID).first()
)
image.save()
return image