From 2368ff408a651e951de542b25dc719b8dded2577 Mon Sep 17 00:00:00 2001 From: i701 Date: Sat, 5 Apr 2025 22:38:08 +0500 Subject: [PATCH] Add number_of_months field to UpdatePaymentSerializer and implement validation in UpdatePaymentAPIView --- billing/serializers.py | 7 ++----- billing/views.py | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/billing/serializers.py b/billing/serializers.py index 78ca861..ba81c7b 100644 --- a/billing/serializers.py +++ b/billing/serializers.py @@ -14,12 +14,9 @@ class PaymentSerializer(serializers.ModelSerializer): class UpdatePaymentSerializer(serializers.ModelSerializer): class Meta: model = Payment - fields = [ - "paid", - "paid_at", - "method", - ] + fields = ["paid", "paid_at", "method", "number_of_months"] paid = serializers.BooleanField(required=True, allow_null=True) paid_at = serializers.DateTimeField(required=True, allow_null=True) method = serializers.ChoiceField(choices=Payment.PAYMENT_TYPES, required=True) + number_of_months = serializers.IntegerField(required=True, allow_null=True) diff --git a/billing/views.py b/billing/views.py index 5465bed..584ac59 100644 --- a/billing/views.py +++ b/billing/views.py @@ -1,6 +1,7 @@ # Create your views here. # billing/views.py from datetime import datetime, timedelta +from django.utils import timezone import requests from decouple import config @@ -81,12 +82,25 @@ class UpdatePaymentAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView): lookup_field = "pk" def update(self, request, *args, **kwargs): + number_of_months = request.data.get("number_of_months") + + if not number_of_months: + return Response( + {"message": "number_of_months is required."}, + status=status.HTTP_400_BAD_REQUEST, + ) + if not isinstance(number_of_months, int): + return Response( + {"message": "number_of_months must be an integer."}, + status=status.HTTP_400_BAD_REQUEST, + ) + device_expire_date = timezone.now() + timedelta(days=30 * number_of_months) instance = self.get_object() devices = instance.devices.all() serializer = self.get_serializer(instance, data=request.data, partial=False) serializer.is_valid(raise_exception=True) self.perform_update(serializer) - devices.update(is_active=True, expiry_date=instance.expires_at) + devices.update(is_active=True, expiry_date=device_expire_date) return Response(serializer.data)