from rest_framework import serializers from apps.certificate.models import Certificate from apps.course.serializers import CourseDetailSerializer from django.conf import settings class CertificateSerializer(serializers.ModelSerializer): course = serializers.SerializerMethodField() certificate_file = serializers.SerializerMethodField() class Meta: model = Certificate fields = ['id', 'student', 'course', 'status', 'created_at', 'updated_at', 'certificate_file'] read_only_fields = ['id', 'student', 'status', 'created_at', 'updated_at',] def get_course(self, obj): return CourseDetailSerializer(obj.course, context=self.context).data def get_certificate_file(self, obj): if obj.certificate_file: request = self.context.get('request') if request is not None: return request.build_absolute_uri(obj.certificate_file.url) return obj.certificate_file.url return None class CertificateRequestSerializer(serializers.ModelSerializer): class Meta: model = Certificate fields = ['id', 'course'] read_only_fields = ['id'] def create(self, validated_data): user = self.context['request'].user course = validated_data['course'] if Certificate.objects.filter(student=user, course=course, status__in=['pending', 'approved']).exists(): raise serializers.ValidationError({ "course": "A certificate request for this course is already pending or approved." }) 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.SerializerMethodField() class Meta: model = Certificate fields = [ 'id', 'student', 'student_name', 'student_email', 'course', 'course_title', 'status', 'certificate_file', 'created_at', 'updated_at' ] def get_course_title(self, obj): if not obj.course: return None request = self.context.get('request') lang = getattr(request, 'LANGUAGE_CODE', None) or 'en' from apps.course.models.course import get_localized_field return get_localized_field(lang, obj.course.title)