api: include event detail in user bookings info (#60020)

This commit is contained in:
Valentin Deniaud 2022-01-04 16:33:53 +01:00
parent 1a03535d87
commit 786b0e03b3
2 changed files with 38 additions and 17 deletions

View File

@ -1905,16 +1905,25 @@ class BookingsAPI(ListAPIView):
raise APIError(N_('missing param user_external_id'))
try:
response = super().get(request, *args, **kwargs)
bookings = self.filter_queryset(self.get_queryset())
except ValidationError as e:
raise APIErrorBadRequest(N_('invalid payload'), errors=e.detail)
return Response({'err': 0, 'data': response.data})
data = []
for booking in bookings:
serialized_booking = self.serializer_class(booking).data
if booking.event.agenda.kind == 'events':
serialized_booking['event'] = get_event_detail(request, booking.event)
data.append(serialized_booking)
return Response({'err': 0, 'data': data})
def get_queryset(self):
return Booking.objects.filter(
primary_booking__isnull=True, cancellation_datetime__isnull=True
).order_by('event__start_datetime', 'event__slug', 'event__agenda__slug', 'pk')
return (
Booking.objects.filter(primary_booking__isnull=True, cancellation_datetime__isnull=True)
.select_related('event', 'event__agenda')
.order_by('event__start_datetime', 'event__slug', 'event__agenda__slug', 'pk')
)
bookings = BookingsAPI.as_view()

View File

@ -3,6 +3,8 @@ import urllib.parse as urlparse
from unittest import mock
import pytest
from django.db import connection
from django.test.utils import CaptureQueriesContext
from django.utils.timezone import make_aware, now
from chrono.agendas.models import (
@ -130,9 +132,9 @@ def test_booking_ics(app, some_data, meetings_agenda, user):
def test_bookings_api(app, user):
events_agenda = Agenda.objects.create(kind='events')
events_agenda = Agenda.objects.create(label='Foo bar', kind='events')
events_event = Event.objects.create(
agenda=events_agenda, start_datetime=now() + datetime.timedelta(days=3), places=10
label='Event A', agenda=events_agenda, start_datetime=now() + datetime.timedelta(days=3), places=10
)
events_booking1 = Booking.objects.create(event=events_event, user_external_id='enfant-1234')
events_booking2 = Booking.objects.create(event=events_event, user_external_id='enfant-1234')
@ -162,7 +164,10 @@ def test_bookings_api(app, user):
assert resp.json['err_class'] == 'missing param user_external_id'
assert resp.json['err_desc'] == 'missing param user_external_id'
resp = app.get('/api/bookings/', params={'user_external_id': 'enfant-1234'})
with CaptureQueriesContext(connection) as ctx:
resp = app.get('/api/bookings/', params={'user_external_id': 'enfant-1234'})
assert len(ctx.captured_queries) == 2
assert resp.json['err'] == 0
assert resp.json['data'] == [
{
@ -178,6 +183,7 @@ def test_bookings_api(app, user):
'user_was_present': None,
'user_absence_reason': '',
'extra_data': None,
'event': resp.json['data'][1]['event'],
},
{
'id': events_booking2.pk,
@ -185,9 +191,15 @@ def test_bookings_api(app, user):
'user_was_present': None,
'user_absence_reason': '',
'extra_data': None,
'event': resp.json['data'][1]['event'],
},
]
event_details = resp.json['data'][1]['event']
assert event_details['label'] == 'Event A'
assert event_details['places']['available'] == 5
assert event_details['api']['backoffice_url'].startswith('http')
def test_bookings_api_filter_agenda(app, user):
bookings = []
@ -209,7 +221,7 @@ def test_bookings_api_filter_category(app, user):
bookings = []
for label in ['foobar', 'foobaz']:
category = Category.objects.create(label=label)
agenda = Agenda.objects.create(category=category)
agenda = Agenda.objects.create(label='Foo bar', category=category)
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
bookings.append(Booking.objects.create(event=event, user_external_id='42'))
@ -223,7 +235,7 @@ def test_bookings_api_filter_category(app, user):
def test_bookings_api_filter_date_start(app, user):
agenda = Agenda.objects.create()
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(
agenda=agenda, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 0, 0)), places=10
)
@ -260,7 +272,7 @@ def test_bookings_api_filter_date_start(app, user):
def test_bookings_api_filter_date_end(app, user):
agenda = Agenda.objects.create()
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(
agenda=agenda, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 0, 0)), places=10
)
@ -297,7 +309,7 @@ def test_bookings_api_filter_date_end(app, user):
def test_bookings_api_filter_user_was_present(app, user):
agenda = Agenda.objects.create()
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(
agenda=agenda, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 0, 0)), places=10
)
@ -315,7 +327,7 @@ def test_bookings_api_filter_user_was_present(app, user):
def test_bookings_api_filter_user_absence_reason(app, user):
agenda = Agenda.objects.create()
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(
agenda=agenda, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 0, 0)), places=10
)
@ -332,7 +344,7 @@ def test_bookings_api_filter_user_absence_reason(app, user):
def test_bookings_api_filter_in_waiting_list(app, user):
agenda = Agenda.objects.create()
agenda = Agenda.objects.create(label='Foo bar')
event = Event.objects.create(
agenda=agenda, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 0, 0)), places=10
)
@ -357,7 +369,7 @@ def test_bookings_api_filter_in_waiting_list(app, user):
@pytest.mark.parametrize('flag', [True, False, None])
def test_booking_api_present(app, user, flag):
agenda = Agenda.objects.create(kind='events')
agenda = Agenda.objects.create(label='Foo bar', kind='events')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
booking = Booking.objects.create(event=event, user_was_present=flag, user_absence_reason='foobar')
@ -370,7 +382,7 @@ def test_booking_api_present(app, user, flag):
@pytest.mark.parametrize('flag', [True, False])
def test_booking_api_waiting_list(app, user, flag):
agenda = Agenda.objects.create(kind='events')
agenda = Agenda.objects.create(label='Foo bar', kind='events')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
booking = Booking.objects.create(event=event, in_waiting_list=flag)
@ -382,7 +394,7 @@ def test_booking_api_waiting_list(app, user, flag):
def test_booking_api_error(app, user):
agenda = Agenda.objects.create(kind='events')
agenda = Agenda.objects.create(label='Foo bar', kind='events')
event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
booking = Booking.objects.create(event=event)