first commit
This commit is contained in:
67
image/views.py
Normal file
67
image/views.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from rest_framework.parsers import MultiPartParser, FormParser
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework import status
|
||||
from rest_framework.permissions import IsAdminUser, AllowAny
|
||||
from rest_framework import generics
|
||||
import os
|
||||
from django.conf import settings
|
||||
from django.http import FileResponse, Http404
|
||||
from .serializers import PostImageCreateSerializer, PostImagesSerializer
|
||||
from .models import PostImages # Make sure to import PostImages model
|
||||
|
||||
class ImageUploadView(APIView):
|
||||
parser_classes = (MultiPartParser, FormParser)
|
||||
permission_classes = (IsAdminUser,)
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
"""
|
||||
Accepts an image upload and processing parameters.
|
||||
Processes the image and saves it.
|
||||
"""
|
||||
serializer = PostImageCreateSerializer(data=request.data)
|
||||
if serializer.is_valid():
|
||||
instance = serializer.save(user=request.user)
|
||||
# Return the details of the created object using the representation serializer
|
||||
return Response(serializer.to_representation(instance), status=status.HTTP_201_CREATED)
|
||||
else:
|
||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class ImageDownloadView(APIView):
|
||||
"""
|
||||
API endpoint to download a processed image by its slug.
|
||||
"""
|
||||
def get(self, request, slug, *args, **kwargs):
|
||||
try:
|
||||
image_instance = PostImages.objects.get(slug=slug)
|
||||
except PostImages.DoesNotExist:
|
||||
raise Http404("Image not found.")
|
||||
|
||||
file_path = os.path.join(settings.MEDIA_ROOT, image_instance.path)
|
||||
|
||||
if not os.path.exists(file_path):
|
||||
raise Http404("File not found on server.")
|
||||
|
||||
# Determine content type based on format
|
||||
content_type_map = {
|
||||
'png': 'image/png',
|
||||
'webp': 'image/webp',
|
||||
'jpg': 'image/jpeg',
|
||||
'avif': 'image/avif',
|
||||
}
|
||||
content_type = content_type_map.get(image_instance.format.lower(), 'application/octet-stream')
|
||||
|
||||
# Prepare the filename for download
|
||||
filename = f"{image_instance.slug}.{image_instance.format.lower()}"
|
||||
|
||||
response = FileResponse(open(file_path, 'rb'), content_type=content_type)
|
||||
response['Content-Disposition'] = f'attachment; filename="{filename}"'
|
||||
return response
|
||||
|
||||
|
||||
class ImageListView(generics.ListAPIView):
|
||||
"""List all images."""
|
||||
queryset = PostImages.objects.all().order_by('-created_at')
|
||||
serializer_class = PostImagesSerializer
|
||||
permission_classes = (AllowAny,)
|
||||
Reference in New Issue
Block a user