Projet

Général

Profil

0001-fix-order-for-subscriptions-in-multiple-agendas-date.patch

Valentin Deniaud, 13 décembre 2021 14:20

Télécharger (6,45 ko)

Voir les différences:

Subject: [PATCH 1/2] fix order for subscriptions in multiple agendas datetimes

 chrono/agendas/models.py    |  1 +
 chrono/api/views.py         | 16 ++++++++++++-
 tests/api/test_datetimes.py | 46 +++++++++++++++++++++++++++++++++----
 3 files changed, 58 insertions(+), 5 deletions(-)
chrono/agendas/models.py
945 945
            ),
946 946
        )
947 947
        qs = Agenda.prefetch_recurring_events(qs)
948
        qs = qs.select_related('category')
948 949
        agendas_exceptions = TimePeriodException.objects.filter(
949 950
            Q(desk__slug='_exceptions_holder', desk__agenda__in=qs)
950 951
            | Q(
chrono/api/views.py
905 905
                agenda_slug: i for i, agenda_slug in enumerate(payload['agenda_slugs'])
906 906
            }
907 907
            entries.sort(
908
                key=lambda event: (event.start_datetime, agenda_querystring_indexes[event.agenda.slug])
908
                key=lambda event: (
909
                    event.start_datetime,
910
                    agenda_querystring_indexes[event.agenda.slug],
911
                    event.slug,
912
                )
913
            )
914
        elif 'subscribed' in request.query_params and payload['subscribed'] != ['all']:
915
            category_querystring_indexes = {category: i for i, category in enumerate(payload['subscribed'])}
916
            entries.sort(
917
                key=lambda event: (
918
                    event.start_datetime,
919
                    category_querystring_indexes[event.agenda.category.slug],
920
                    event.agenda.slug,
921
                    event.slug,
922
                )
909 923
            )
910 924

  
911 925
        response = {
tests/api/test_datetimes.py
1792 1792

  
1793 1793
@pytest.mark.freeze_time('2021-05-06 14:00')
1794 1794
def test_datetimes_multiple_agendas_sort(app):
1795
    first_agenda = Agenda.objects.create(label='First agenda', kind='events')
1795
    category = Category.objects.create(label='Category A')
1796
    first_agenda = Agenda.objects.create(label='First agenda', kind='events', category=category)
1796 1797
    Desk.objects.create(agenda=first_agenda, slug='_exceptions_holder')
1797 1798
    Event.objects.create(label='10-05', start_datetime=now().replace(day=10), places=5, agenda=first_agenda)
1798
    second_agenda = Agenda.objects.create(label='Second agenda', kind='events')
1799
    second_agenda = Agenda.objects.create(label='Second agenda', kind='events', category=category)
1799 1800
    Desk.objects.create(agenda=second_agenda, slug='_exceptions_holder')
1800 1801
    Event.objects.create(label='09-05', start_datetime=now().replace(day=9), places=5, agenda=second_agenda)
1801 1802
    Event.objects.create(label='04-05', start_datetime=now().replace(day=4), places=5, agenda=second_agenda)
1802
    third_agenda = Agenda.objects.create(label='Third agenda', kind='events')
1803
    category = Category.objects.create(label='Category B')
1804
    third_agenda = Agenda.objects.create(label='Third agenda', kind='events', category=category)
1803 1805
    Desk.objects.create(agenda=third_agenda, slug='_exceptions_holder')
1804 1806
    Event.objects.create(label='09-05', start_datetime=now().replace(day=9), places=5, agenda=third_agenda)
1805 1807
    Event.objects.create(label='04-05', start_datetime=now().replace(day=4), places=5, agenda=third_agenda)
1808
    for agenda in Agenda.objects.all():
1809
        Subscription.objects.create(
1810
            agenda=agenda,
1811
            user_external_id='xxx',
1812
            date_start=now(),
1813
            date_end=now() + datetime.timedelta(days=30),
1814
        )
1806 1815

  
1807 1816
    # check events are ordered by start_datetime and then by agenda order in querystring
1808 1817
    agenda_slugs = ','.join((first_agenda.slug, third_agenda.slug, second_agenda.slug))
......
1820 1829
    assert resp.json['data'][3]['id'] == 'second-agenda@09-05'
1821 1830
    assert resp.json['data'][4]['id'] == 'first-agenda@10-05'
1822 1831

  
1832
    # check events are ordered by start_datetime and then by category order in querystring
1833
    resp = app.get(
1834
        '/api/agendas/datetimes/', params={'subscribed': 'category-b,category-a', 'user_external_id': 'xxx'}
1835
    )
1836
    assert len(resp.json['data']) == 3
1837
    assert resp.json['data'][0]['id'] == 'third-agenda@09-05'
1838
    assert resp.json['data'][1]['id'] == 'second-agenda@09-05'
1839
    assert resp.json['data'][2]['id'] == 'first-agenda@10-05'
1840

  
1841
    # order is stable if same date events are in the same category
1842
    Event.objects.create(label='09-05', start_datetime=now().replace(day=9), places=5, agenda=first_agenda)
1843
    resp = app.get(
1844
        '/api/agendas/datetimes/', params={'subscribed': 'category-b,category-a', 'user_external_id': 'xxx'}
1845
    )
1846
    assert len(resp.json['data']) == 4
1847
    assert resp.json['data'][0]['id'] == 'third-agenda@09-05'
1848
    assert resp.json['data'][1]['id'] == 'first-agenda@09-05'
1849
    assert resp.json['data'][2]['id'] == 'second-agenda@09-05'
1850
    assert resp.json['data'][3]['id'] == 'first-agenda@10-05'
1851

  
1823 1852

  
1824 1853
@pytest.mark.freeze_time('2021-05-06 14:00')
1825 1854
def test_datetimes_multiple_agendas_queries(app):
1855
    category = Category.objects.create(label='Category A')
1826 1856
    for i in range(10):
1827
        agenda = Agenda.objects.create(label=str(i), kind='events')
1857
        agenda = Agenda.objects.create(label=str(i), kind='events', category=category)
1828 1858
        Subscription.objects.create(
1829 1859
            agenda=agenda,
1830 1860
            user_external_id='xxx',
......
1852 1882
        assert len(resp.json['data']) == 30
1853 1883
        assert len(ctx.captured_queries) == 7
1854 1884

  
1885
    with CaptureQueriesContext(connection) as ctx:
1886
        resp = app.get(
1887
            '/api/agendas/datetimes/',
1888
            params={'subscribed': 'category-a', 'user_external_id': 'xxx', 'show_past_events': True},
1889
        )
1890
        assert len(resp.json['data']) == 30
1891
        assert len(ctx.captured_queries) == 7
1892

  
1855 1893

  
1856 1894
@pytest.mark.freeze_time('2021-05-06 14:00')
1857 1895
def test_datetimes_multiple_agendas_subscribed(app):
1858
-