Projet

Général

Profil

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

Valentin Deniaud, 13 décembre 2021 15:17

Télécharger (6,77 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 | 53 ++++++++++++++++++++++++++++++++++---
 3 files changed, 65 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:
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.get(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 subscribed events are ordered by start_datetime
1833
    resp = app.get('/api/agendas/datetimes/', params={'subscribed': 'all', 'user_external_id': 'xxx'})
1834
    assert len(resp.json['data']) == 3
1835
    assert resp.json['data'][0]['id'] == 'second-agenda@09-05'
1836
    assert resp.json['data'][1]['id'] == 'third-agenda@09-05'
1837
    assert resp.json['data'][2]['id'] == 'first-agenda@10-05'
1838

  
1839
    # and by category slug if specified in querystring
1840
    resp = app.get(
1841
        '/api/agendas/datetimes/', params={'subscribed': 'category-b,category-a', 'user_external_id': 'xxx'}
1842
    )
1843
    assert len(resp.json['data']) == 3
1844
    assert resp.json['data'][0]['id'] == 'third-agenda@09-05'
1845
    assert resp.json['data'][1]['id'] == 'second-agenda@09-05'
1846
    assert resp.json['data'][2]['id'] == 'first-agenda@10-05'
1847

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

  
1823 1859

  
1824 1860
@pytest.mark.freeze_time('2021-05-06 14:00')
1825 1861
def test_datetimes_multiple_agendas_queries(app):
1862
    category = Category.objects.create(label='Category A')
1826 1863
    for i in range(10):
1827
        agenda = Agenda.objects.create(label=str(i), kind='events')
1864
        agenda = Agenda.objects.create(label=str(i), kind='events', category=category)
1828 1865
        Subscription.objects.create(
1829 1866
            agenda=agenda,
1830 1867
            user_external_id='xxx',
......
1852 1889
        assert len(resp.json['data']) == 30
1853 1890
        assert len(ctx.captured_queries) == 7
1854 1891

  
1892
    with CaptureQueriesContext(connection) as ctx:
1893
        resp = app.get(
1894
            '/api/agendas/datetimes/',
1895
            params={'subscribed': 'category-a', 'user_external_id': 'xxx', 'show_past_events': True},
1896
        )
1897
        assert len(resp.json['data']) == 30
1898
        assert len(ctx.captured_queries) == 7
1899

  
1855 1900

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