Files
2025-07-31 15:40:42 +05:00

102 lines
3.8 KiB
Python

"""
Serializers for the contentstore.views module.
This module contains DRF serializers for various features such as certificates, blocks, and others.
Add new serializers here as needed for API endpoints in this module.
"""
from rest_framework import serializers
from django.core.exceptions import PermissionDenied
from cms.djangoapps.contentstore.views.certificate_manager import (
CERTIFICATE_SCHEMA_VERSION,
CertificateManager, Certificate,
)
from common.djangoapps.student.roles import GlobalStaff
class CertificateActivationSerializer(serializers.Serializer):
"""
Serializer for activating or deactivating course certificates.
"""
# This field indicates whether the certificate should be activated or deactivated.
is_active = serializers.BooleanField(required=False, default=False)
class SignatorySerializer(serializers.Serializer):
"""
Serializer for signatories in a course certificate.
"""
id = serializers.IntegerField(required=False)
name = serializers.CharField(required=False, allow_blank=True)
title = serializers.CharField(required=False, allow_blank=True)
organization = serializers.CharField(required=False, allow_blank=True)
signature_image_path = serializers.CharField(required=False, allow_blank=True)
certificate = serializers.CharField(required=False, allow_blank=True, allow_null=True)
class CertificateSerializer(serializers.Serializer):
"""
Serializer for course certificates.
"""
id = serializers.IntegerField(read_only=True)
version = serializers.IntegerField(default=CERTIFICATE_SCHEMA_VERSION)
name = serializers.CharField(required=True, allow_blank=False)
description = serializers.CharField(required=True, allow_blank=False)
is_active = serializers.BooleanField(default=False)
course_title = serializers.CharField(required=False, allow_blank=True)
signatories = SignatorySerializer(many=True, required=False, default=list)
def validate(self, data):
"""
Validate the certificate data.
"""
certificate_id = self.context.get("certificate_id")
course = self.context.get("course")
request = self.context.get("request")
if certificate_id and course:
active_certificates = CertificateManager.get_certificates(course, only_active=True)
active_ids = [int(cert["id"]) for cert in active_certificates]
if int(certificate_id) in active_ids:
if not GlobalStaff().has_user(request.user):
raise PermissionDenied()
return data
def create(self, validated_data):
"""
Create a new Certificate instance with the provided validated data.
"""
course = self.context.get("course")
certificate_id = self.context.get("certificate_id")
validated_data = CertificateManager.assign_id(course, validated_data, certificate_id)
return Certificate(course=course, certificate_data=validated_data)
def update(self, instance, validated_data):
"""
Update an existing Certificate instance with the provided validated data.
"""
instance.certificate_data.update(validated_data) # pylint: disable=protected-access
return instance
def to_representation(self, instance):
"""
Convert the Certificate instance to a dictionary representation.
"""
data = instance.certificate_data
result = {
"id": data.get("id"),
"name": data.get("name"),
"description": data.get("description"),
"is_active": data.get("is_active", False),
"version": data.get("version", CERTIFICATE_SCHEMA_VERSION),
"signatories": data.get("signatories", []),
}
if data.get("course_title"):
result["course_title"] = data.get("course_title")
return result