Projet

Général

Profil

0005-api-prefetch-roles-on-agenda-display-57670.patch

Nicolas Roche, 08 octobre 2021 10:43

Télécharger (3,1 ko)

Voir les différences:

Subject: [PATCH 5/5] api: prefetch roles on agenda display (#57670)

 chrono/api/views.py   | 4 +++-
 tests/api/test_all.py | 6 +++---
 2 files changed, 6 insertions(+), 4 deletions(-)
chrono/api/views.py
702 702
        if self.request.method == 'GET':
703 703
            return []
704 704
        return [permissions.IsAuthenticated()]
705 705

  
706 706
    def get(self, request, format=None):
707 707
        agendas_queryset = (
708 708
            Agenda.objects.all()
709 709
            .select_related('absence_reasons_group')
710
            .prefetch_related('resources', 'absence_reasons_group__absence_reasons', 'category')
710
            .prefetch_related(
711
                'resources', 'absence_reasons_group__absence_reasons', 'category', 'edit_role', 'view_role'
712
            )
711 713
            .order_by('label')
712 714
        )
713 715

  
714 716
        if 'q' in request.GET:
715 717
            if not request.GET['q']:
716 718
                return Response({'data': []})
717 719
            agendas_queryset = agendas_queryset.filter(slug__icontains=request.GET['q'])
718 720

  
tests/api/test_all.py
176 176
    assert len(resp.json['data']) == 5
177 177
    resp = app.get('/api/agenda/', params={'q': 'MEET'})
178 178
    assert len(resp.json['data']) == 2
179 179
    resp = app.get('/api/agenda/', params={'q': ''})
180 180
    assert len(resp.json['data']) == 0
181 181

  
182 182
    with CaptureQueriesContext(connection) as ctx:
183 183
        resp = app.get('/api/agenda/')
184
        assert len(ctx.captured_queries) == 9
184
        assert len(ctx.captured_queries) == 7
185 185
    with CaptureQueriesContext(connection) as ctx:
186 186
        resp = app.get('/api/agenda/', params={'q': 'MEET'})
187
        assert len(ctx.captured_queries) == 4
187
        assert len(ctx.captured_queries) == 5
188 188

  
189 189
    resp = app.get('/api/agenda/', params={'with_open_events': '1'})
190 190
    assert len(resp.json['data']) == 0
191 191

  
192 192
    resp = app.get('/api/agenda/', params={'category': ''})
193 193
    assert len(resp.json['data']) == 6
194 194
    resp = app.get('/api/agenda/', params={'category': '__none__'})
195 195
    assert len(resp.json['data']) == 3
......
286 286
        TimePeriodException.objects.create(
287 287
            desk=event_agenda.desk_set.get(),
288 288
            start_datetime=now(),
289 289
            end_datetime=now() + datetime.timedelta(hours=1),
290 290
        )
291 291

  
292 292
    with CaptureQueriesContext(connection) as ctx:
293 293
        resp = app.get('/api/agenda/', params={'with_open_events': '1'})
294
        assert len(ctx.captured_queries) == 10
294
        assert len(ctx.captured_queries) == 11
295 295

  
296 296

  
297 297
def test_agendas_meetingtypes_api(app, some_data, meetings_agenda):
298 298
    resp = app.get('/api/agenda/%s/meetings/' % meetings_agenda.slug)
299 299
    expected_resp = {
300 300
        'data': [
301 301
            {
302 302
                'text': 'Blah',
303
-