From 9ebacfcb0fc99b0383192b599bbac756d012eec8 Mon Sep 17 00:00:00 2001 From: Ivlev Denis Date: Tue, 6 Feb 2018 14:10:32 +0300 Subject: [PATCH] LIL-216. Add upload image endpoints and viewsets. --- api/v1/serializers.py | 18 ++++++++++ api/v1/views.py | 81 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/api/v1/serializers.py b/api/v1/serializers.py index 9bf48ad6..8ff6f44a 100644 --- a/api/v1/serializers.py +++ b/api/v1/serializers.py @@ -284,7 +284,25 @@ class UserSerializer(serializers.ModelSerializer): ) +class CoverImageSerializer(serializers.Serializer): + cover = Base64ImageField( + required=False, allow_empty_file=True, allow_null=True + ) + + class UserPhotoSerializer(serializers.Serializer): photo = Base64ImageField( required=False, allow_empty_file=True, allow_null=True ) + + +class ContentImageSerializer(serializers.Serializer): + img = Base64ImageField( + required=False, allow_empty_file=True, allow_null=True + ) + + +class GalleryImageSerializer(serializers.Serializer): + image = Base64ImageField( + required=False, allow_empty_file=True, allow_null=True + ) diff --git a/api/v1/views.py b/api/v1/views.py index 5dd298bc..744e7b13 100644 --- a/api/v1/views.py +++ b/api/v1/views.py @@ -1,5 +1,6 @@ from django.contrib.auth import get_user_model +from rest_framework import status from rest_framework import viewsets from rest_framework.decorators import detail_route, list_route from rest_framework.response import Response @@ -12,7 +13,8 @@ from .serializers import ( ImageTextSerializer, VideoSerializer, GallerySerializer, GalleryImageSerializer, UserSerializer, UserPhotoSerializer, - LessonSerializer, + LessonSerializer, ContentImageSerializer, + GalleryImageSerializer, CoverImageSerializer, ) from .permissions import IsAdmin, IsAdminOrIsSelf, IsAuthorOrAdmin, IsAuthorObjectOrAdmin @@ -56,6 +58,9 @@ class CourseViewSet(ExtendedModelViewSet): 'likes', 'materials' ).all() serializer_class = CourseSerializer + serializer_class_map = { + 'upload_photo': CoverImageSerializer, + } filter_fields = ('category', 'status', 'is_infinite', 'is_featured',) search_fields = ('author__email', 'title', 'category__title',) ordering_fields = ('title', 'created_at', 'update_at',) @@ -65,10 +70,25 @@ class CourseViewSet(ExtendedModelViewSet): # 'delete': IsAdmin, # } + @detail_route(methods=['post'], url_path='upload-photo') + def upload_photo(self, request, pk=None): + course = self.get_object() + serializer = self.get_serializer() + serialized_data = serializer(data=request.data) + if serialized_data.is_valid(): + course.cover = serialized_data['cover'] + course.save() + return Response({'success': True}) + else: + return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) + class LessonViewSet(ExtendedModelViewSet): queryset = Lesson.objects.select_related('course').all() serializer_class = LessonSerializer + serializer_class_map = { + 'upload_photo': CoverImageSerializer, + } filter_fields = ('course',) search_fields = ('title', 'short_description',) ordering_fields = ('title', 'created_at', 'update_at',) @@ -78,12 +98,27 @@ class LessonViewSet(ExtendedModelViewSet): # 'delete': IsAdmin, # } + @detail_route(methods=['post'], url_path='upload-photo') + def upload_photo(self, request, pk=None): + lesson = self.get_object() + serializer = self.get_serializer() + serialized_data = serializer(data=request.data) + if serialized_data.is_valid(): + lesson.cover = serialized_data['cover'] + lesson.save() + return Response({'success': True}) + else: + return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) + class ImageViewSet(ExtendedModelViewSet): queryset = Image.objects.select_related( 'course', 'lesson' ).all() serializer_class = ImageSerializer + serializer_class_map = { + 'upload_photo': ContentImageSerializer, + } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) @@ -91,6 +126,18 @@ class ImageViewSet(ExtendedModelViewSet): # 'delete': IsAdmin, # } + @detail_route(methods=['post'], url_path='upload-photo') + def upload_photo(self, request, pk=None): + image = self.get_object() + serializer = self.get_serializer() + serialized_data = serializer(data=request.data) + if serialized_data.is_valid(): + image.img = serialized_data['img'] + image.save() + return Response({'success': True}) + else: + return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) + class TextViewSet(ExtendedModelViewSet): queryset = Text.objects.select_related( @@ -110,6 +157,9 @@ class ImageTextViewSet(ExtendedModelViewSet): 'course', 'lesson' ).all() serializer_class = ImageTextSerializer + serializer_class_map = { + 'upload_photo': ContentImageSerializer, + } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) @@ -117,6 +167,18 @@ class ImageTextViewSet(ExtendedModelViewSet): # 'delete': IsAdmin, # } + @detail_route(methods=['post'], url_path='upload-photo') + def upload_photo(self, request, pk=None): + image_text = self.get_object() + serializer = self.get_serializer() + serialized_data = serializer(data=request.data) + if serialized_data.is_valid(): + image_text.img = serialized_data['img'] + image_text.save() + return Response({'success': True}) + else: + return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) + class VideoViewSet(ExtendedModelViewSet): queryset = Video.objects.select_related( @@ -145,12 +207,27 @@ class GalleryViewSet(ExtendedModelViewSet): class GalleryImageViewSet(ExtendedModelViewSet): queryset = GalleryImage.objects.select_related('gallery').all() serializer_class = GalleryImageSerializer + serializer_class_map = { + 'upload_photo': GalleryImageSerializer, + } search_fields = ('gallery__title',) # permission_classes = (IsAuthorOrAdmin,) # permission_map = { # 'delete': IsAdmin, # } + @detail_route(methods=['post'], url_path='upload-photo') + def upload_photo(self, request, pk=None): + gallery_image = self.get_object() + serializer = self.get_serializer() + serialized_data = serializer(data=request.data) + if serialized_data.is_valid(): + gallery_image.image = serialized_data['image'] + gallery_image.save() + return Response({'success': True}) + else: + return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) + class UserViewSet(ExtendedModelViewSet): queryset = User.objects.all() @@ -180,4 +257,4 @@ class UserViewSet(ExtendedModelViewSet): user.save() return Response({'success': True}) else: - return Response({'success': False}) + return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST)