From af3b8ffc44e478382e3756f86af7c03192983122 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Tue, 11 Jun 2019 09:56:03 +0200 Subject: [PATCH] api: allow empty cancel_booking_id (#33783) --- chrono/api/views.py | 16 +++++++++++++--- tests/test_api.py | 16 ++++++++++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/chrono/api/views.py b/chrono/api/views.py index 458a77e4..04c78100 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -316,7 +316,7 @@ class SlotSerializer(serializers.Serializer): user_display_label = serializers.CharField(max_length=250, allow_blank=True) backoffice_url = serializers.URLField(allow_blank=True) count = serializers.IntegerField(min_value=1) - cancel_booking_id = serializers.IntegerField() + cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True) class SlotsSerializer(SlotSerializer): @@ -384,10 +384,20 @@ class Fillslots(APIView): }, status=status.HTTP_400_BAD_REQUEST) to_cancel_booking = None - if 'cancel_booking_id' in payload: + cancel_booking_id = None + if payload.get('cancel_booking_id'): + try: + cancel_booking_id = int(payload.get('cancel_booking_id')) + except (ValueError, TypeError): + return Response({ + 'err': 1, + 'reason': 'cancel_booking_id is not an integer' + }, status=status.HTTP_400_BAD_REQUEST) + + if cancel_booking_id is not None: cancel_error = None try: - to_cancel_booking = Booking.objects.get(pk=payload.get('cancel_booking_id')) + to_cancel_booking = Booking.objects.get(pk=cancel_booking_id) if to_cancel_booking.cancellation_datetime: cancel_error = 'cancel booking: booking already cancelled' else: diff --git a/tests/test_api.py b/tests/test_api.py index b7952b6f..97b5599b 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -783,12 +783,20 @@ def test_booking_api_with_cancel_booking(app, some_data, user): params={'cancel_booking_id': 'no an integer'}, status=400) - # cancel_booking_id can't be empty if specified - app.post_json( + # cancel_booking_id can be empty or null + resp = app.post_json( '/api/agenda/%s/fillslot/%s/' % (agenda_id, event_0.id), - params={'cancel_booking_id': ''}, - status=400) + params={'cancel_booking_id': ''}) + assert resp.json['err'] == 0 + assert 'cancelled_booking_id' not in resp.json + assert Booking.objects.count() == 5 + resp = app.post_json( + '/api/agenda/%s/fillslot/%s/' % (agenda_id, event_0.id), + params={'cancel_booking_id': None}) + assert resp.json['err'] == 0 + assert 'cancelled_booking_id' not in resp.json + assert Booking.objects.count() == 6 def test_booking_cancellation_api(app, some_data, user): agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id