api: sort events by start time in recurring events list (#60461)

This commit is contained in:
Valentin Deniaud 2022-01-11 14:32:01 +01:00
parent 39f78e0cc2
commit 4c66e5a303
2 changed files with 30 additions and 1 deletions

View File

@ -1110,6 +1110,7 @@ class RecurringEventsList(APIView):
events.sort(
key=lambda event: (
event.day if data.get('sort') == 'day' else event.start_datetime,
event.start_datetime.time(),
agenda_querystring_indexes[event.agenda.slug],
event.slug,
)
@ -1120,6 +1121,7 @@ class RecurringEventsList(APIView):
events.sort(
key=lambda event: (
event.day if data.get('sort') == 'day' else event.start_datetime,
event.start_datetime.time(),
category_querystring_indexes[event.agenda.category.slug] if sort_by_category else None,
event.agenda.slug,
event.slug,

View File

@ -1440,10 +1440,37 @@ def test_recurring_events_api_list(app, freezer):
assert resp.json['err'] == 1
assert resp.json['errors']['sort'][0] == '"invalid" is not a valid choice.'
Event.objects.create(
label='New event one hour before',
slug='one-hour-before',
start_datetime=now() - datetime.timedelta(hours=1),
recurrence_days=[3], # Thursday
places=2,
agenda=agenda,
recurrence_end_date=now() + datetime.timedelta(days=30),
)
Event.objects.create(
label='New event two hours before but one week later',
slug='two-hours-before',
start_datetime=now() + datetime.timedelta(days=6, hours=22),
recurrence_days=[3], # Thursday
places=2,
agenda=agenda,
recurrence_end_date=now() + datetime.timedelta(days=30),
)
resp = app.get('/api/agendas/recurring-events/?agendas=%s&sort=day' % agenda.slug)
assert len(resp.json['data']) == 6
assert resp.json['data'][0]['id'] == 'foo-bar@example-event:0'
assert resp.json['data'][1]['id'] == 'foo-bar@other:1'
assert resp.json['data'][2]['id'] == 'foo-bar@two-hours-before:3'
assert resp.json['data'][3]['id'] == 'foo-bar@one-hour-before:3'
assert resp.json['data'][4]['id'] == 'foo-bar@example-event:3'
assert resp.json['data'][5]['id'] == 'foo-bar@example-event:4'
event.publication_datetime = now() + datetime.timedelta(days=2)
event.save()
resp = app.get('/api/agendas/recurring-events/?agendas=%s' % agenda.slug)
assert len(resp.json['data']) == 1
assert len(resp.json['data']) == 3
freezer.move_to(event.recurrence_end_date)
resp = app.get('/api/agendas/recurring-events/?agendas=%s' % agenda.slug)