0001-api-accept-slots-as-a-string-38333.patch
chrono/api/views.py | ||
---|---|---|
387 | 387 |
cancel_booking_id = serializers.CharField(max_length=250, allow_blank=True, allow_null=True) |
388 | 388 | |
389 | 389 | |
390 |
class StringOrListField(serializers.ListField): |
|
391 |
def to_internal_value(self, data): |
|
392 |
if isinstance(data, str): |
|
393 |
data = [s.strip() for s in data.split(',')] |
|
394 |
return super(StringOrListField, self).to_internal_value(data) |
|
395 | ||
396 | ||
390 | 397 |
class SlotsSerializer(SlotSerializer): |
391 | 398 |
''' |
392 | 399 |
payload to fill multiple slots: same as SlotSerializer, but the |
393 | 400 |
slots list is in the payload. |
394 | 401 |
''' |
395 | 402 | |
396 |
slots = serializers.ListField( |
|
397 |
required=True, child=serializers.CharField(max_length=64, allow_blank=False) |
|
398 |
) |
|
403 |
slots = StringOrListField(required=True, child=serializers.CharField(max_length=64, allow_blank=False)) |
|
399 | 404 | |
400 | 405 | |
401 | 406 |
class Fillslots(APIView): |
tests/test_api.py | ||
---|---|---|
695 | 695 |
resp = app.post('/api/agenda/233/fillslots/', status=404) |
696 | 696 | |
697 | 697 | |
698 |
def test_booking_api_fillslots_slots_string_param(app, some_data, user): |
|
699 |
agenda = Agenda.objects.filter(label=u'Foo bar')[0] |
|
700 |
events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()] |
|
701 |
assert len(events_ids) == 3 |
|
702 |
app.authorization = ('Basic', ('john.doe', 'password')) |
|
703 | ||
704 |
# empty string |
|
705 |
resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': ''}, status=400) |
|
706 |
assert resp.json['err'] == 1 |
|
707 |
assert resp.json['err_class'] == 'invalid payload' |
|
708 |
assert resp.json['err_desc'] == 'invalid payload' |
|
709 | ||
710 |
slots_string_param = ','.join([str(e) for e in events_ids]) |
|
711 |
resp = app.post_json('/api/agenda/%s/fillslots/' % agenda.slug, params={'slots': slots_string_param}) |
|
712 |
primary_booking_id = resp.json['booking_id'] |
|
713 |
Booking.objects.get(id=primary_booking_id) |
|
714 |
assert Booking.objects.count() == 3 |
|
715 | ||
716 | ||
698 | 717 |
def test_booking_api_meeting(app, meetings_agenda, user): |
699 | 718 |
agenda_id = meetings_agenda.slug |
700 | 719 |
meeting_type = MeetingType.objects.get(agenda=meetings_agenda) |
701 |
- |