You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
269 lines
9.2 KiB
269 lines
9.2 KiB
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 (
|
|
CategorySerializer, CourseSerializer,
|
|
MaterialSerializer, LikeSerializer,
|
|
ImageSerializer, TextSerializer,
|
|
ImageTextSerializer, VideoSerializer,
|
|
GallerySerializer, GalleryImageSerializer,
|
|
UserSerializer, UserPhotoSerializer,
|
|
LessonSerializer, ContentImageSerializer,
|
|
GalleryImageSerializer, CoverImageSerializer,
|
|
CourseRetrieveSerializer, ImageObjectSerializer,
|
|
)
|
|
from .permissions import IsAdmin, IsAdminOrIsSelf, IsAuthorOrAdmin, IsAuthorObjectOrAdmin
|
|
|
|
from apps.course.models import Category, Course, Material, Lesson, Like
|
|
from apps.content.models import (
|
|
Image, Text, ImageText, Video,
|
|
Gallery, GalleryImage, ImageObject,
|
|
)
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class ImageObjectViewSet(ExtendedModelViewSet):
|
|
queryset = ImageObject.objects.all()
|
|
serializer_class = ImageObjectSerializer
|
|
# permission_classes = (IsAuthorOrAdmin,)
|
|
|
|
|
|
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):
|
|
queryset = Course.objects.select_related(
|
|
'author', 'category'
|
|
).prefetch_related(
|
|
'likes', 'materials', 'content',
|
|
).all()
|
|
serializer_class = CourseSerializer
|
|
serializer_class_map = {
|
|
'list': CourseRetrieveSerializer,
|
|
'retrieve': CourseRetrieveSerializer,
|
|
'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):
|
|
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,)
|
|
# 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):
|
|
queryset = Text.objects.select_related(
|
|
'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):
|
|
queryset = ImageText.objects.select_related(
|
|
'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):
|
|
queryset = Video.objects.select_related(
|
|
'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)
|
|
|