api: add booking id and urls in events fillslot result (#63044)

This commit is contained in:
Lauréline Guérin 2022-03-25 16:38:58 +01:00
parent 5ca2fa0e91
commit 9a8e19d0c6
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 86 additions and 8 deletions

View File

@ -475,6 +475,7 @@ def get_event_text(event, agenda, day=None):
def get_event_detail(
request,
event,
booking=None,
agenda=None,
min_places=1,
booked_user_external_id=None,
@ -497,6 +498,24 @@ def get_event_detail(
'url': event.url,
'duration': event.duration,
}
if booking:
details['booking'] = {
'id': booking.pk,
'api': {
'booking_url': request.build_absolute_uri(
reverse('api-booking', kwargs={'booking_pk': booking.id})
),
'cancel_url': request.build_absolute_uri(
reverse('api-cancel-booking', kwargs={'booking_pk': booking.id})
),
'ics_url': request.build_absolute_uri(
reverse('api-booking-ics', kwargs={'booking_pk': booking.id})
),
'anonymize_url': request.build_absolute_uri(
reverse('api-anonymize-booking', kwargs={'booking_pk': booking.id})
),
},
}
if event.recurrence_days:
details.update(
{
@ -1665,7 +1684,7 @@ class RecurringFillslots(APIView):
user_external_id=user_external_id, event__in=events_cancelled_to_delete
).delete()
# create missing bookings
Booking.objects.bulk_create(bookings)
created_bookings = Booking.objects.bulk_create(bookings)
response = {
'err': 0,
@ -1675,7 +1694,7 @@ class RecurringFillslots(APIView):
}
if payload.get('include_booked_events_detail'):
response['booked_events'] = [
get_event_detail(request, x, multiple_agendas=True) for x in events_to_book
get_event_detail(request, x.event, booking=x, multiple_agendas=True) for x in created_bookings
]
return Response(response)
@ -1800,7 +1819,7 @@ class EventsFillslots(APIView):
output_field=BooleanField(),
)
)
waiting_list_events = [event for event in events if event.in_waiting_list]
waiting_list_event_ids = [event.pk for event in events if event.in_waiting_list]
extra_data = {k: v for k, v in request.data.items() if k not in payload}
bookings = [make_booking(event, payload, extra_data) for event in events]
@ -1821,17 +1840,20 @@ class EventsFillslots(APIView):
user_external_id=user_external_id, event__in=events_cancelled_to_delete
).delete()
# create missing bookings
Booking.objects.bulk_create(bookings)
created_bookings = Booking.objects.bulk_create(bookings)
response = {
'err': 0,
'booking_count': len(bookings),
'booked_events': [
get_event_detail(request, x, multiple_agendas=self.multiple_agendas) for x in events
get_event_detail(request, x.event, booking=x, multiple_agendas=self.multiple_agendas)
for x in created_bookings
if x.event.pk not in waiting_list_event_ids
],
'waiting_list_events': [
get_event_detail(request, x, multiple_agendas=self.multiple_agendas)
for x in waiting_list_events
get_event_detail(request, x.event, booking=x, multiple_agendas=self.multiple_agendas)
for x in created_bookings
if x.event.pk in waiting_list_event_ids
],
'cancelled_booking_count': cancelled_count,
}

View File

