api: add booking id and urls in events fillslot result (#63044)
This commit is contained in:
parent
5ca2fa0e91
commit
9a8e19d0c6
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue