From b7af627dda0f4fcd4991fd926917e61e7a401879 Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Wed, 10 Apr 2024 14:40:50 +0200
Subject: [PATCH] Avoid extra query when updating unique_elements from True to
 True

---
 arkindex/training/serializers.py             |  4 +++-
 arkindex/training/tests/test_datasets_api.py | 20 ++++++++++----------
 2 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/arkindex/training/serializers.py b/arkindex/training/serializers.py
index 048dcecf63..b7bd7f9110 100644
--- a/arkindex/training/serializers.py
+++ b/arkindex/training/serializers.py
@@ -580,7 +580,9 @@ class DatasetSerializer(serializers.ModelSerializer):
         return set_names
 
     def validate_unique_elements(self, unique):
-        if unique is True and self.instance and (
+        # When updating a dataset to switch unique_elements from False to True,
+        # check that it does not contain duplicates.
+        if unique is True and self.instance and not self.instance.unique_elements and (
             DatasetElement.objects
             .filter(set__dataset_id=self.instance.pk)
             .values("element_id")
diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py
index 1dc9beda71..ce1d83ce0a 100644
--- a/arkindex/training/tests/test_datasets_api.py
+++ b/arkindex/training/tests/test_datasets_api.py
@@ -494,7 +494,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_name_too_long(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -509,7 +509,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_update_name_already_exists_in_corpus(self):
         Dataset.objects.create(name="Another Dataset", description="A set of data", corpus=self.corpus, creator=self.dataset_creator)
         self.client.force_login(self.user)
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -523,7 +523,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_requires_all_fields(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={"name": "Shin Seiki Evangelion"},
@@ -535,7 +535,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_update_sets_forbidden(self):
         self.client.force_login(self.user)
         self.assertIsNone(self.dataset.task_id)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -550,7 +550,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_empty_or_blank_description_or_name(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -567,7 +567,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_all_errors(self):
         self.client.force_login(self.user)
-        with self.assertNumQueries(5):
+        with self.assertNumQueries(4):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -620,7 +620,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         self.client.force_login(self.user)
         self.dataset.state = DatasetState.Building
         self.dataset.save()
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 data={
@@ -638,7 +638,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
     def test_update_ponos_task_state_update(self):
         self.dataset.state = DatasetState.Building
         self.dataset.save()
-        with self.assertNumQueries(7):
+        with self.assertNumQueries(6):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -721,7 +721,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
 
     def test_update_ponos_task_state_requires_dataset_in_process(self):
         self.process.process_sets.all().delete()
-        with self.assertNumQueries(6):
+        with self.assertNumQueries(5):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
@@ -738,7 +738,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
         })
 
     def test_update_ponos_task_bad_state(self):
-        with self.assertNumQueries(4):
+        with self.assertNumQueries(3):
             response = self.client.put(
                 reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
                 HTTP_AUTHORIZATION=f"Ponos {self.task.token}",
-- 
GitLab