|
|
@ -1,10 +1,12 @@ |
|
|
from django.db.models import Q |
|
|
from django.db.models import Q |
|
|
from rest_framework import viewsets |
|
|
from rest_framework import viewsets |
|
|
from rest_framework.permissions import IsAuthenticated, IsAdminUser |
|
|
|
|
|
|
|
|
from rest_framework.permissions import IsAuthenticated |
|
|
from rest_framework.authentication import TokenAuthentication |
|
|
from rest_framework.authentication import TokenAuthentication |
|
|
from rest_framework.decorators import action |
|
|
from rest_framework.decorators import action |
|
|
from rest_framework.response import Response |
|
|
from rest_framework.response import Response |
|
|
|
|
|
from rest_framework.exceptions import PermissionDenied |
|
|
from utils.pagination import StandardResultsSetPagination |
|
|
from utils.pagination import StandardResultsSetPagination |
|
|
|
|
|
from apps.account.permissions import IsPanelUser, IsSuperAdminOrReadOnlyForProfessor |
|
|
from apps.course.models import ( |
|
|
from apps.course.models import ( |
|
|
Course, |
|
|
Course, |
|
|
CourseCategory, |
|
|
CourseCategory, |
|
|
@ -34,11 +36,17 @@ from apps.course.serializers.admin import ( |
|
|
AdminLiveSessionDetailSerializer |
|
|
AdminLiveSessionDetailSerializer |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_professor(request): |
|
|
|
|
|
return getattr(request.user, 'user_type', None) == 'professor' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdminCourseViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Course management. |
|
|
Admin CRUD ViewSet for Course management. |
|
|
|
|
|
Professors can only access/modify their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
pagination_class = StandardResultsSetPagination |
|
|
pagination_class = StandardResultsSetPagination |
|
|
|
|
|
|
|
|
@ -50,6 +58,10 @@ class AdminCourseViewSet(viewsets.ModelViewSet): |
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = Course.objects.all().select_related('category', 'professor') |
|
|
queryset = Course.objects.all().select_related('category', 'professor') |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter(professor_id=self.request.user.id) |
|
|
|
|
|
|
|
|
# Search Query |
|
|
# Search Query |
|
|
search_query = self.request.query_params.get('search', None) |
|
|
search_query = self.request.query_params.get('search', None) |
|
|
if search_query: |
|
|
if search_query: |
|
|
@ -81,18 +93,41 @@ class AdminCourseViewSet(viewsets.ModelViewSet): |
|
|
|
|
|
|
|
|
return queryset.order_by('-id') |
|
|
return queryset.order_by('-id') |
|
|
|
|
|
|
|
|
|
|
|
def perform_create(self, serializer): |
|
|
|
|
|
# If the logged-in user is a professor, force the professor field to themselves |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
serializer.save(professor_id=self.request.user.id) |
|
|
|
|
|
else: |
|
|
|
|
|
serializer.save() |
|
|
|
|
|
|
|
|
|
|
|
def perform_update(self, serializer): |
|
|
|
|
|
# Prevent professors from reassigning a course to another professor |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
instance = self.get_object() |
|
|
|
|
|
if instance.professor_id != self.request.user.id: |
|
|
|
|
|
raise PermissionDenied("You can only edit your own courses.") |
|
|
|
|
|
serializer.save(professor_id=self.request.user.id) |
|
|
|
|
|
else: |
|
|
|
|
|
serializer.save() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdminChapterViewSet(viewsets.ModelViewSet): |
|
|
class AdminChapterViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Course Chapters. |
|
|
Admin CRUD ViewSet for Course Chapters. |
|
|
|
|
|
Professors can only access chapters of their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminCourseChapterSerializer |
|
|
serializer_class = AdminCourseChapterSerializer |
|
|
pagination_class = None |
|
|
pagination_class = None |
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = CourseChapter.objects.all() |
|
|
queryset = CourseChapter.objects.all() |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see chapters of their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter(course__professor_id=self.request.user.id) |
|
|
|
|
|
|
|
|
course_id = self.request.query_params.get('course', None) |
|
|
course_id = self.request.query_params.get('course', None) |
|
|
if course_id: |
|
|
if course_id: |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
@ -119,15 +154,20 @@ class AdminChapterViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseLessonViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseLessonViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Lessons associated with a Course/Chapter. |
|
|
Admin CRUD ViewSet for Lessons associated with a Course/Chapter. |
|
|
|
|
|
Professors can only access lessons in their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminCourseLessonSerializer |
|
|
serializer_class = AdminCourseLessonSerializer |
|
|
pagination_class = None |
|
|
pagination_class = None |
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = CourseLesson.objects.all().select_related('lesson', 'chapter') |
|
|
queryset = CourseLesson.objects.all().select_related('lesson', 'chapter') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see lessons of their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter(course__professor_id=self.request.user.id) |
|
|
|
|
|
|
|
|
course_id = self.request.query_params.get('course', None) |
|
|
course_id = self.request.query_params.get('course', None) |
|
|
if course_id: |
|
|
if course_id: |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
@ -166,14 +206,20 @@ class AdminCourseLessonViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseAttachmentViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseAttachmentViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Course Attachments. |
|
|
Admin CRUD ViewSet for Course Attachments. |
|
|
|
|
|
Professors can only access attachments of their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminCourseAttachmentSerializer |
|
|
serializer_class = AdminCourseAttachmentSerializer |
|
|
pagination_class = None |
|
|
pagination_class = None |
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = CourseAttachment.objects.all().select_related('attachment') |
|
|
queryset = CourseAttachment.objects.all().select_related('attachment') |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see attachments of their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter(course__professor_id=self.request.user.id) |
|
|
|
|
|
|
|
|
course_id = self.request.query_params.get('course', None) |
|
|
course_id = self.request.query_params.get('course', None) |
|
|
if course_id: |
|
|
if course_id: |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
@ -190,14 +236,20 @@ class AdminCourseAttachmentViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseGlossaryViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseGlossaryViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Course Glossary terms. |
|
|
Admin CRUD ViewSet for Course Glossary terms. |
|
|
|
|
|
Professors can only access glossaries of their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminCourseGlossarySerializer |
|
|
serializer_class = AdminCourseGlossarySerializer |
|
|
pagination_class = None |
|
|
pagination_class = None |
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = CourseGlossary.objects.all().select_related('glossary') |
|
|
queryset = CourseGlossary.objects.all().select_related('glossary') |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see glossaries of their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter(course__professor_id=self.request.user.id) |
|
|
|
|
|
|
|
|
course_id = self.request.query_params.get('course', None) |
|
|
course_id = self.request.query_params.get('course', None) |
|
|
if course_id: |
|
|
if course_id: |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
queryset = queryset.filter(course_id=course_id) |
|
|
@ -214,12 +266,13 @@ class AdminCourseGlossaryViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseCategoryViewSet(viewsets.ModelViewSet): |
|
|
class AdminCourseCategoryViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Course Categories. |
|
|
Admin CRUD ViewSet for Course Categories. |
|
|
|
|
|
Professors have read-only access. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsSuperAdminOrReadOnlyForProfessor] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminCourseCategorySerializer |
|
|
serializer_class = AdminCourseCategorySerializer |
|
|
pagination_class = StandardResultsSetPagination |
|
|
pagination_class = StandardResultsSetPagination |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = CourseCategory.objects.all().order_by('-id') |
|
|
queryset = CourseCategory.objects.all().order_by('-id') |
|
|
search = self.request.query_params.get('search', None) |
|
|
search = self.request.query_params.get('search', None) |
|
|
@ -230,37 +283,53 @@ class AdminCourseCategoryViewSet(viewsets.ModelViewSet): |
|
|
|
|
|
|
|
|
class AdminLessonViewSet(viewsets.ModelViewSet): |
|
|
class AdminLessonViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for base Lesson. |
|
|
|
|
|
|
|
|
Admin CRUD ViewSet for base Lesson (Repository). |
|
|
|
|
|
Professors can only see lessons linked to their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminLessonSerializer |
|
|
serializer_class = AdminLessonSerializer |
|
|
pagination_class = StandardResultsSetPagination |
|
|
pagination_class = StandardResultsSetPagination |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = Lesson.objects.all().order_by('-id') |
|
|
queryset = Lesson.objects.all().order_by('-id') |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see lessons associated with their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter( |
|
|
|
|
|
course_lessons__course__professor_id=self.request.user.id |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
search = self.request.query_params.get('search', None) |
|
|
search = self.request.query_params.get('search', None) |
|
|
if search: |
|
|
if search: |
|
|
queryset = queryset.filter(title__icontains=search) |
|
|
queryset = queryset.filter(title__icontains=search) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
content_type = self.request.query_params.get('content_type', None) |
|
|
content_type = self.request.query_params.get('content_type', None) |
|
|
if content_type: |
|
|
if content_type: |
|
|
queryset = queryset.filter(content_type=content_type) |
|
|
queryset = queryset.filter(content_type=content_type) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return queryset |
|
|
return queryset |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AdminGlossaryViewSet(viewsets.ModelViewSet): |
|
|
class AdminGlossaryViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for base Glossary. |
|
|
|
|
|
|
|
|
Admin CRUD ViewSet for base Glossary (Repository). |
|
|
|
|
|
Professors can only see glossaries linked to their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminGlossarySerializer |
|
|
serializer_class = AdminGlossarySerializer |
|
|
pagination_class = StandardResultsSetPagination |
|
|
pagination_class = StandardResultsSetPagination |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = Glossary.objects.all().order_by('-id') |
|
|
queryset = Glossary.objects.all().order_by('-id') |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see glossaries associated with their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter( |
|
|
|
|
|
course_glossaries__course__professor_id=self.request.user.id |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
search = self.request.query_params.get('search', None) |
|
|
search = self.request.query_params.get('search', None) |
|
|
if search: |
|
|
if search: |
|
|
queryset = queryset.filter(Q(title__icontains=search) | Q(description__icontains=search)) |
|
|
queryset = queryset.filter(Q(title__icontains=search) | Q(description__icontains=search)) |
|
|
@ -269,15 +338,23 @@ class AdminGlossaryViewSet(viewsets.ModelViewSet): |
|
|
|
|
|
|
|
|
class AdminAttachmentViewSet(viewsets.ModelViewSet): |
|
|
class AdminAttachmentViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for base Attachment. |
|
|
|
|
|
|
|
|
Admin CRUD ViewSet for base Attachment (Repository). |
|
|
|
|
|
Professors can only see attachments linked to their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
serializer_class = AdminAttachmentSerializer |
|
|
serializer_class = AdminAttachmentSerializer |
|
|
pagination_class = StandardResultsSetPagination |
|
|
pagination_class = StandardResultsSetPagination |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = Attachment.objects.all().order_by('-id') |
|
|
queryset = Attachment.objects.all().order_by('-id') |
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see attachments associated with their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter( |
|
|
|
|
|
course_attachments__course__professor_id=self.request.user.id |
|
|
|
|
|
).distinct() |
|
|
|
|
|
|
|
|
search = self.request.query_params.get('search', None) |
|
|
search = self.request.query_params.get('search', None) |
|
|
if search: |
|
|
if search: |
|
|
queryset = queryset.filter(title__icontains=search) |
|
|
queryset = queryset.filter(title__icontains=search) |
|
|
@ -287,8 +364,9 @@ class AdminAttachmentViewSet(viewsets.ModelViewSet): |
|
|
class AdminLiveSessionViewSet(viewsets.ModelViewSet): |
|
|
class AdminLiveSessionViewSet(viewsets.ModelViewSet): |
|
|
""" |
|
|
""" |
|
|
Admin CRUD ViewSet for Course Live Sessions. |
|
|
Admin CRUD ViewSet for Course Live Sessions. |
|
|
|
|
|
Professors can only access live sessions of their own courses. |
|
|
""" |
|
|
""" |
|
|
permission_classes = [IsAuthenticated, IsAdminUser] |
|
|
|
|
|
|
|
|
permission_classes = [IsAuthenticated, IsPanelUser] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
authentication_classes = [TokenAuthentication] |
|
|
pagination_class = StandardResultsSetPagination |
|
|
pagination_class = StandardResultsSetPagination |
|
|
|
|
|
|
|
|
@ -299,7 +377,11 @@ class AdminLiveSessionViewSet(viewsets.ModelViewSet): |
|
|
|
|
|
|
|
|
def get_queryset(self): |
|
|
def get_queryset(self): |
|
|
queryset = CourseLiveSession.objects.all().select_related('course') |
|
|
queryset = CourseLiveSession.objects.all().select_related('course') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Professors can only see live sessions of their own courses |
|
|
|
|
|
if is_professor(self.request): |
|
|
|
|
|
queryset = queryset.filter(course__professor_id=self.request.user.id) |
|
|
|
|
|
|
|
|
search = self.request.query_params.get('search', None) |
|
|
search = self.request.query_params.get('search', None) |
|
|
if search: |
|
|
if search: |
|
|
queryset = queryset.filter( |
|
|
queryset = queryset.filter( |
|
|
@ -329,4 +411,3 @@ class AdminLiveSessionViewSet(viewsets.ModelViewSet): |
|
|
queryset = queryset.filter(ended_at__lte=ended_before) |
|
|
queryset = queryset.filter(ended_at__lte=ended_before) |
|
|
|
|
|
|
|
|
return queryset.order_by('-started_at') |
|
|
return queryset.order_by('-started_at') |
|
|
|
|
|
|