api: do not cancel past bookings in multiple events fillslots (#59778)

This commit is contained in:
Valentin Deniaud 2021-12-16 14:23:59 +01:00
parent 289bcd785f
commit 842d7629d8
2 changed files with 44 additions and 0 deletions

View File

@ -1693,6 +1693,7 @@ class EventsFillslots(APIView):
events = self.get_events(request, payload)
already_booked_events = self.get_already_booked_events(user_external_id)
already_booked_events = already_booked_events.filter(start_datetime__gt=now())
if start_datetime:
already_booked_events = already_booked_events.filter(start_datetime__gte=start_datetime)
if end_datetime:

View File

@ -2715,6 +2715,49 @@ def test_api_events_fillslots_past_event(app, user):
assert resp.json['err'] == 0
@pytest.mark.freeze_time('2021-09-06 12:00')
def test_api_events_fillslots_preserve_past_bookings(app, user, freezer):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
event = Event.objects.create(
label='Event', start_datetime=now() + datetime.timedelta(days=5), places=2, agenda=agenda
)
second_event = Event.objects.create(
label='Event 2', start_datetime=now() + datetime.timedelta(days=10), places=2, agenda=agenda
)
app.authorization = ('Basic', ('john.doe', 'password'))
fillslots_url = '/api/agenda/%s/events/fillslots/' % agenda.slug
params = {'user_external_id': 'user_id', 'slots': 'event,event-2'}
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 2
assert resp.json['cancelled_booking_count'] == 0
# book only second event while first event is in the past
freezer.move_to('2021-09-12')
params = {'user_external_id': 'user_id', 'slots': 'event-2'}
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 0
assert event.booking_set.count() == 1
assert second_event.booking_set.count() == 1
# do the same with multiple agendas API
params = {'user_external_id': 'user_id', 'slots': 'foo-bar@event-2'}
resp = app.post_json('/api/agendas/events/fillslots/?agendas=foo-bar', params=params)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 0
assert event.booking_set.count() == 1
assert second_event.booking_set.count() == 1
# cancel all future bookings
params = {'user_external_id': 'user_id', 'slots': ''}
resp = app.post_json(fillslots_url, params=params)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 1
assert event.booking_set.count() == 1
assert second_event.booking_set.count() == 0
@pytest.mark.freeze_time('2021-09-06 12:00')
def test_api_events_fillslots_multiple_agendas(app, user):
first_agenda = Agenda.objects.create(label='First agenda', kind='events')