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