import logging from rest_framework.request import Request from rest_framework.response import Response from rest_framework.exceptions import NotFound from rest_framework.permissions import AllowAny from rest_framework import status from labs.models import CertificateIssuance, CertificateType from labs.api.base import Endpoint from labs.api.serializers.cert import ( CertificateTypeDetailSerializer, CertificateIssuanceDetailSerializer, CertificateNumberSearchSerializer, TLMSToCertificateNumberSerializer, ) logger = logging.getLogger(__name__) class CertificateTypeListEndpoint(Endpoint): permission_classes = (AllowAny,) def get(self, request: Request) -> Response: certificate_types = CertificateType.objects.only( "name", "short_name", "description", "issuer_name", "issuer_website", ).filter(public=True) serializer = CertificateTypeDetailSerializer(certificate_types, many=True) return Response(serializer.data) class CertificateIssuanceDetailEndpoint(Endpoint): permission_classes = (AllowAny,) def convert_args(self, request: Request, certificate_id: str, *args, **kwargs): try: certificate_issuance = ( CertificateIssuance.objects.select_related("recipient") .select_related("cert_type") .get(cert_number=certificate_id) ) except CertificateIssuance.DoesNotExist: raise NotFound(detail="Certificate issuance not found") kwargs["certificate_issuance"] = certificate_issuance return args, kwargs def get( self, request: Request, certificate_issuance: CertificateIssuance ) -> Response: serializer = CertificateIssuanceDetailSerializer(certificate_issuance) return Response(serializer.data) class CertificateNumberSearchEndpoint(Endpoint): permission_classes = (AllowAny,) def get(self, request: Request) -> Response: serializer = CertificateNumberSearchSerializer(data=request.query_params) serializer.is_valid(raise_exception=True) certificate_issuance = serializer.get_certificate_issuance() if certificate_issuance: return Response( { "cert_number": certificate_issuance.cert_number, } ) return Response(status=status.HTTP_404_NOT_FOUND) class TLMSToCertificateNumberEndpoint(Endpoint): permission_classes = (AllowAny,) def get(self, request: Request) -> Response: serializer = TLMSToCertificateNumberSerializer(data=request.query_params) serializer.is_valid(raise_exception=True) certificate_issuance = serializer.get_certificate_issuance() if certificate_issuance: return Response( { "cert_number": certificate_issuance.cert_number, } ) return Response(status=status.HTTP_404_NOT_FOUND)