diff --git a/apps/course/serializers/admin.py b/apps/course/serializers/admin.py index 59d9e37..0352452 100644 --- a/apps/course/serializers/admin.py +++ b/apps/course/serializers/admin.py @@ -13,6 +13,22 @@ from apps.course.models import ( ) from apps.account.models import ProfessorUser +class AdminLessonSerializer(serializers.ModelSerializer): + class Meta: + model = Lesson + fields = '__all__' + +class AdminGlossarySerializer(serializers.ModelSerializer): + class Meta: + model = Glossary + fields = '__all__' + +class AdminAttachmentSerializer(serializers.ModelSerializer): + class Meta: + model = Attachment + fields = '__all__' + + def serialize_file(value, serializer): if not value: return None @@ -21,6 +37,8 @@ def serialize_file(value, serializer): return field.to_representation(value) class AdminCourseCategorySerializer(serializers.ModelSerializer): + slug = serializers.SlugField(required=False, allow_blank=True) + class Meta: model = CourseCategory fields = ['id', 'name', 'slug'] diff --git a/apps/course/urls.py b/apps/course/urls.py index 0419894..99c917f 100644 --- a/apps/course/urls.py +++ b/apps/course/urls.py @@ -6,9 +6,15 @@ from . import views router = DefaultRouter() router.register(r'admin/courses', views.AdminCourseViewSet, basename='admin-courses') router.register(r'admin/chapters', views.AdminChapterViewSet, basename='admin-chapters') -router.register(r'admin/lessons', views.AdminCourseLessonViewSet, basename='admin-lessons') -router.register(r'admin/attachments', views.AdminCourseAttachmentViewSet, basename='admin-attachments') -router.register(r'admin/glossaries', views.AdminCourseGlossaryViewSet, basename='admin-glossaries') +router.register(r'admin/course-lessons', views.AdminCourseLessonViewSet, basename='admin-course-lessons') +router.register(r'admin/course-attachments', views.AdminCourseAttachmentViewSet, basename='admin-course-attachments') +router.register(r'admin/course-glossaries', views.AdminCourseGlossaryViewSet, basename='admin-course-glossaries') + +# Base model admin routes for the Repository Page +router.register(r'admin/categories', views.AdminCourseCategoryViewSet, basename='admin-categories') +router.register(r'admin/lessons', views.AdminLessonViewSet, basename='admin-lessons-base') +router.register(r'admin/attachments', views.AdminAttachmentViewSet, basename='admin-attachments-base') +router.register(r'admin/glossaries', views.AdminGlossaryViewSet, basename='admin-glossaries-base') urlpatterns = [ path('', include(router.urls)), diff --git a/apps/course/views/admin.py b/apps/course/views/admin.py index c392a71..0544329 100644 --- a/apps/course/views/admin.py +++ b/apps/course/views/admin.py @@ -4,18 +4,26 @@ from rest_framework.permissions import IsAuthenticated, IsAdminUser from rest_framework.authentication import TokenAuthentication from apps.course.models import ( Course, + CourseCategory, CourseChapter, CourseLesson, + Lesson, CourseAttachment, - CourseGlossary + Attachment, + CourseGlossary, + Glossary ) from apps.course.serializers.admin import ( + AdminCourseCategorySerializer, AdminCourseListSerializer, AdminCourseDetailSerializer, AdminCourseChapterSerializer, AdminCourseLessonSerializer, AdminCourseAttachmentSerializer, - AdminCourseGlossarySerializer + AdminCourseGlossarySerializer, + AdminLessonSerializer, + AdminGlossarySerializer, + AdminAttachmentSerializer ) class AdminCourseViewSet(viewsets.ModelViewSet): @@ -158,3 +166,73 @@ class AdminCourseGlossaryViewSet(viewsets.ModelViewSet): instance.delete() if glossary: glossary.delete() + + +class AdminCourseCategoryViewSet(viewsets.ModelViewSet): + """ + Admin CRUD ViewSet for Course Categories. + """ + permission_classes = [IsAuthenticated, IsAdminUser] + authentication_classes = [TokenAuthentication] + serializer_class = AdminCourseCategorySerializer + + def get_queryset(self): + queryset = CourseCategory.objects.all().order_by('-id') + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter(Q(name__icontains=search) | Q(slug__icontains=search)) + return queryset + + +class AdminLessonViewSet(viewsets.ModelViewSet): + """ + Admin CRUD ViewSet for base Lesson. + """ + permission_classes = [IsAuthenticated, IsAdminUser] + authentication_classes = [TokenAuthentication] + serializer_class = AdminLessonSerializer + + def get_queryset(self): + queryset = Lesson.objects.all().order_by('-id') + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter(title__icontains=search) + + content_type = self.request.query_params.get('content_type', None) + if content_type: + queryset = queryset.filter(content_type=content_type) + + return queryset + + +class AdminGlossaryViewSet(viewsets.ModelViewSet): + """ + Admin CRUD ViewSet for base Glossary. + """ + permission_classes = [IsAuthenticated, IsAdminUser] + authentication_classes = [TokenAuthentication] + serializer_class = AdminGlossarySerializer + + def get_queryset(self): + queryset = Glossary.objects.all().order_by('-id') + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter(Q(title__icontains=search) | Q(description__icontains=search)) + return queryset + + +class AdminAttachmentViewSet(viewsets.ModelViewSet): + """ + Admin CRUD ViewSet for base Attachment. + """ + permission_classes = [IsAuthenticated, IsAdminUser] + authentication_classes = [TokenAuthentication] + serializer_class = AdminAttachmentSerializer + + def get_queryset(self): + queryset = Attachment.objects.all().order_by('-id') + search = self.request.query_params.get('search', None) + if search: + queryset = queryset.filter(title__icontains=search) + return queryset +