mirror of
https://github.com/ae-utbm/sith.git
synced 2025-07-11 04:19:25 +00:00
Create dedicated image upload model
This commit is contained in:
47
core/api.py
47
core/api.py
@ -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
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user