Add number_of_months field to UpdatePaymentSerializer and implement validation in UpdatePaymentAPIView

This commit is contained in:
i701 2025-04-05 22:38:08 +05:00
parent b87dcfaf26
commit 2368ff408a
Signed by: i701
GPG Key ID: 54A0DA1E26D8E587
2 changed files with 17 additions and 6 deletions

View File

@ -14,12 +14,9 @@ class PaymentSerializer(serializers.ModelSerializer):
class UpdatePaymentSerializer(serializers.ModelSerializer): class UpdatePaymentSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Payment model = Payment
fields = [ fields = ["paid", "paid_at", "method", "number_of_months"]
"paid",
"paid_at",
"method",
]
paid = serializers.BooleanField(required=True, allow_null=True) paid = serializers.BooleanField(required=True, allow_null=True)
paid_at = serializers.DateTimeField(required=True, allow_null=True) paid_at = serializers.DateTimeField(required=True, allow_null=True)
method = serializers.ChoiceField(choices=Payment.PAYMENT_TYPES, required=True) method = serializers.ChoiceField(choices=Payment.PAYMENT_TYPES, required=True)
number_of_months = serializers.IntegerField(required=True, allow_null=True)

View File

@ -1,6 +1,7 @@
# Create your views here. # Create your views here.
# billing/views.py # billing/views.py
from datetime import datetime, timedelta from datetime import datetime, timedelta
from django.utils import timezone
import requests import requests
from decouple import config from decouple import config
@ -81,12 +82,25 @@ class UpdatePaymentAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
lookup_field = "pk" lookup_field = "pk"
def update(self, request, *args, **kwargs): 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() instance = self.get_object()
devices = instance.devices.all() devices = instance.devices.all()
serializer = self.get_serializer(instance, data=request.data, partial=False) serializer = self.get_serializer(instance, data=request.data, partial=False)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
self.perform_update(serializer) 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) return Response(serializer.data)