|
|
|
|
@ -1,6 +1,9 @@ |
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
from . import ExtendedModelViewSet |
|
|
|
|
from .serializers import ( |
|
|
|
|
@ -9,10 +12,13 @@ from .serializers import ( |
|
|
|
|
ImageSerializer, TextSerializer, |
|
|
|
|
ImageTextSerializer, VideoSerializer, |
|
|
|
|
GallerySerializer, GalleryImageSerializer, |
|
|
|
|
UserSerializer, |
|
|
|
|
UserSerializer, UserPhotoSerializer, |
|
|
|
|
LessonSerializer, ContentImageSerializer, |
|
|
|
|
GalleryImageSerializer, CoverImageSerializer, |
|
|
|
|
) |
|
|
|
|
from .permissions import IsAdmin, IsAdminOrIsSelf, IsAuthorOrAdmin, IsAuthorObjectOrAdmin |
|
|
|
|
|
|
|
|
|
from apps.course.models import Category, Course, Material, Like |
|
|
|
|
from apps.course.models import Category, Course, Material, Lesson, Like |
|
|
|
|
from apps.content.models import ( |
|
|
|
|
Image, Text, ImageText, Video, |
|
|
|
|
Gallery, GalleryImage, |
|
|
|
|
@ -24,16 +30,25 @@ User = get_user_model() |
|
|
|
|
class MaterialViewSet(ExtendedModelViewSet): |
|
|
|
|
queryset = Material.objects.all() |
|
|
|
|
serializer_class = MaterialSerializer |
|
|
|
|
search_fields = ('title', 'short_description',) |
|
|
|
|
ordering_fields = ('title', 'created_at', 'update_at',) |
|
|
|
|
# permission_classes = (IsAdmin,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LikeViewSet(ExtendedModelViewSet): |
|
|
|
|
queryset = Like.objects.select_related('user').all() |
|
|
|
|
serializer_class = LikeSerializer |
|
|
|
|
search_fields = ('user__email', 'user__firstname', 'user__lastname',) |
|
|
|
|
ordering_fields = ('created_at', 'update_at',) |
|
|
|
|
# permission_classes = (IsAdmin,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CategoryViewSet(ExtendedModelViewSet): |
|
|
|
|
queryset = Category.objects.all() |
|
|
|
|
serializer_class = CategorySerializer |
|
|
|
|
search_fields = ('title',) |
|
|
|
|
ordering_fields = ('title',) |
|
|
|
|
# permission_classes = (IsAdmin,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CourseViewSet(ExtendedModelViewSet): |
|
|
|
|
@ -43,7 +58,57 @@ class CourseViewSet(ExtendedModelViewSet): |
|
|
|
|
'likes', 'materials' |
|
|
|
|
).all() |
|
|
|
|
serializer_class = CourseSerializer |
|
|
|
|
filter_fields = ('category',) |
|
|
|
|
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',) |
|
|
|
|
# permission_classes = (IsAuthorObjectOrAdmin,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# 'create': IsAuthorOrAdmin, |
|
|
|
|
# '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',) |
|
|
|
|
# permission_classes = (IsAuthorObjectOrAdmin,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# 'create': IsAuthorOrAdmin, |
|
|
|
|
# '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): |
|
|
|
|
@ -51,6 +116,27 @@ class ImageViewSet(ExtendedModelViewSet): |
|
|
|
|
'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,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# '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): |
|
|
|
|
@ -58,6 +144,12 @@ class TextViewSet(ExtendedModelViewSet): |
|
|
|
|
'course', 'lesson' |
|
|
|
|
).all() |
|
|
|
|
serializer_class = TextSerializer |
|
|
|
|
search_fields = ('title',) |
|
|
|
|
ordering_fields = ('title', 'created_at', 'update_at', 'position',) |
|
|
|
|
# permission_classes = (IsAuthorOrAdmin,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# 'delete': IsAdmin, |
|
|
|
|
# } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ImageTextViewSet(ExtendedModelViewSet): |
|
|
|
|
@ -65,6 +157,27 @@ 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,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# '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): |
|
|
|
|
@ -72,18 +185,76 @@ class VideoViewSet(ExtendedModelViewSet): |
|
|
|
|
'course', 'lesson' |
|
|
|
|
).all() |
|
|
|
|
serializer_class = VideoSerializer |
|
|
|
|
search_fields = ('title',) |
|
|
|
|
ordering_fields = ('title', 'created_at', 'update_at', 'position',) |
|
|
|
|
# permission_classes = (IsAuthorOrAdmin,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# 'delete': IsAdmin, |
|
|
|
|
# } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class GalleryViewSet(ExtendedModelViewSet): |
|
|
|
|
queryset = Gallery.objects.select_related('course').all() |
|
|
|
|
serializer_class = GallerySerializer |
|
|
|
|
search_fields = ('title',) |
|
|
|
|
ordering_fields = ('title', 'created_at', 'update_at',) |
|
|
|
|
# permission_classes = (IsAuthorOrAdmin,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# 'delete': IsAdmin, |
|
|
|
|
# } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
serializer_class = UserSerializer |
|
|
|
|
serializer_class_map = { |
|
|
|
|
'upload_photo': UserPhotoSerializer, |
|
|
|
|
} |
|
|
|
|
filter_fields = ('is_staff', 'is_active', 'role', |
|
|
|
|
'gender', 'is_email_proved', 'fb_id',) |
|
|
|
|
search_fields = ('email', 'first_name', 'last_name', |
|
|
|
|
'country', 'city', 'fb_id',) |
|
|
|
|
ordering_fields = ('email', 'first_name', 'last_name', |
|
|
|
|
'country', 'city', 'date_joined',) |
|
|
|
|
|
|
|
|
|
# permission_classes = (IsAdminOrIsSelf,) |
|
|
|
|
# permission_map = { |
|
|
|
|
# 'delete': IsAdmin, |
|
|
|
|
# } |
|
|
|
|
|
|
|
|
|
@detail_route(methods=['post'], url_path='upload-photo') |
|
|
|
|
def upload_photo(self, request, pk=None): |
|
|
|
|
user = self.get_object() |
|
|
|
|
serializer = self.get_serializer() |
|
|
|
|
serialized_data = serializer(data=request.data) |
|
|
|
|
if serialized_data.is_valid(): |
|
|
|
|
user.photo = serialized_data['photo'] |
|
|
|
|
user.save() |
|
|
|
|
return Response({'success': True}) |
|
|
|
|
else: |
|
|
|
|
return Response({'success': False}, status=status.HTTP_400_BAD_REQUEST) |
|
|
|
|
|