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.
381 lines
12 KiB
381 lines
12 KiB
from django.contrib.auth import get_user_model
|
|
|
|
from rest_framework import status, views, viewsets, generics
|
|
from rest_framework.decorators import detail_route, list_route
|
|
from rest_framework.response import Response
|
|
|
|
from . import ExtendedModelViewSet
|
|
|
|
from .serializers.config import ConfigSerializer
|
|
from .serializers.course import (
|
|
CategorySerializer, LikeSerializer,
|
|
CourseSerializer, CourseCreateSerializer,
|
|
CourseBulkChangeCategorySerializer,
|
|
CommentSerializer,
|
|
MaterialSerializer, MaterialCreateSerializer,
|
|
LessonSerializer, LessonCreateSerializer,
|
|
)
|
|
from .serializers.content import (
|
|
ImageSerializer, ImageCreateSerializer,
|
|
TextSerializer, TextCreateSerializer,
|
|
ImageTextSerializer, ImageTextCreateSerializer,
|
|
VideoSerializer, VideoCreateSerializer,
|
|
GallerySerializer,
|
|
GalleryImageSerializer, GalleryImageCreateSerializer,
|
|
ImageObjectSerializer,
|
|
)
|
|
from .serializers.school import (
|
|
SchoolScheduleSerializer,
|
|
LiveLessonCreateSerializer,
|
|
LiveLessonSerializer,
|
|
)
|
|
from .serializers.payment import AuthorBalanceSerializer, AuthorBalanceCreateSerializer
|
|
from .serializers.user import (
|
|
AuthorRequestSerializer,
|
|
UserSerializer, UserPhotoSerializer,
|
|
)
|
|
|
|
from .permissions import (
|
|
IsAdmin, IsAdminOrIsSelf,
|
|
IsAuthorOrAdmin, IsAuthorObjectOrAdmin,
|
|
IsTeacherOrAdmin,
|
|
)
|
|
|
|
from apps.course.models import (
|
|
Category, Course,
|
|
Comment, CourseComment, LessonComment,
|
|
Material, Lesson,
|
|
Like,
|
|
)
|
|
from apps.config.models import Config
|
|
from apps.content.models import (
|
|
Image, Text, ImageText, Video,
|
|
Gallery, GalleryImage, ImageObject,
|
|
)
|
|
from apps.payment.models import AuthorBalance
|
|
from apps.school.models import SchoolSchedule, LiveLesson
|
|
from apps.user.models import AuthorRequest
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class AuthorBalanceViewSet(ExtendedModelViewSet):
|
|
queryset = AuthorBalance.objects.filter(
|
|
author__role__in=[User.AUTHOR_ROLE, User.ADMIN_ROLE],
|
|
)
|
|
serializer_class = AuthorBalanceCreateSerializer
|
|
serializer_class_map = {
|
|
'list': AuthorBalanceSerializer,
|
|
}
|
|
permission_classes = (IsAdmin,)
|
|
filter_fields = ('author', 'status', 'type')
|
|
search_fields = (
|
|
'author__email',
|
|
'author__first_name',
|
|
'author__last_name',
|
|
)
|
|
|
|
|
|
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.order_by('-id')
|
|
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,
|
|
'draft': CourseSerializer,
|
|
'change_category_bulk': CourseBulkChangeCategorySerializer,
|
|
}
|
|
filter_fields = ('category', 'status', 'is_infinite', 'is_featured',)
|
|
search_fields = ('author__email', 'title', 'category__title',)
|
|
ordering_fields = ('id', 'title', 'created_at', 'update_at',)
|
|
# permission_classes = (IsAuthorObjectOrAdmin,)
|
|
# permission_map = {
|
|
# 'create': IsAuthorOrAdmin,
|
|
# 'delete': IsAdmin,
|
|
# }
|
|
|
|
@list_route(methods=['get'])
|
|
def draft(self, request):
|
|
drafts = Course.objects.filter(author=request.user, status=Course.DRAFT)
|
|
serializer = self.get_serializer_class()
|
|
serialized_data = serializer(instance=drafts.last())
|
|
return Response(serialized_data.data)
|
|
|
|
@list_route(methods=['patch'], url_path='change-category-bulk')
|
|
def change_category_bulk(self, request):
|
|
serializer_class = self.get_serializer_class()
|
|
serializer = serializer_class(data=request.data)
|
|
if serializer.is_valid():
|
|
old_category_id = serializer.validated_data['old_category']
|
|
new_category_id = serializer.validated_data['new_category']
|
|
try:
|
|
old_category = Category.objects.get(id=old_category_id)
|
|
except Category.DoesNotExist:
|
|
return Response(
|
|
{'success': False, 'detail': f'Category with id {old_category_id} not found'},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
try:
|
|
new_category = Category.objects.get(id=new_category_id)
|
|
except Category.DoesNotExist:
|
|
return Response(
|
|
{'success': False, 'detail': f'Category with id {new_category_id} not found'},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
c = Course.objects.filter(
|
|
category=old_category,
|
|
).update(
|
|
category=new_category
|
|
)
|
|
return Response({'success': True})
|
|
else:
|
|
return Response(
|
|
{'success': False},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
|
|
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 LiveLessonViewSet(ExtendedModelViewSet):
|
|
queryset = LiveLesson.objects.prefetch_related('content').all()
|
|
serializer_class = LiveLessonCreateSerializer
|
|
serializer_class_map = {
|
|
'list': LiveLessonSerializer,
|
|
'retrieve': LiveLessonSerializer,
|
|
}
|
|
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)
|
|
|
|
|
|
class SchoolScheduleViewSet(ExtendedModelViewSet):
|
|
queryset = SchoolSchedule.objects.all()
|
|
serializer_class = SchoolScheduleSerializer
|
|
permission_classes = (IsTeacherOrAdmin,)
|
|
|
|
|
|
class ConfigViewSet(generics.RetrieveUpdateAPIView):
|
|
queryset = Config.objects.all()
|
|
serializer_class = ConfigSerializer
|
|
permission_classes = (IsAdmin,)
|
|
|
|
def get_object(self):
|
|
return Config.load()
|
|
|
|
|
|
class CommentViewSet(ExtendedModelViewSet):
|
|
queryset = Comment.objects.filter(level=0)
|
|
serializer_class = CommentSerializer
|
|
permission_classes = (IsAdmin,)
|
|
|
|
def get_queryset(self):
|
|
queryset = self.queryset
|
|
is_deactivated = self.request.query_params.get('is_deactivated', '0')
|
|
if is_deactivated == '0':
|
|
queryset = queryset
|
|
elif is_deactivated == '1':
|
|
queryset = queryset.filter(deactivated_at__isnull=True)
|
|
elif is_deactivated == '2':
|
|
queryset = queryset.filter(deactivated_at__isnull=False)
|
|
|
|
return queryset
|
|
|
|
|
|
class AuthorRequestViewSet(ExtendedModelViewSet):
|
|
queryset = AuthorRequest.objects.all()
|
|
serializer_class = AuthorRequestSerializer
|
|
permission_classes = (IsAdmin,)
|
|
filter_fields = ('status',)
|
|
|