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)