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.
160 lines
5.4 KiB
160 lines
5.4 KiB
from django.db.models import Q
|
|
from rest_framework import viewsets
|
|
from rest_framework.permissions import IsAuthenticated, IsAdminUser
|
|
from rest_framework.authentication import TokenAuthentication
|
|
from apps.course.models import (
|
|
Course,
|
|
CourseChapter,
|
|
CourseLesson,
|
|
CourseAttachment,
|
|
CourseGlossary
|
|
)
|
|
from apps.course.serializers.admin import (
|
|
AdminCourseListSerializer,
|
|
AdminCourseDetailSerializer,
|
|
AdminCourseChapterSerializer,
|
|
AdminCourseLessonSerializer,
|
|
AdminCourseAttachmentSerializer,
|
|
AdminCourseGlossarySerializer
|
|
)
|
|
|
|
class AdminCourseViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
Admin CRUD ViewSet for Course management.
|
|
"""
|
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
|
authentication_classes = [TokenAuthentication]
|
|
|
|
def get_serializer_class(self):
|
|
if self.action == 'list':
|
|
return AdminCourseListSerializer
|
|
return AdminCourseDetailSerializer
|
|
|
|
def get_queryset(self):
|
|
queryset = Course.objects.all().select_related('category', 'professor')
|
|
|
|
# Search Query
|
|
search_query = self.request.query_params.get('search', None)
|
|
if search_query:
|
|
queryset = queryset.filter(
|
|
Q(title__icontains=search_query) |
|
|
Q(description__icontains=search_query) |
|
|
Q(short_description__icontains=search_query)
|
|
)
|
|
|
|
# Filters
|
|
category_id = self.request.query_params.get('category', None)
|
|
if category_id:
|
|
queryset = queryset.filter(category_id=category_id)
|
|
|
|
level = self.request.query_params.get('level', None)
|
|
if level:
|
|
queryset = queryset.filter(level=level)
|
|
|
|
status_param = self.request.query_params.get('status', None)
|
|
if status_param:
|
|
queryset = queryset.filter(status=status_param)
|
|
|
|
is_free_param = self.request.query_params.get('is_free', None)
|
|
if is_free_param is not None:
|
|
if is_free_param.lower() == 'true':
|
|
queryset = queryset.filter(is_free=True)
|
|
elif is_free_param.lower() == 'false':
|
|
queryset = queryset.filter(is_free=False)
|
|
|
|
return queryset.order_by('-id')
|
|
|
|
|
|
class AdminChapterViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
Admin CRUD ViewSet for Course Chapters.
|
|
"""
|
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
|
authentication_classes = [TokenAuthentication]
|
|
serializer_class = AdminCourseChapterSerializer
|
|
pagination_class = None
|
|
|
|
def get_queryset(self):
|
|
queryset = CourseChapter.objects.all()
|
|
course_id = self.request.query_params.get('course', None)
|
|
if course_id:
|
|
queryset = queryset.filter(course_id=course_id)
|
|
return queryset.order_by('priority', 'id')
|
|
|
|
|
|
class AdminCourseLessonViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
Admin CRUD ViewSet for Lessons associated with a Course/Chapter.
|
|
"""
|
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
|
authentication_classes = [TokenAuthentication]
|
|
serializer_class = AdminCourseLessonSerializer
|
|
pagination_class = None
|
|
|
|
def get_queryset(self):
|
|
queryset = CourseLesson.objects.all().select_related('lesson', 'chapter')
|
|
|
|
course_id = self.request.query_params.get('course', None)
|
|
if course_id:
|
|
queryset = queryset.filter(course_id=course_id)
|
|
|
|
chapter_id = self.request.query_params.get('chapter', None)
|
|
if chapter_id:
|
|
queryset = queryset.filter(chapter_id=chapter_id)
|
|
|
|
return queryset.order_by('priority', 'id')
|
|
|
|
def perform_destroy(self, instance):
|
|
# Prevent orphans: delete the base Lesson object along with the junction model
|
|
lesson = instance.lesson
|
|
instance.delete()
|
|
if lesson:
|
|
lesson.delete()
|
|
|
|
|
|
class AdminCourseAttachmentViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
Admin CRUD ViewSet for Course Attachments.
|
|
"""
|
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
|
authentication_classes = [TokenAuthentication]
|
|
serializer_class = AdminCourseAttachmentSerializer
|
|
pagination_class = None
|
|
|
|
def get_queryset(self):
|
|
queryset = CourseAttachment.objects.all().select_related('attachment')
|
|
course_id = self.request.query_params.get('course', None)
|
|
if course_id:
|
|
queryset = queryset.filter(course_id=course_id)
|
|
return queryset.order_by('-id')
|
|
|
|
def perform_destroy(self, instance):
|
|
# Prevent orphans: delete base Attachment along with junction model
|
|
attachment = instance.attachment
|
|
instance.delete()
|
|
if attachment:
|
|
attachment.delete()
|
|
|
|
|
|
class AdminCourseGlossaryViewSet(viewsets.ModelViewSet):
|
|
"""
|
|
Admin CRUD ViewSet for Course Glossary terms.
|
|
"""
|
|
permission_classes = [IsAuthenticated, IsAdminUser]
|
|
authentication_classes = [TokenAuthentication]
|
|
serializer_class = AdminCourseGlossarySerializer
|
|
pagination_class = None
|
|
|
|
def get_queryset(self):
|
|
queryset = CourseGlossary.objects.all().select_related('glossary')
|
|
course_id = self.request.query_params.get('course', None)
|
|
if course_id:
|
|
queryset = queryset.filter(course_id=course_id)
|
|
return queryset.order_by('-id')
|
|
|
|
def perform_destroy(self, instance):
|
|
# Prevent orphans: delete base Glossary along with junction model
|
|
glossary = instance.glossary
|
|
instance.delete()
|
|
if glossary:
|
|
glossary.delete()
|