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

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()