api: list bookings of user_external_id for an event (#40719)

This commit is contained in:
Lauréline Guérin 2020-05-12 10:26:43 +02:00
parent 1584b52ed3
commit d41b9ab20b
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 94 additions and 0 deletions

View File

@ -33,6 +33,11 @@ urlpatterns = [
views.slot_status,
name='api-event-status',
),
url(
r'^agenda/(?P<agenda_identifier>[\w-]+)/bookings/(?P<event_identifier>[\w-]+)/$',
views.slot_bookings,
name='api-event-bookings',
),
url(
r'^agenda/meetings/(?P<meeting_identifier>[\w-]+)/datetimes/$',
views.meeting_datetimes,

View File

@ -1099,6 +1099,34 @@ class SlotStatus(APIView):
slot_status = SlotStatus.as_view()
class SlotBookings(APIView):
permission_classes = (permissions.IsAuthenticated,)
def get_object(self, agenda_identifier, event_identifier):
return get_object_or_404(Event, slug=event_identifier, agenda__slug=agenda_identifier)
def get(self, request, agenda_identifier=None, event_identifier=None, format=None):
if not request.GET.get('user_external_id'):
response = {
'err': 1,
'err_class': 'missing param user_external_id',
'err_desc': _('missing param user_external_id'),
}
return Response(response)
event = self.get_object(agenda_identifier, event_identifier)
booking_queryset = event.booking_set.filter(
user_external_id=request.GET['user_external_id'], primary_booking__isnull=True
).order_by('pk')
response = {
'err': 0,
'data': [{'booking_id': b.pk, 'in_waiting_list': b.in_waiting_list} for b in booking_queryset],
}
return Response(response)
slot_bookings = SlotBookings.as_view()
class BookingICS(APIView):
permission_classes = (permissions.IsAuthenticated,)

View File

@ -1303,6 +1303,67 @@ def test_status(app, some_data, user):
resp = app.get('/api/agenda/%s/status/%s/' % (agenda_id, 'unknown'), status=404)
def test_bookings(app, some_data, user):
agenda = Agenda.objects.filter(label=u'Foo bar')[0]
event = Event.objects.filter(agenda=agenda).exclude(start_datetime__lt=now())[0]
event.slug = 'event-slug'
event.places = 5
event.waiting_list_places = 5
event.save()
# create a booking not on the waiting list
primary1 = Booking.objects.create(event=event, in_waiting_list=False, user_external_id='42')
Booking.objects.create(
event=event, in_waiting_list=False, primary_booking=primary1, user_external_id='42'
)
primary2 = Booking.objects.create(event=event, in_waiting_list=False, user_external_id='foobar')
Booking.objects.create(event=event, in_waiting_list=False, user_external_id='')
primary4 = Booking.objects.create(event=event, in_waiting_list=True, user_external_id='42')
app.authorization = ('Basic', ('john.doe', 'password'))
# unknown agenda
resp = app.get(
'/api/agenda/foobar/bookings/%s/' % (event.pk), params={'user_external_id': '42'}, status=404
)
# unknown event
resp = app.get(
'/api/agenda/%s/bookings/0/' % (agenda.slug), params={'user_external_id': '42'}, status=404
)
resp = app.get(
'/api/agenda/%s/bookings/foobar/' % (agenda.slug), params={'user_external_id': '42'}, status=404
)
resp = app.get(
'/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': '42'}
)
assert resp.json['err'] == 0
assert resp.json['data'] == [
{'booking_id': primary1.pk, 'in_waiting_list': False},
{'booking_id': primary4.pk, 'in_waiting_list': True},
]
resp = app.get(
'/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': 'foobar'}
)
assert resp.json['err'] == 0
assert resp.json['data'] == [
{'booking_id': primary2.pk, 'in_waiting_list': False},
]
resp = app.get(
'/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': '35'}
)
assert resp.json['err'] == 0
assert resp.json['data'] == []
# no user_external_id in params
resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug), params={'user_external_id': ''})
assert resp.json['err'] == 1
assert resp.json['reason'] == 'missing param user_external_id' # legacy
assert resp.json['err_class'] == 'missing param user_external_id'
assert resp.json['err_desc'] == 'missing param user_external_id'
resp = app.get('/api/agenda/%s/bookings/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 1
def test_waiting_list_datetimes(app, some_data, user):
agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]