From 084c7525836b2b71e335fcbe893d45dff9f8aee7 Mon Sep 17 00:00:00 2001 From: Erwan Rouchet <rouchet@teklia.com> Date: Tue, 6 Oct 2020 16:32:00 +0200 Subject: [PATCH] Prevent duplicate queries in ListRepositories Closes #482 --- arkindex/dataimport/api.py | 13 +++++++++---- arkindex/dataimport/tests/test_repos.py | 15 ++++++++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/arkindex/dataimport/api.py b/arkindex/dataimport/api.py index 2b8f2a8398..2103c385cc 100644 --- a/arkindex/dataimport/api.py +++ b/arkindex/dataimport/api.py @@ -525,10 +525,15 @@ class RepositoryList(ListAPIView): } def get_queryset(self): - return Repository.objects.filter( - Q(corpora__isnull=True) - | Q(corpora__in=Corpus.objects.readable(self.request.user)) - ).distinct().order_by('url') + return Repository.objects \ + .filter( + Q(corpora__isnull=True) + | Q(corpora__in=Corpus.objects.readable(self.request.user)) + ) \ + .distinct() \ + .select_related('credentials') \ + .prefetch_related('corpora', 'workers') \ + .order_by('url') class AvailableRepositoriesList(ListCreateAPIView): diff --git a/arkindex/dataimport/tests/test_repos.py b/arkindex/dataimport/tests/test_repos.py index 5fb52a988b..7d4966f51a 100644 --- a/arkindex/dataimport/tests/test_repos.py +++ b/arkindex/dataimport/tests/test_repos.py @@ -71,7 +71,8 @@ class TestRepositories(FixtureTestCase): self.assertEqual(Workflow.objects.count(), 0) def test_list_repository_requires_login(self): - response = self.client.get(reverse('api:repository-list')) + with self.assertNumQueries(0): + response = self.client.get(reverse('api:repository-list')) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) def test_list_repository_with_workers(self): @@ -82,7 +83,8 @@ class TestRepositories(FixtureTestCase): repository=self.repo ) self.client.force_login(self.user) - response = self.client.get(reverse('api:repository-list')) + with self.assertNumQueries(6): + response = self.client.get(reverse('api:repository-list')) self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() self.assertEqual(len(data['results']), 1) @@ -103,7 +105,8 @@ class TestRepositories(FixtureTestCase): def test_list_repository_external_user(self): self.client.force_login(self.user) - response = self.client.get(reverse('api:repository-list')) + with self.assertNumQueries(6): + response = self.client.get(reverse('api:repository-list')) self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() self.assertEqual(len(data['results']), 1) @@ -119,7 +122,8 @@ class TestRepositories(FixtureTestCase): def test_list_repository_internal_user(self): self.client.force_login(self.internal_user) - response = self.client.get(reverse('api:repository-list')) + with self.assertNumQueries(6): + response = self.client.get(reverse('api:repository-list')) self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() self.assertEqual(len(data['results']), 1) @@ -139,7 +143,8 @@ class TestRepositories(FixtureTestCase): """ self.repo.corpora.create() self.client.force_login(self.internal_user) - response = self.client.get(reverse('api:repository-list')) + with self.assertNumQueries(6): + response = self.client.get(reverse('api:repository-list')) self.assertEqual(response.status_code, status.HTTP_200_OK) data = response.json() self.assertEqual(len(data['results']), 1) -- GitLab