diff --git a/chrono/api/views.py b/chrono/api/views.py index 690d9386..6f0d64d3 100644 --- a/chrono/api/views.py +++ b/chrono/api/views.py @@ -127,6 +127,19 @@ def get_agenda_detail(request, agenda): return agenda_detail +def get_event_places(event): + places = { + 'total': event.places, + 'reserved': event.booked_places, + 'available': event.places - event.booked_places, + } + if event.waiting_list_places: + places['waiting_list_total'] = event.waiting_list_places + places['waiting_list_reserved'] = event.waiting_list + places['waiting_list_available'] = (event.waiting_list_places - event.waiting_list) + return places + + class Agendas(APIView): permission_classes = () @@ -342,6 +355,7 @@ class Fillslots(APIView): format=format) def fillslot(self, request, agenda_identifier=None, slots=[], format=None): + multiple_booking = bool(not slots) try: agenda = Agenda.objects.get(slug=agenda_identifier) except Agenda.DoesNotExist: @@ -559,6 +573,9 @@ class Fillslots(APIView): 'slug': available_desk.slug} if to_cancel_booking: response['cancelled_booking_id'] = cancelled_booking_id + if agenda.kind == 'events' and not multiple_booking: + event = events[0] + response['places'] = get_event_places(event) return Response(response) @@ -666,16 +683,8 @@ class SlotStatus(APIView): event = self.get_object(event_identifier) response = { 'err': 0, - 'places': { - 'total': event.places, - 'reserved': event.booked_places, - 'available': event.places - event.booked_places, - } + 'places': get_event_places(event), } - if event.waiting_list_places: - response['places']['waiting_list_total'] = event.waiting_list_places - response['places']['waiting_list_reserved'] = event.waiting_list - response['places']['waiting_list_available'] = (event.waiting_list_places - event.waiting_list) return Response(response) diff --git a/tests/test_api.py b/tests/test_api.py index 259423bb..c6d939b5 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -761,6 +761,49 @@ def test_booking_api_with_data(app, some_data, user): assert Booking.objects.all()[0].extra_data == {'hello': 'world'} +def test_booking_api_available(app, some_data, meetings_agenda, user): + agenda = Agenda.objects.filter(label=u'Foo bar')[0] + event = Event.objects.filter(agenda=agenda)[0] + + app.authorization = ('Basic', ('john.doe', 'password')) + resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk)) + assert resp.json['err'] == 0 + assert resp.json['places']['total'] == 10 + assert resp.json['places']['available'] == 9 + assert resp.json['places']['reserved'] == 1 + assert 'waiting_list_total' not in resp.json['places'] + + Booking.objects.create(event=event, in_waiting_list=True) + event.waiting_list_places = 5 + event.save() + + resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (agenda.pk, event.pk)) + assert resp.json['err'] == 0 + assert resp.json['places']['total'] == 10 + assert resp.json['places']['available'] == 9 + assert resp.json['places']['reserved'] == 1 + assert resp.json['places']['waiting_list_total'] == 5 + assert resp.json['places']['waiting_list_available'] == 3 + assert resp.json['places']['waiting_list_reserved'] == 2 + + # not for mettings agenda + meeting_type = MeetingType.objects.get(agenda=meetings_agenda) + resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.pk) + event_id = resp.json['data'][2]['id'] + resp = app.post_json('/api/agenda/%s/fillslot/%s/' % (meetings_agenda.pk, event_id)) + assert resp.json['err'] == 0 + assert 'places' not in resp.json + + # not for multiple booking + events = [x for x in Event.objects.filter(agenda=agenda).order_by('start_datetime') if x.in_bookable_period()][:2] + slots = [x.pk for x in events] + + resp = app.post('/api/agenda/%s/fillslots/' % agenda.slug, + params={'slots': slots, 'count': '3'}) + assert resp.json['err'] == 0 + assert 'places' not in resp.json + + def test_booking_api_with_cancel_booking(app, some_data, user): agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id event_0, event_1, event_2, event_3 = Event.objects.filter(agenda_id=agenda_id)[0:4]