@ -2417,6 +2417,10 @@ def test_recurring_events_api_fillslots(app, user, freezer, action):
assert Booking.objects.filter(user_external_id='user_id_4').count() == 1
assert len(resp.json['booked_events']) == 1
assert resp.json['booked_events'][0]['id'] == 'foo-bar@event--2021-09-14-1400'
assert (
resp.json['booked_events'][0]['booking']['id']
== Booking.objects.filter(user_external_id='user_id_4').get().pk
)
resp = app.post_json(fillslots_url, params={'slots': 'foo-bar@event:0'}, status=400)
assert resp.json['err'] == 1
@ -3595,7 +3599,14 @@ def test_api_events_fillslots(app, user):
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'][0]['booking']['id'] == Booking.objects.filter(event=event).latest('pk').pk
)
assert resp.json['booked_events'][1]['id'] == 'event-2'
assert (
resp.json['booked_events'][1]['booking']['id']
== Booking.objects.filter(event=second_event).latest('pk').pk
)
assert len(resp.json['waiting_list_events']) == 0
events = Event.objects.all()
@ -3607,7 +3618,14 @@ def test_api_events_fillslots(app, user):
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'][0]['booking']['id'] == Booking.objects.filter(event=event).latest('pk').pk
)
assert resp.json['booked_events'][1]['id'] == 'event-2'
assert (
resp.json['booked_events'][1]['booking']['id']
== Booking.objects.filter(event=second_event).latest('pk').pk
)
params['user_external_id'] = 'user_id_3'
resp = app.post_json(fillslots_url, params=params)
@ -3617,7 +3635,13 @@ def test_api_events_fillslots(app, user):
params['slots'] = 'event'
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 1
assert len(resp.json['booked_events']) == 0
assert len(resp.json['waiting_list_events']) == 1
assert resp.json['waiting_list_events'][0]['slug'] == event.slug
assert (
resp.json['waiting_list_events'][0]['booking']['id']
== Booking.objects.filter(event=event).latest('pk').pk
)
assert Booking.objects.filter(in_waiting_list=True, event=event).count() == 1
# change bookings
@ -3706,7 +3730,15 @@ def test_api_events_fillslots_with_cancelled(app, user):
assert len(resp.json['booked_events']) == 2
assert resp.json['cancelled_booking_count'] == 0
assert resp.json['booked_events'][0]['id'] == 'event-1'
assert (
resp.json['booked_events'][0]['booking']['id']
== Booking.objects.filter(event__slug='event-1').latest('pk').pk
)
assert resp.json['booked_events'][1]['id'] == 'event-3'
assert (
resp.json['booked_events'][1]['booking']['id']
== Booking.objects.filter(event__slug='event-3').latest('pk').pk
)
assert Booking.objects.filter(user_external_id='user_id').count() == 3
assert Booking.objects.filter(user_external_id='user_id', cancellation_datetime__isnull=True).count() == 3
@ -3993,7 +4025,15 @@ def test_api_events_fillslots_multiple_agendas(app, user):
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'][0]['booking']['id']
== Booking.objects.filter(event__agenda=first_agenda, event=first_event).latest('pk').pk
)
assert resp.json['booked_events'][1]['id'] == 'second-agenda@event'
assert (
resp.json['booked_events'][1]['booking']['id']
== Booking.objects.filter(event__agenda=second_agenda, event=second_event).latest('pk').pk
)
assert first_event.booking_set.filter(cancellation_datetime__isnull=True).count() == 1
assert second_event.booking_set.filter(cancellation_datetime__isnull=True).count() == 1
@ -4011,7 +4051,15 @@ def test_api_events_fillslots_multiple_agendas(app, user):
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'][0]['booking']['id']
== Booking.objects.filter(event__agenda=first_agenda, event=first_event).latest('pk').pk
)
assert resp.json['booked_events'][1]['id'] == 'second-agenda@event'
assert (
resp.json['booked_events'][1]['booking']['id']
== Booking.objects.filter(event__agenda=second_agenda, event=second_event).latest('pk').pk
)
assert first_event.booking_set.filter(cancellation_datetime__isnull=True).count() == 2
assert second_event.booking_set.filter(cancellation_datetime__isnull=True).count() == 1
@ -4080,7 +4128,7 @@ def test_api_events_fillslots_multiple_agendas_with_cancelled(app, user):
places=2,
agenda=agenda_2,
)
Event.objects.create(
event_3 = Event.objects.create(
label='Event 3',
start_datetime=now() + datetime.timedelta(days=3),
places=2,
@ -4110,7 +4158,15 @@ def test_api_events_fillslots_multiple_agendas_with_cancelled(app, user):
assert len(resp.json['booked_events']) == 2
assert resp.json['cancelled_booking_count'] == 0
assert resp.json['booked_events'][0]['id'] == 'agenda-1@event-1'
assert (
resp.json['booked_events'][0]['booking']['id']
== Booking.objects.filter(event__agenda=agenda_1, event=event_1).latest('pk').pk
)
assert resp.json['booked_events'][1]['id'] == 'agenda-2@event-3'
assert (
resp.json['booked_events'][1]['booking']['id']
== Booking.objects.filter(event__agenda=agenda_2, event=event_3).latest('pk').pk
)
assert Booking.objects.filter(user_external_id='user_id').count() == 3
assert Booking.objects.filter(user_external_id='user_id', cancellation_datetime__isnull=True).count() == 3