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