102 lines
3.8 KiB
Python
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
|