Projet

Général

Profil

0001-api-accept-slots-as-a-string-38333.patch

Emmanuel Cazenave, 20 décembre 2019 10:44

Télécharger (2,65 ko)

Voir les différences:

Subject: [PATCH 1/2] api: accept slots as a string (#38333)

 chrono/api/views.py | 11 ++++++++---
 tests/test_api.py   | 19 +++++++++++++++++++
 2 files changed, 27 insertions(+), 3 deletions(-)
chrono/api/views.py
387 387
    cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True)
388 388

  
389 389

  
390
class StringOrListField(serializers.ListField):
391
    def to_internal_value(self, data):
392
        if isinstance(data, str):
393
            data = [s.strip() for s in data.split(',')]
394
        return super(StringOrListField, self).to_internal_value(data)
395

  
396

  
390 397
class SlotsSerializer(SlotSerializer):
391 398
    '''
392 399
    payload to fill multiple slots: same as SlotSerializer, but the
393 400
    slots list is in the payload.
394 401
    '''
395 402

  
396
    slots = serializers.ListField(
397
        required=True, child=serializers.CharField(max_length=64, allow_blank=False)
398
    )
403
    slots = StringOrListField(required=True, child=serializers.CharField(max_length=64, allow_blank=False))
399 404

  
400 405

  
401 406
class Fillslots(APIView):
tests/test_api.py
695 695
    resp = app.post('/api/agenda/233/fillslots/', status=404)
696 696

  
697 697

  
698
def test_booking_api_fillslots_slots_string_param(app, some_data, user):
699
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
700
    events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()]
701
    assert len(events_ids) == 3
702
    app.authorization = ('Basic', ('john.doe', 'password'))
703

  
704
    # empty string
705
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': ''}, status=400)
706
    assert resp.json['err'] == 1
707
    assert resp.json['err_class'] == 'invalid payload'
708
    assert resp.json['err_desc'] == 'invalid payload'
709

  
710
    slots_string_param = ','.join([str(e) for e in events_ids])
711
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': slots_string_param})
712
    primary_booking_id = resp.json['booking_id']
713
    Booking.objects.get(id=primary_booking_id)
714
    assert Booking.objects.count() == 3
715

  
716

  
698 717
def test_booking_api_meeting(app, meetings_agenda, user):
699 718
    agenda_id = meetings_agenda.slug
700 719
    meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
701
-