0001-api-accept-slots-as-a-string-38333.patch
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 |
- |