api: include event detail in user bookings info (#60020)
This commit is contained in:
parent
1a03535d87
commit
786b0e03b3
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue