api: add event slug filter in user bookings list (#60024)

This commit is contained in:
Valentin Deniaud 2022-01-04 18:03:41 +01:00
parent 786b0e03b3
commit 014dc4624e
2 changed files with 48 additions and 0 deletions

View File

@ -1872,6 +1872,7 @@ subscription = SubscriptionAPI.as_view()
class BookingFilter(filters.FilterSet):
agenda = filters.CharFilter(field_name='event__agenda__slug', lookup_expr='exact')
event = filters.CharFilter(method='filter_event')
category = filters.CharFilter(field_name='event__agenda__category__slug', lookup_expr='exact')
date_start = filters.DateFilter(field_name='event__start_datetime', lookup_expr='gte')
date_end = filters.DateFilter(field_name='event__start_datetime', method='filter_date_end')
@ -1881,6 +1882,10 @@ class BookingFilter(filters.FilterSet):
lookup = '__'.join([name, 'lt'])
return queryset.filter(**{lookup: value + datetime.timedelta(days=1)})
def filter_event(self, queryset, name, value):
# we want to include bookings of event recurrences
return queryset.filter(Q(event__slug=value) | Q(event__primary_event__slug=value))
class Meta:
model = Booking
fields = [

View File

@ -13,6 +13,7 @@ from chrono.agendas.models import (
Agenda,
Booking,
Category,
Desk,
Event,
MeetingType,
)
@ -367,6 +368,48 @@ def test_bookings_api_filter_in_waiting_list(app, user):
assert resp.json['data'][0]['id'] == booking_waiting_list.id
@pytest.mark.freeze_time('2021-05-06 14:00')
def test_bookings_api_filter_event(app, user):
agenda = Agenda.objects.create(label='Foo bar')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
normal_event = Event.objects.create(slug='normal_event', agenda=agenda, start_datetime=now(), places=10)
recurring_event = Event.objects.create(
slug='recurring-event',
start_datetime=now(),
recurrence_days=list(range(7)),
places=2,
waiting_list_places=1,
agenda=agenda,
recurrence_end_date=now() + datetime.timedelta(days=30),
)
recurring_event.create_all_recurrences()
Booking.objects.create(event=normal_event, user_external_id='42')
for recurrence in recurring_event.recurrences.all()[:5]:
Booking.objects.create(event=recurrence, user_external_id='42')
resp = app.get('/api/bookings/', params={'user_external_id': '42'})
assert resp.json['err'] == 0
assert len(resp.json['data']) == 6
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'event': normal_event.slug})
assert resp.json['err'] == 0
assert len(resp.json['data']) == 1
assert resp.json['data'][0]['event']['slug'] == normal_event.slug
resp = app.get('/api/bookings/', params={'user_external_id': '42', 'event': recurring_event.slug})
assert resp.json['err'] == 0
assert len(resp.json['data']) == 5
slugs = [booking['event']['slug'] for booking in resp.json['data']]
assert slugs == [
'recurring-event--2021-05-06-1600',
'recurring-event--2021-05-07-1600',
'recurring-event--2021-05-08-1600',
'recurring-event--2021-05-09-1600',
'recurring-event--2021-05-10-1600',
]
@pytest.mark.parametrize('flag', [True, False, None])
def test_booking_api_present(app, user, flag):
agenda = Agenda.objects.create(label='Foo bar', kind='events')