Projet

Général

Profil

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

Emmanuel Cazenave, 11 décembre 2019 11:49

Télécharger (3,03 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   | 25 +++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
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
584 584
    resp = app.post('/api/agenda/foobar/fillslots/', status=404)
585 585
    resp = app.post('/api/agenda/233/fillslots/', status=404)
586 586

  
587

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

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

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

  
611

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