From d70115cb2b9c175bf4123fc7f8c34ff473db2407 Mon Sep 17 00:00:00 2001 From: Adibov Date: Thu, 11 Jan 2024 17:43:41 +0330 Subject: [PATCH] feat: add certificates link to api views --- ...ationparticipation_certificate_and_more.py | 24 +++++++++++++++++++ backend/backend_api/models.py | 4 ++-- backend/backend_api/serializers.py | 17 +++++++++++-- backend/utils/image_uploader.py | 4 +++- 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 backend/backend_api/migrations/0061_alter_presentationparticipation_certificate_and_more.py diff --git a/backend/backend_api/migrations/0061_alter_presentationparticipation_certificate_and_more.py b/backend/backend_api/migrations/0061_alter_presentationparticipation_certificate_and_more.py new file mode 100644 index 0000000..c34e9d7 --- /dev/null +++ b/backend/backend_api/migrations/0061_alter_presentationparticipation_certificate_and_more.py @@ -0,0 +1,24 @@ +# Generated by Django 4.2.4 on 2024-01-11 13:56 + +from django.db import migrations, models +import utils.image_uploader + + +class Migration(migrations.Migration): + + dependencies = [ + ('backend_api', '0060_presentationparticipation_certificate_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='presentationparticipation', + name='certificate', + field=models.FileField(blank=True, default=None, null=True, upload_to=utils.image_uploader.update_certificate_filename), + ), + migrations.AlterField( + model_name='workshopregistration', + name='certificate', + field=models.FileField(blank=True, default=None, null=True, upload_to=utils.image_uploader.update_certificate_filename), + ), + ] diff --git a/backend/backend_api/models.py b/backend/backend_api/models.py index a8412fd..9d1d50b 100644 --- a/backend/backend_api/models.py +++ b/backend/backend_api/models.py @@ -294,7 +294,7 @@ class StatusChoices(models.IntegerChoices): status = models.IntegerField(choices=StatusChoices.choices, default=StatusChoices.AWAITING_PAYMENT) password = models.CharField(max_length=SMALL_MAX_LENGTH, default=random_password) certificate_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) - certificate = models.FileField(upload_to=update_certificate_filename, null=True, default=None) + certificate = models.FileField(upload_to=update_certificate_filename, null=True, default=None, blank=True) class Meta: unique_together = ('workshop', 'user',) @@ -314,7 +314,7 @@ class StatusChoices(models.IntegerChoices): status = models.IntegerField(choices=StatusChoices.choices, default=StatusChoices.AWAITING_PAYMENT) password = models.CharField(max_length=SMALL_MAX_LENGTH, default=random_password) certificate_uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) - certificate = models.FileField(upload_to=update_certificate_filename, null=True, default=None) + certificate = models.FileField(upload_to=update_certificate_filename, null=True, default=None, blank=True) class Meta: unique_together = ('presentation', 'user',) diff --git a/backend/backend_api/serializers.py b/backend/backend_api/serializers.py index 73a078c..77c4e01 100644 --- a/backend/backend_api/serializers.py +++ b/backend/backend_api/serializers.py @@ -1,6 +1,9 @@ +import urllib.parse + from django.core.exceptions import ObjectDoesNotExist from rest_framework import serializers, status +from aaiss_backend.settings import BASE_URL from backend_api import models from backend_api.models import User, Account, WorkshopRegistration, PresentationParticipation from utils.renderers import new_detailed_response @@ -75,10 +78,11 @@ class Meta: class WorkshopRegistrationSerializer(serializers.ModelSerializer): workshop = serializers.PrimaryKeyRelatedField(queryset=WorkshopSerializer.Meta.model.objects.all()) + certificate = serializers.CharField(required=False, allow_blank=True, allow_null=True) class Meta: model = WorkshopRegistration - fields = ('workshop',) + fields = ('workshop', 'certificate') def create(self, validated_data): user = self.context['request'].user.user @@ -99,6 +103,10 @@ def to_representation(self, instance): response = {} user = self.context['request'].user.user for key, val in super_response.items(): + if key == 'certificate': + if val: + response[key] = urllib.parse.urljoin(BASE_URL, val) + continue response["id"] = val try: workshop_status = WorkshopRegistration.objects.get(user=user, workshop_id=val).status @@ -110,10 +118,11 @@ def to_representation(self, instance): class PresentationParticipationSerializer(serializers.ModelSerializer): presentation = serializers.PrimaryKeyRelatedField(queryset=PresentationSerializer.Meta.model.objects.all()) + certificate = serializers.CharField(required=False, allow_blank=True, allow_null=True) class Meta: model = PresentationParticipation - fields = ('presentation',) + fields = ('presentation', 'certificate') def create(self, validated_data): user = self.context['request'].user.user @@ -133,6 +142,10 @@ def to_representation(self, instance): response = {} user = self.context['request'].user.user for key, val in super_response.items(): + if key == 'certificate': + if val: + response[key] = urllib.parse.urljoin(BASE_URL, val) + continue response["id"] = val try: presentation_status = PresentationParticipation.objects.get(user=user, presentation_id=val).status diff --git a/backend/utils/image_uploader.py b/backend/utils/image_uploader.py index 1bdf9b5..62cd488 100644 --- a/backend/utils/image_uploader.py +++ b/backend/utils/image_uploader.py @@ -1,5 +1,7 @@ import os +from aaiss_backend.settings import MEDIA_URL, BASE_URL + def update_certificate_filename(instance, filename): path = "certificates/" @@ -9,4 +11,4 @@ def update_certificate_filename(instance, filename): path += "workshop/" format = instance.certificate_uuid _, file_extension = os.path.splitext(filename) - return os.path.join(path, str(format) + file_extension) + return os.path.join(MEDIA_URL, path, str(format) + file_extension)