Projet

Général

Profil

0002-fix-order-for-subscriptions-in-recurring-events-list.patch

Valentin Deniaud, 13 décembre 2021 14:20

Télécharger (5,32 ko)

Voir les différences:

Subject: [PATCH 2/2] fix order for subscriptions in recurring events list

 chrono/api/views.py         | 16 ++++++++++++++--
 tests/api/test_datetimes.py | 33 ++++++++++++++++++++++++++++++---
 2 files changed, 44 insertions(+), 5 deletions(-)
chrono/api/views.py
1080 1080
            raise APIErrorBadRequest(N_('invalid payload'), errors=serializer.errors)
1081 1081
        data = serializer.validated_data
1082 1082

  
1083
        agendas = Agenda.prefetch_recurring_events(data['agendas'])
1083
        agendas = Agenda.prefetch_recurring_events(data['agendas']).select_related('category')
1084 1084
        events = []
1085 1085
        for agenda in agendas:
1086 1086
            for event in agenda.get_open_recurring_events():
......
1093 1093
            agenda_querystring_indexes = {
1094 1094
                agenda_slug: i for i, agenda_slug in enumerate(data['agenda_slugs'])
1095 1095
            }
1096
            events.sort(key=lambda event: (event.day, agenda_querystring_indexes[event.agenda.slug]))
1096
            events.sort(
1097
                key=lambda event: (event.day, agenda_querystring_indexes[event.agenda.slug], event.slug)
1098
            )
1099
        elif 'subscribed' in request.query_params and data['subscribed'] != ['all']:
1100
            category_querystring_indexes = {category: i for i, category in enumerate(data['subscribed'])}
1101
            events.sort(
1102
                key=lambda event: (
1103
                    event.day,
1104
                    category_querystring_indexes[event.agenda.category.slug],
1105
                    event.agenda.slug,
1106
                    event.slug,
1107
                )
1108
            )
1097 1109

  
1098 1110
        return Response(
1099 1111
            {
tests/api/test_datetimes.py
1448 1448

  
1449 1449
@pytest.mark.freeze_time('2021-09-06 12:00')
1450 1450
def test_recurring_events_api_list_multiple_agendas_queries(app):
1451
    category = Category.objects.create(label='Category A')
1451 1452
    for i in range(20):
1452
        agenda = Agenda.objects.create(slug=f'{i}', kind='events')
1453
        agenda = Agenda.objects.create(slug=f'{i}', kind='events', category=category)
1453 1454
        Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
1454 1455
        start, end = now(), now() + datetime.timedelta(days=30)
1455 1456
        Event.objects.create(
1456 1457
            start_datetime=start, places=2, recurrence_end_date=end, recurrence_days=[1, 2], agenda=agenda
1457 1458
        )
1459
        Subscription.objects.create(
1460
            agenda=agenda,
1461
            user_external_id='xxx',
1462
            date_start=now(),
1463
            date_end=now() + datetime.timedelta(days=60),
1464
        )
1458 1465
    with CaptureQueriesContext(connection) as ctx:
1459 1466
        resp = app.get('/api/agendas/recurring-events/?agendas=%s' % ','.join(str(i) for i in range(20)))
1460 1467
        assert len(resp.json['data']) == 40
1461 1468
        assert len(ctx.captured_queries) == 3
1462 1469

  
1470
    with CaptureQueriesContext(connection) as ctx:
1471
        resp = app.get('/api/agendas/recurring-events/?subscribed=category-a&user_external_id=xxx')
1472
        assert len(resp.json['data']) == 40
1473
        assert len(ctx.captured_queries) == 3
1474

  
1463 1475

  
1464 1476
@pytest.mark.freeze_time('2021-09-06 12:00')
1465 1477
def test_recurring_events_api_list_subscribed(app, user):
......
1472 1484
        start_datetime=now(),
1473 1485
        recurrence_days=[0, 1, 3, 4],  # Monday, Tuesday, Thursday, Friday
1474 1486
        places=2,
1475
        waiting_list_places=1,
1476 1487
        agenda=first_agenda,
1477 1488
        recurrence_end_date=now() + datetime.timedelta(days=364),
1478 1489
    )
......
1481 1492
        start_datetime=now(),
1482 1493
        recurrence_days=[6],
1483 1494
        places=2,
1484
        waiting_list_places=1,
1485 1495
        agenda=second_agenda,
1486 1496
        recurrence_end_date=now() + datetime.timedelta(days=364),
1487 1497
    )
......
1528 1538
    resp = app.get('/api/agendas/recurring-events/?user_external_id=yyy&subscribed=all')
1529 1539
    assert len(resp.json['data']) == 1
1530 1540

  
1541
    # sorting depends on querystring order
1542
    Event.objects.create(
1543
        slug='event',
1544
        start_datetime=now(),
1545
        recurrence_days=[0],
1546
        places=2,
1547
        agenda=second_agenda,
1548
        recurrence_end_date=now() + datetime.timedelta(days=364),
1549
    )
1550
    resp = app.get('/api/agendas/recurring-events/?subscribed=category-a,category-b&user_external_id=xxx')
1551
    event_ids = [x['id'] for x in resp.json['data']]
1552
    assert event_ids.index('first-agenda@event:0') < event_ids.index('second-agenda@event:0')
1553

  
1554
    resp = app.get('/api/agendas/recurring-events/?subscribed=category-b,category-a&user_external_id=xxx')
1555
    event_ids = [x['id'] for x in resp.json['data']]
1556
    assert event_ids.index('first-agenda@event:0') > event_ids.index('second-agenda@event:0')
1557

  
1531 1558

  
1532 1559
@pytest.mark.freeze_time('2021-05-06 14:00')
1533 1560
def test_datetimes_multiple_agendas(app):
1534
-