From 7a88e39b96afb9ee4eaa1b3587ded165cd59e38c Mon Sep 17 00:00:00 2001 From: komoliddin Date: Thu, 23 Apr 2026 18:04:09 +0500 Subject: [PATCH] Enhance Certificate model and serializer to support file uploads and URL generation --- core/apps/evaluation/models/certificate.py | 16 +++++++++++++--- .../serializers/certificate/certificate.py | 17 +++++++++++++++-- core/apps/evaluation/views/certificate.py | 3 +++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/core/apps/evaluation/models/certificate.py b/core/apps/evaluation/models/certificate.py index 5b8233c..4089da4 100644 --- a/core/apps/evaluation/models/certificate.py +++ b/core/apps/evaluation/models/certificate.py @@ -1,11 +1,21 @@ from django.db import models from django_core.models import AbstractBaseModel -from model_bakery import baker from django.utils.translation import gettext_lazy as _ +from model_bakery import baker + class CertificateModel(AbstractBaseModel): - title = models.CharField(verbose_name=_("title"), max_length=255, blank=False, null=False) - file_url = models.URLField(verbose_name=_("file url"), max_length=255, blank=False, null=False) + title = models.CharField( + verbose_name=_("title"), + max_length=255 + ) + + file = models.FileField( + verbose_name=_("file"), + upload_to="certificates/", + blank=True, + null=True + ) def __str__(self): return self.title diff --git a/core/apps/evaluation/serializers/certificate/certificate.py b/core/apps/evaluation/serializers/certificate/certificate.py index 1a7bcdb..c094e3f 100644 --- a/core/apps/evaluation/serializers/certificate/certificate.py +++ b/core/apps/evaluation/serializers/certificate/certificate.py @@ -1,12 +1,25 @@ from rest_framework import serializers from core.apps.evaluation.models import CertificateModel + class BaseCertificateSerializer(serializers.ModelSerializer): + file_url = serializers.SerializerMethodField() class Meta: model = CertificateModel fields = [ "id", "title", - "file_url" - ] \ No newline at end of file + "file", + "file_url", + ] + + def get_file_url(self, obj): + request = self.context.get("request") + + if obj.file: + if request: + return request.build_absolute_uri(obj.file.url) + return obj.file.url + + return None \ No newline at end of file diff --git a/core/apps/evaluation/views/certificate.py b/core/apps/evaluation/views/certificate.py index a990840..ef5392e 100644 --- a/core/apps/evaluation/views/certificate.py +++ b/core/apps/evaluation/views/certificate.py @@ -5,6 +5,7 @@ from rest_framework.viewsets import ModelViewSet from core.apps.evaluation.models import CertificateModel from core.apps.evaluation.serializers.certificate import BaseCertificateSerializer from rest_framework.filters import SearchFilter +from rest_framework.parsers import MultiPartParser, FormParser @extend_schema(tags=["Certificate"]) class CertificateView(BaseViewSetMixin, ModelViewSet): @@ -12,6 +13,8 @@ class CertificateView(BaseViewSetMixin, ModelViewSet): serializer_class = BaseCertificateSerializer permission_classes = [IsAuthenticated] + parser_classes = [MultiPartParser, FormParser] + filter_backends = [SearchFilter] search_fields = ["title"]