Projet

Général

Profil

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

Emmanuel Cazenave, 10 décembre 2019 15:40

Télécharger (3,68 ko)

Voir les différences:

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

 chrono/api/views.py | 11 ++++++++++-
 tests/test_api.py   | 33 +++++++++++++++++++++++++--------
 2 files changed, 35 insertions(+), 9 deletions(-)
chrono/api/views.py
24 24
from django.utils.dateparse import parse_date
25 25
from django.utils.encoding import force_text
26 26
from django.utils.timezone import now, make_aware, localtime
27
from django.utils import six
27 28
from django.utils.translation import gettext_noop
28 29
from django.utils.translation import ugettext_lazy as _
29 30

  
......
337 338
    cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True)
338 339

  
339 340

  
341
class StringOrListField(serializers.ListField):
342

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

  
348

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

  
348 357

  
tests/test_api.py
571 571
    assert resp.json['reason'] == 'slots list cannot be empty'  # legacy
572 572
    assert resp.json['err_class'] == 'slots list cannot be empty'
573 573
    assert resp.json['err_desc'] == 'slots list cannot be empty'
574
    # invalid slots format
575
    resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.id, params={'slots': 'foobar'}, status=400)
576
    assert resp.json['err'] == 1
577
    assert resp.json['reason'] == 'invalid payload'  # legacy
578
    assert resp.json['err_class'] == 'invalid payload'
579
    assert resp.json['err_desc'] == 'invalid payload'
580
    assert len(resp.json['errors']) == 1
581
    assert 'slots' in resp.json['errors']
582 574

  
583 575
    # unknown agendas
584 576
    resp = app.post('/api/agenda/foobar/fillslots/', status=404)
585 577
    resp = app.post('/api/agenda/233/fillslots/', status=404)
586 578

  
579

  
580
def test_booking_api_fillslots_slots_string_param(app, some_data, user):
581
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
582
    events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()]
583
    assert len(events_ids) == 3
584
    app.authorization = ('Basic', ('john.doe', 'password'))
585

  
586
    # empty string
587
    resp = app.post_json(
588
        '/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': ''},
589
        status=400
590
    )
591
    assert resp.json['err'] == 1
592
    assert resp.json['err_class'] == 'invalid payload'
593
    assert resp.json['err_desc'] == 'invalid payload'
594

  
595
    slots_string_param = ','.join([str(e) for e in events_ids])
596
    resp = app.post_json(
597
        '/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': slots_string_param}
598
    )
599
    primary_booking_id = resp.json['booking_id']
600
    Booking.objects.get(id=primary_booking_id)
601
    assert Booking.objects.count() == 3
602

  
603

  
587 604
def test_booking_api_meeting(app, meetings_agenda, user):
588 605
    agenda_id = meetings_agenda.slug
589 606
    meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
590
-