65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
import uuid
|
|
|
|
from django.shortcuts import get_object_or_404
|
|
from rest_framework import status
|
|
from rest_framework.parsers import MultiPartParser
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from .models import ContentBlock
|
|
from .serializers import ContentBlockSerializer, MediaAssetSerializer
|
|
from .upload import UploadValidationError, save_upload, validate_upload
|
|
|
|
|
|
class MediaUploadView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
parser_classes = [MultiPartParser]
|
|
|
|
def post(self, request):
|
|
file = request.FILES.get("file")
|
|
if not file:
|
|
return Response({"detail": "No file provided."}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
org_id = request.data.get("org_id") or str(uuid.uuid4())
|
|
try:
|
|
validate_upload(file)
|
|
except UploadValidationError as exc:
|
|
return Response({"detail": str(exc)}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
asset = save_upload(file, org_id=org_id, uploader=request.user)
|
|
return Response(MediaAssetSerializer(asset).data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class PageContentBlocksView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get(self, request, page_id):
|
|
blocks = ContentBlock.objects.filter(page_id=page_id).select_related("media_asset")
|
|
return Response(ContentBlockSerializer(blocks, many=True).data)
|
|
|
|
def post(self, request, page_id):
|
|
from courses.models import Page
|
|
get_object_or_404(Page, pk=page_id)
|
|
data = {**request.data, "page": page_id}
|
|
serializer = ContentBlockSerializer(data=data)
|
|
serializer.is_valid(raise_exception=True)
|
|
block = serializer.save(page_id=page_id)
|
|
return Response(ContentBlockSerializer(block).data, status=status.HTTP_201_CREATED)
|
|
|
|
|
|
class ContentBlockDetailView(APIView):
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def patch(self, request, block_id):
|
|
block = get_object_or_404(ContentBlock, pk=block_id)
|
|
serializer = ContentBlockSerializer(block, data=request.data, partial=True)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return Response(ContentBlockSerializer(block).data)
|
|
|
|
def delete(self, request, block_id):
|
|
block = get_object_or_404(ContentBlock, pk=block_id)
|
|
block.delete()
|
|
return Response(status=status.HTTP_204_NO_CONTENT)
|