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