from typing import Optional from rest_framework import serializers from django.db.models.functions import Lower from labs.models import ( CertificateIssuance, CertificateRecipient, CertificateType, ) class CertURLEncryptSerializer(serializers.Serializer): user_login = serializers.CharField(required=True) course_id = serializers.CharField(required=True) class LearnerInfoSerializer(serializers.Serializer): user_gid = serializers.CharField(required=False) email = serializers.EmailField(required=False) first_name = serializers.CharField(required=False) last_name = serializers.CharField(required=False) class LearnerCertPublicURLSerializer(serializers.Serializer): email = serializers.EmailField(required=True) first_name = serializers.CharField(required=True) last_name = serializers.CharField(required=True) cert_abbr_code = serializers.CharField(required=True) class VerifyCertificateSerializer(serializers.Serializer): cert_id = serializers.CharField(required=True) class TLMSCallbackSerializer(serializers.Serializer): user = serializers.CharField(required=True) course = serializers.CharField(required=True) class CertificateRecipientDetailSerializer(serializers.ModelSerializer): class Meta: model = CertificateRecipient fields = [ "first_name", "last_name", ] class CertificateTypeDetailSerializer(serializers.ModelSerializer): class Meta: model = CertificateType fields = [ "name", "short_name", "description", "issuer_name", "issuer_website", ] class CertificateIssuanceDetailSerializer(serializers.ModelSerializer): recipient = CertificateRecipientDetailSerializer() cert_type = CertificateTypeDetailSerializer() issued_at = serializers.DateTimeField(format="%d/%m/%Y") file_public_url = serializers.SerializerMethodField() def get_file_public_url(self, obj: CertificateIssuance) -> str: return obj.get_file_public_url() class Meta: model = CertificateIssuance fields = [ "recipient", "cert_type", "cert_number", "issued_at", "file_public_url", ] class CertificateNumberSearchSerializer(serializers.Serializer): email = serializers.EmailField(required=True) first_name = serializers.CharField(required=True) last_name = serializers.CharField(required=True) cert_short_name = serializers.CharField(required=True) def get_certificate_issuance(self) -> Optional[CertificateIssuance]: email = self.validated_data.get("email") first_name = self.validated_data.get("first_name") last_name = self.validated_data.get("last_name") cert_short_name = self.validated_data.get("cert_short_name") return ( CertificateIssuance.objects.annotate( email_lower=Lower("recipient__email"), first_name_lower=Lower("recipient__first_name"), last_name_lower=Lower("recipient__last_name"), ) .filter( email_lower=email.lower(), first_name_lower=first_name.lower(), last_name_lower=last_name.lower(), cert_type__short_name=cert_short_name, ) .order_by("-issued_at") .first() ) class TLMSToCertificateNumberSerializer(serializers.Serializer): user_gid = serializers.CharField(required=True) course_id = serializers.CharField(required=True) def get_certificate_issuance(self) -> Optional[CertificateIssuance]: user_gid = self.validated_data.get("user_gid") course_id = self.validated_data.get("course_id") return ( CertificateIssuance.objects.filter( recipient__deprecated_gid=user_gid, tlms_course_id=course_id, ) .order_by("-issued_at") .first() )