From ec6db0baef94c7231f81a359b5357186d89caf5b Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Thu, 28 May 2026 11:13:43 +0330 Subject: [PATCH] certificate admin views and serializers added --- apps/certificate/serializers.py | 15 +++++++++++++ apps/certificate/urls.py | 9 +++++--- apps/certificate/views.py | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/apps/certificate/serializers.py b/apps/certificate/serializers.py index c816135..a8d405d 100644 --- a/apps/certificate/serializers.py +++ b/apps/certificate/serializers.py @@ -47,4 +47,19 @@ class CertificateRequestSerializer(serializers.ModelSerializer): return Certificate.objects.create(student=user, course=course) +class AdminCertificateSerializer(serializers.ModelSerializer): + student_name = serializers.CharField(source='student.fullname', read_only=True) + student_email = serializers.CharField(source='student.email', read_only=True) + course_title = serializers.CharField(source='course.title', read_only=True) + + class Meta: + model = Certificate + fields = [ + 'id', 'student', 'student_name', 'student_email', + 'course', 'course_title', 'status', 'certificate_file', + 'created_at', 'updated_at' + ] + + + diff --git a/apps/certificate/urls.py b/apps/certificate/urls.py index 9b80b74..b2612f0 100644 --- a/apps/certificate/urls.py +++ b/apps/certificate/urls.py @@ -1,11 +1,14 @@ -from django.urls import path -from .views import CertificateRequestView, UserCertificatesListView - +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import CertificateRequestView, UserCertificatesListView, AdminCertificateViewSet +router = DefaultRouter() +router.register(r'admin/certificates', AdminCertificateViewSet, basename='admin-certificates') urlpatterns = [ + path('', include(router.urls)), path('request/', CertificateRequestView.as_view(), name='certificate-request'), path('my-certificates/', UserCertificatesListView.as_view(), name='user-certificates'), ] \ No newline at end of file diff --git a/apps/certificate/views.py b/apps/certificate/views.py index 589c6ef..11e1c5d 100644 --- a/apps/certificate/views.py +++ b/apps/certificate/views.py @@ -53,4 +53,44 @@ class UserCertificatesListView(generics.ListAPIView): def get_queryset(self): return Certificate.objects.filter(student=self.request.user).order_by('-created_at') + + +from rest_framework.viewsets import ModelViewSet +from rest_framework.permissions import IsAdminUser +from apps.certificate.serializers import AdminCertificateSerializer +from django.db.models import Q + +class AdminCertificateViewSet(ModelViewSet): + queryset = Certificate.objects.all() + serializer_class = AdminCertificateSerializer + permission_classes = [permissions.IsAuthenticated, IsAdminUser] + authentication_classes = [TokenAuthentication] + + def get_queryset(self): + queryset = Certificate.objects.all().select_related('student', 'course') + + # Search query + search_query = self.request.query_params.get('search', None) + if search_query: + queryset = queryset.filter( + Q(student__fullname__icontains=search_query) | + Q(student__email__icontains=search_query) | + Q(course__title__icontains=search_query) + ) + + # Filters + status_param = self.request.query_params.get('status', None) + if status_param: + queryset = queryset.filter(status=status_param) + + course_id = self.request.query_params.get('course', None) + if course_id: + queryset = queryset.filter(course_id=course_id) + + student_id = self.request.query_params.get('student', None) + if student_id: + queryset = queryset.filter(student_id=student_id) + + return queryset.order_by('-created_at') + \ No newline at end of file