From c420dde65d95a2c3d0f9beec89ada2bb16d1349a Mon Sep 17 00:00:00 2001 From: Emmanuel Cazenave Date: Tue, 10 Dec 2019 15:28:25 +0100 Subject: [PATCH] api: accept slots as a string (#38333) --- chrono/api/views.py | 11 ++++++++--- tests/test_api.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/chrono/api/views.py b/chrono/api/views.py index 0fa35332..a0a1ec48 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -387,15 +387,20 @@ class SlotSerializer(serializers.Serializer): cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True) +class StringOrListField(serializers.ListField): + def to_internal_value(self, data): + if isinstance(data, str): + data = [s.strip() for s in data.split(',')] + return super(StringOrListField, self).to_internal_value(data) + + class SlotsSerializer(SlotSerializer): ''' payload to fill multiple slots: same as SlotSerializer, but the slots list is in the payload. ''' - slots = serializers.ListField( - required=True, child=serializers.CharField(max_length=64, allow_blank=False) - ) + slots = StringOrListField(required=True, child=serializers.CharField(max_length=64, allow_blank=False)) class Fillslots(APIView): diff --git a/tests/test_api.py b/tests/test_api.py index 66fc3330..23ed41ac 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -695,6 +695,25 @@ def test_booking_api_fillslots(app, some_data, user): resp = app.post('/api/agenda/233/fillslots/', status=404) +def test_booking_api_fillslots_slots_string_param(app, some_data, user): + agenda = Agenda.objects.filter(label=u'Foo bar')[0] + events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()] + assert len(events_ids) == 3 + app.authorization = ('Basic', ('john.doe', 'password')) + + # empty string + resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': ''}, status=400) + assert resp.json['err'] == 1 + assert resp.json['err_class'] == 'invalid payload' + assert resp.json['err_desc'] == 'invalid payload' + + slots_string_param = ','.join([str(e) for e in events_ids]) + resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': slots_string_param}) + primary_booking_id = resp.json['booking_id'] + Booking.objects.get(id=primary_booking_id) + assert Booking.objects.count() == 3 + + def test_booking_api_meeting(app, meetings_agenda, user): agenda_id = meetings_agenda.slug meeting_type = MeetingType.objects.get(agenda=meetings_agenda)