api: add option to return booked events detail in fillslots APIs (#60023)

This commit is contained in:
Valentin Deniaud 2021-12-23 15:07:29 +01:00
parent e2612b0303
commit 4c52f29cfd
3 changed files with 33 additions and 1 deletions

View File

@ -100,6 +100,8 @@ class MultipleAgendasEventsSlotsSerializer(EventsSlotsSerializer):
class RecurringFillslotsSerializer(MultipleAgendasEventsSlotsSerializer):
include_booked_events_detail = serializers.BooleanField(default=False)
def validate_slots(self, value):
super().validate_slots(value)
open_event_slugs = collections.defaultdict(set)

View File

@ -1682,6 +1682,10 @@ class RecurringFillslots(APIView):
'cancelled_booking_count': deleted_count,
'full_events': [get_event_detail(request, x, multiple_agendas=True) for x in full_events],
}
if payload.get('include_booked_events_detail'):
response['booked_events'] = [
get_event_detail(request, x, multiple_agendas=True) for x in events_to_book
]
return Response(response)
@ -1692,6 +1696,7 @@ class EventsFillslots(APIView):
permission_classes = (permissions.IsAuthenticated,)
serializer_class = serializers.EventsSlotsSerializer
serializer_extra_context = None
multiple_agendas = False
def post(self, request, agenda_identifier):
self.agenda = get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
@ -1762,7 +1767,13 @@ class EventsFillslots(APIView):
response = {
'err': 0,
'booking_count': len(bookings),
'waiting_list_events': [get_event_detail(request, x) for x in waiting_list_events],
'booked_events': [
get_event_detail(request, x, multiple_agendas=self.multiple_agendas) for x in events
],
'waiting_list_events': [
get_event_detail(request, x, multiple_agendas=self.multiple_agendas)
for x in waiting_list_events
],
'cancelled_booking_count': deleted_count,
}
return Response(response)
@ -1782,6 +1793,7 @@ events_fillslots = EventsFillslots.as_view()
class MultipleAgendasEventsFillslots(EventsFillslots):
serializer_class = serializers.MultipleAgendasEventsSlotsSerializer
multiple_agendas = True
def post(self, request):
serializer = serializers.AgendaOrSubscribedSlugsSerializer(

View File

@ -2181,6 +2181,7 @@ def test_recurring_events_api_fillslots(app, user, freezer):
params['slots'] = 'foo-bar@event:0,foo-bar@event:3,foo-bar@sunday-event:6'
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 156
assert 'booked_events' not in resp.json
assert Booking.objects.count() == 156
assert Booking.objects.filter(event__primary_event=event).count() == 104
@ -2223,9 +2224,13 @@ def test_recurring_events_api_fillslots(app, user, freezer):
assert resp.json['booking_count'] == 0
params['slots'] = 'foo-bar@event:1'
params['include_booked_events_detail'] = True
resp = app.post_json(fillslots_url + '&date_start=2021-10-06&date_end=2021-11-06', params=params)
assert resp.json['booking_count'] == 4
assert Booking.objects.filter(user_external_id='user_id_4').count() == 4
assert len(resp.json['booked_events']) == 4
assert resp.json['booked_events'][0]['id'] == 'foo-bar@event--2021-10-12-1400'
assert resp.json['booked_events'][1]['id'] == 'foo-bar@event--2021-10-19-1400'
resp = app.post_json(fillslots_url, params={'slots': 'foo-bar@event:0'}, status=400)
assert resp.json['err'] == 1
@ -2587,6 +2592,9 @@ def test_api_events_fillslots(app, user):
params = {'user_external_id': 'user_id', 'slots': 'event,event-2'}
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 2
assert len(resp.json['booked_events']) == 2
assert resp.json['booked_events'][0]['id'] == 'event'
assert resp.json['booked_events'][1]['id'] == 'event-2'
assert len(resp.json['waiting_list_events']) == 0
events = Event.objects.all()
@ -2595,7 +2603,10 @@ def test_api_events_fillslots(app, user):
params['user_external_id'] = 'user_id_2'
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 2
assert len(resp.json['booked_events']) == 2
assert len(resp.json['waiting_list_events']) == 0
assert resp.json['booked_events'][0]['id'] == 'event'
assert resp.json['booked_events'][1]['id'] == 'event-2'
params['user_external_id'] = 'user_id_3'
resp = app.post_json(fillslots_url, params=params)
@ -2910,6 +2921,9 @@ def test_api_events_fillslots_multiple_agendas(app, user):
params = {'user_external_id': 'user_id', 'slots': event_slugs}
resp = app.post_json('/api/agendas/events/fillslots/?agendas=%s' % agenda_slugs, params=params)
assert resp.json['booking_count'] == 2
assert len(resp.json['booked_events']) == 2
assert resp.json['booked_events'][0]['id'] == 'first-agenda@event'
assert resp.json['booked_events'][1]['id'] == 'second-agenda@event'
assert first_event.booking_set.count() == 1
assert second_event.booking_set.count() == 1
@ -2917,6 +2931,7 @@ def test_api_events_fillslots_multiple_agendas(app, user):
params = {'user_external_id': 'user_id', 'slots': 'first-agenda@event'}
resp = app.post_json('/api/agendas/events/fillslots/?agendas=%s' % agenda_slugs, params=params)
assert resp.json['booking_count'] == 0
assert len(resp.json['booked_events']) == 0
assert resp.json['cancelled_booking_count'] == 1
assert first_event.booking_set.count() == 1
assert second_event.booking_set.count() == 0
@ -2924,6 +2939,9 @@ def test_api_events_fillslots_multiple_agendas(app, user):
params = {'user_external_id': 'user_id_2', 'slots': event_slugs}
resp = app.post_json('/api/agendas/events/fillslots/?agendas=%s' % agenda_slugs, params=params)
assert resp.json['booking_count'] == 2
assert len(resp.json['booked_events']) == 2
assert resp.json['booked_events'][0]['id'] == 'first-agenda@event'
assert resp.json['booked_events'][1]['id'] == 'second-agenda@event'
assert first_event.booking_set.count() == 2
assert second_event.booking_set.count() == 1