Projet

Général

Profil

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

Emmanuel Cazenave, 16 décembre 2019 15:16

Télécharger (2,66 ko)

Voir les différences:

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

 chrono/api/views.py | 10 +++++++++-
 tests/test_api.py   | 25 +++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
chrono/api/views.py
337 337
    cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True)
338 338

  
339 339

  
340
class StringOrListField(serializers.ListField):
341

  
342
    def to_internal_value(self, data):
343
        if isinstance(data, str):
344
            data = [s.strip() for s in data.split(',')]
345
        return super(StringOrListField, self).to_internal_value(data)
346

  
347

  
340 348
class SlotsSerializer(SlotSerializer):
341 349
    '''
342 350
    payload to fill multiple slots: same as SlotSerializer, but the
343 351
    slots list is in the payload.
344 352
    '''
345
    slots = serializers.ListField(required=True,
353
    slots = StringOrListField(required=True,
346 354
        child=serializers.CharField(max_length=64, allow_blank=False))
347 355

  
348 356

  
tests/test_api.py
583 583
    resp = app.post('/api/agenda/foobar/fillslots/', status=404)
584 584
    resp = app.post('/api/agenda/233/fillslots/', status=404)
585 585

  
586

  
587
def test_booking_api_fillslots_slots_string_param(app, some_data, user):
588
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
589
    events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()]
590
    assert len(events_ids) == 3
591
    app.authorization = ('Basic', ('john.doe', 'password'))
592

  
593
    # empty string
594
    resp = app.post_json(
595
        '/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': ''},
596
        status=400
597
    )
598
    assert resp.json['err'] == 1
599
    assert resp.json['err_class'] == 'invalid payload'
600
    assert resp.json['err_desc'] == 'invalid payload'
601

  
602
    slots_string_param = ','.join([str(e) for e in events_ids])
603
    resp = app.post_json(
604
        '/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': slots_string_param}
605
    )
606
    primary_booking_id = resp.json['booking_id']
607
    Booking.objects.get(id=primary_booking_id)
608
    assert Booking.objects.count() == 3
609

  
610

  
586 611
def test_booking_api_meeting(app, meetings_agenda, user):
587 612
    agenda_id = meetings_agenda.slug
588 613
    meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
589
-