when posting an existing Purchase, returns a 208 instead of a 400 for failing uniqueness

tz
Laurent 1 year ago
parent 03c6086e4b
commit 6617a2cc9b
  1. 1
      api/serializers.py
  2. 32
      api/views.py
  3. 23
      tournaments/migrations/0082_alter_purchase_identifier_and_more.py
  4. 2
      tournaments/models/purchase.py

@ -9,7 +9,6 @@ from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes from django.utils.encoding import force_bytes
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.contrib.sites.shortcuts import get_current_site from django.contrib.sites.shortcuts import get_current_site
from api.tokens import account_activation_token from api.tokens import account_activation_token
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):

@ -107,6 +107,38 @@ class PurchaseViewSet(viewsets.ModelViewSet):
return self.queryset.filter(user=self.request.user) return self.queryset.filter(user=self.request.user)
return [] return []
def create(self, request, *args, **kwargs):
identifier = request.data.get('identifier')
if Purchase.objects.filter(identifier=identifier).exists():
return Response({"detail": "This transaction identifier is already registered."}, status=status.HTTP_208_ALREADY_REPORTED)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
# def create(self, request, *args, **kwargs):
# serializer = PurchaseSerializer(data=request.data)
# # Check if the serializer is valid
# #
# print('create')
# if serializer.is_valid():
# print('isvalid')
# identifier = serializer.validated_data['identifier']
# # If the unique field already exists, return 208
# if Purchase.objects.filter(identifier=identifier).exists():
# print('return 208')
# return Response({'detail': 'Already exists.'}, status=status.HTTP_208_ALREADY_REPORTED)
# # Otherwise, perform the creation
# self.perform_create(serializer)
# return Response(serializer.data, status=status.HTTP_201_CREATED)
# print('return 400')
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def put(self, request, pk): def put(self, request, pk):
raise MethodNotAllowed('PUT') raise MethodNotAllowed('PUT')

@ -0,0 +1,23 @@
# Generated by Django 5.1 on 2024-09-16 08:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tournaments', '0081_round_group_stage_loser_bracket'),
]
operations = [
migrations.AlterField(
model_name='purchase',
name='identifier',
field=models.BigIntegerField(unique=True),
),
migrations.AlterField(
model_name='tournament',
name='federal_age_category',
field=models.IntegerField(choices=[(0, ''), (120, 'U12'), (140, 'U14'), (160, 'U16'), (180, 'U18'), (200, 'Senior'), (450, '+45 ans'), (550, '+55 ans')], default=200),
),
]

@ -5,7 +5,7 @@ from . import CustomUser
class Purchase(models.Model): class Purchase(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True) id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=True)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE) user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
identifier = models.BigIntegerField() identifier = models.BigIntegerField(unique=True)
purchase_date = models.DateTimeField() purchase_date = models.DateTimeField()
product_id = models.CharField(max_length=100) product_id = models.CharField(max_length=100)
quantity = models.IntegerField(null=True, blank=True) quantity = models.IntegerField(null=True, blank=True)

Loading…
Cancel
Save