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.course import ( CategorySerializer, LikeSerializer, CourseSerializer, CourseCreateSerializer, MaterialSerializer, MaterialCreateSerializer, LessonSerializer, LessonCreateSerializer, ) from .serializers.content import ( ImageSerializer, ImageCreateSerializer, TextSerializer, TextCreateSerializer, ImageTextSerializer, ImageTextCreateSerializer, VideoSerializer, VideoCreateSerializer, GallerySerializer, GalleryImageSerializer, GalleryImageCreateSerializer, ImageObjectSerializer, ) from .serializers.user import ( UserSerializer, UserPhotoSerializer, ) 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 = MaterialCreateSerializer serializer_class_map = { 'list': MaterialSerializer, 'retrieve': 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', 'cover', 'gallery', ).prefetch_related( 'likes', 'materials', 'content', ).all() serializer_class = CourseCreateSerializer serializer_class_map = { 'list': CourseSerializer, 'retrieve': CourseSerializer, } 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, # } class LessonViewSet(ExtendedModelViewSet): queryset = Lesson.objects.select_related( 'course', 'cover' ).prefetch_related('content').all() serializer_class = LessonCreateSerializer serializer_class_map = { 'list': LessonSerializer, 'retrieve': LessonSerializer, } filter_fields = ('course',) search_fields = ('title', 'short_description',) ordering_fields = ('title', 'created_at', 'update_at',) # permission_classes = (IsAuthorObjectOrAdmin,) # permission_map = { # 'create': IsAuthorOrAdmin, # 'delete': IsAdmin, # } class ImageViewSet(ExtendedModelViewSet): queryset = Image.objects.select_related( 'course', 'lesson', 'img', ).all() serializer_class = ImageCreateSerializer serializer_class_map = { 'list': ImageSerializer, 'retrieve': ImageSerializer, } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) # permission_map = { # 'delete': IsAdmin, # } class TextViewSet(ExtendedModelViewSet): queryset = Text.objects.select_related( 'course', 'lesson' ).all() serializer_class = TextCreateSerializer serializer_class_map = { 'list': TextSerializer, 'retrieve': 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', 'img' ).all() serializer_class = ImageTextCreateSerializer serializer_class_map = { 'list': ImageTextSerializer, 'retrieve': ImageTextSerializer, } search_fields = ('title',) ordering_fields = ('title', 'created_at', 'update_at', 'position',) # permission_classes = (IsAuthorOrAdmin,) # permission_map = { # 'delete': IsAdmin, # } class VideoViewSet(ExtendedModelViewSet): queryset = Video.objects.select_related( 'course', 'lesson' ).all() serializer_class = VideoCreateSerializer serializer_class_map = { 'list': VideoSerializer, 'retrieve': 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.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', 'img', ).all() serializer_class = GalleryImageCreateSerializer search_fields = ('gallery__title',) serializer_class_map = { 'list': GalleryImageSerializer, 'retrieve': GalleryImageSerializer, } # permission_classes = (IsAuthorOrAdmin,) # permission_map = { # 'delete': IsAdmin, # } 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, # } @list_route(methods=['get']) def me(self, request): serializer = self.get_serializer_class() serialized_data = serializer(instance=request.user) return Response(serialized_data.data) @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)