From 5ace600fb73bd39aaf168d67fab0dd7970028599 Mon Sep 17 00:00:00 2001 From: Erwan Rouchet <rouchet@teklia.com> Date: Wed, 26 Jun 2024 16:13:01 +0000 Subject: [PATCH] Bump Django 4.2 and DRF 3.15.2 --- .gitlab-ci.yml | 2 +- Dockerfile | 4 +- arkindex/documents/migrations/0003_initial.py | 2 +- arkindex/documents/serializers/elements.py | 6 +- .../tests/tasks/test_add_parent_selection.py | 6 +- .../tests/test_bulk_transcription_entities.py | 10 +-- .../tests/test_destroy_worker_results.py | 2 +- arkindex/documents/tests/test_entities_api.py | 4 +- arkindex/documents/tests/test_entity_types.py | 2 +- arkindex/documents/tests/test_search_api.py | 2 +- .../documents/tests/test_selection_api.py | 4 +- .../documents/tests/test_transcriptions.py | 4 +- arkindex/ponos/tests/test_api.py | 8 +- .../tests/commands/test_cache_worker_runs.py | 4 +- .../tests/test_process_dataset_sets.py | 2 +- .../process/tests/test_process_elements.py | 2 +- arkindex/process/tests/test_processes.py | 16 ++-- arkindex/process/tests/test_signals.py | 2 +- arkindex/process/tests/test_workerruns.py | 2 +- arkindex/process/tests/test_workers.py | 18 ++--- arkindex/process/utils.py | 13 +-- arkindex/project/tests/test_argparse.py | 4 +- arkindex/project/tools.py | 4 +- arkindex/sql_validation/add_first_parent.sql | 10 +-- arkindex/sql_validation/add_second_parent.sql | 8 +- .../element_move_with_children.sql | 10 +-- .../element_move_without_child.sql | 10 +-- .../sql_validation/element_trash_children.sql | 40 +++++----- .../sql_validation/element_trash_deep.sql | 80 +++++++++---------- .../sql_validation/element_trash_ml_class.sql | 20 ++--- arkindex/sql_validation/indexer_prefetch.sql | 2 +- .../process_elements_filter_type.sql | 2 +- .../process_elements_top_level.sql | 2 +- .../process_elements_with_image.sql | 2 +- arkindex/sql_validation/remove_child.sql | 2 +- .../remove_child_last_parent.sql | 4 +- .../remove_children_multiple_parents.sql | 4 +- .../remove_children_no_parents.sql | 2 +- .../remove_children_single_parent.sql | 2 +- .../worker_results_delete_all_versions.sql | 20 ++--- .../worker_results_delete_in_corpus.sql | 20 ++--- ...r_results_delete_under_parent_included.sql | 20 ++--- ...elete_under_parent_included_worker_run.sql | 20 ++--- arkindex/training/serializers.py | 3 + .../training/tests/test_dataset_sets_api.py | 22 ++--- arkindex/training/tests/test_datasets_api.py | 42 +++++----- arkindex/training/tests/test_model_api.py | 10 +-- .../tests/test_model_compatible_worker.py | 42 +++++----- arkindex/users/api.py | 3 - arkindex/users/serializers.py | 16 +++- arkindex/users/tests/test_registration.py | 6 +- base/requirements.txt | 2 +- requirements.txt | 2 +- tests-requirements.txt | 1 + 54 files changed, 287 insertions(+), 265 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ca2ec5a629..c58015fa04 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,7 +11,7 @@ include: # For jobs that run backend scripts directly .backend-setup: - image: registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia + image: registry.gitlab.teklia.com/arkindex/backend/base:django-4.2 cache: paths: diff --git a/Dockerfile b/Dockerfile index 29185f9b0d..591f81dd54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,11 @@ # syntax=docker/dockerfile:1 -FROM registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia as build +FROM registry.gitlab.teklia.com/arkindex/backend/base:django-4.2 as build RUN mkdir build ADD . build RUN cd build && python3 setup.py sdist -FROM registry.gitlab.teklia.com/arkindex/backend/base:gitlab-teklia +FROM registry.gitlab.teklia.com/arkindex/backend/base:django-4.2 # Install arkindex and its deps # Uses a source archive instead of full local copy to speedup docker build diff --git a/arkindex/documents/migrations/0003_initial.py b/arkindex/documents/migrations/0003_initial.py index bae7596a20..7a59f33418 100644 --- a/arkindex/documents/migrations/0003_initial.py +++ b/arkindex/documents/migrations/0003_initial.py @@ -287,7 +287,7 @@ class Migration(migrations.Migration): ), migrations.AddConstraint( model_name="element", - constraint=models.CheckConstraint(check=models.Q(models.Q(("image_id", None), ("polygon", None)), models.Q(models.Q(("image_id", None), ("polygon", None), _connector="OR"), _negated=True), _connector="OR"), name="element_image_and_polygon"), + constraint=models.CheckConstraint(check=models.Q(models.Q(("image_id", None), ("polygon", None)), models.Q(("image_id", None), ("polygon", None), _connector="OR", _negated=True), _connector="OR"), name="element_image_and_polygon"), ), migrations.AddConstraint( model_name="element", diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py index b7d70eb785..f1de6db990 100644 --- a/arkindex/documents/serializers/elements.py +++ b/arkindex/documents/serializers/elements.py @@ -883,9 +883,11 @@ class ElementTypeSerializer(ElementTypeLightSerializer): """ corpus = serializers.PrimaryKeyRelatedField(queryset=Corpus.objects.none()) - class Meta: - model = ElementType + class Meta(ElementTypeLightSerializer.Meta): fields = ElementTypeLightSerializer.Meta.fields + ("corpus", ) + # Skip the default UniqueTogetherValidator that gets added because the serializer has both the corpus and slug, + # as we do our own validation in the ElementTypeLightSerializer. + validators = [] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/arkindex/documents/tests/tasks/test_add_parent_selection.py b/arkindex/documents/tests/tasks/test_add_parent_selection.py index d4b500c735..85664b510a 100644 --- a/arkindex/documents/tests/tasks/test_add_parent_selection.py +++ b/arkindex/documents/tests/tasks/test_add_parent_selection.py @@ -47,17 +47,17 @@ class TestMoveSelection(FixtureTestCase): call(.5), ]) - self.assertQuerysetEqual( + self.assertQuerySetEqual( Element.objects.get_ascending(self.page1.id), [self.parent1, self.parent2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( Element.objects.get_ascending(self.page2.id), [self.parent1, self.parent2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( Element.objects.get_ascending(self.page3.id), [self.parent1], ordered=False, diff --git a/arkindex/documents/tests/test_bulk_transcription_entities.py b/arkindex/documents/tests/test_bulk_transcription_entities.py index fc6b747da3..9dddf4bde8 100644 --- a/arkindex/documents/tests/test_bulk_transcription_entities.py +++ b/arkindex/documents/tests/test_bulk_transcription_entities.py @@ -275,7 +275,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase): trancription using a WorkerRun of their own local process. """ self.client.force_login(self.user) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.corpus.entities.values_list("name", "type", "worker_run_id").order_by("name", "type", "worker_run_id"), [("Paris", self.location_ent_type.id, None)], ) @@ -314,7 +314,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.corpus.entities.values_list("name", "type", "worker_run_id").order_by("name", "type", "worker_run_id"), [ ("Knight", self.person_ent_type.id, self.local_worker_run.id), @@ -324,7 +324,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase): ], ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.transcription.transcription_entities .values_list("entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id") .order_by("entity__name", "offset"), @@ -383,7 +383,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.transcription.transcription_entities.values_list( "entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id", "entity__worker_run_id" ), @@ -418,7 +418,7 @@ class TestBulkTranscriptionEntities(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.transcription.transcription_entities.values_list( "entity__name", "entity__type", "offset", "length", "confidence", "worker_run_id", "entity__worker_run_id" ), diff --git a/arkindex/documents/tests/test_destroy_worker_results.py b/arkindex/documents/tests/test_destroy_worker_results.py index ee5b35614b..89eb4f5bac 100644 --- a/arkindex/documents/tests/test_destroy_worker_results.py +++ b/arkindex/documents/tests/test_destroy_worker_results.py @@ -61,7 +61,7 @@ class TestDestroyWorkerResults(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertDictEqual( response.json(), - {"detail": "Not found."} + {"detail": "No Corpus matches the given query."} ) @patch("arkindex.project.triggers.documents_tasks.worker_results_delete.delay") diff --git a/arkindex/documents/tests/test_entities_api.py b/arkindex/documents/tests/test_entities_api.py index 23c8985254..a949b6e74d 100644 --- a/arkindex/documents/tests/test_entities_api.py +++ b/arkindex/documents/tests/test_entities_api.py @@ -106,7 +106,9 @@ class TestEntitiesAPI(FixtureAPITestCase): @patch("arkindex.users.managers.BaseACLManager.filter_rights", return_value=Corpus.objects.none()) def test_get_entity_elements_corpus_acl(self, filter_rights_mock): - with self.assertNumQueries(0): + # One query runs because Django >=4.2 no longer ignores unions that are known to be empty + # https://code.djangoproject.com/ticket/35559 + with self.assertNumQueries(1): response = self.client.get(reverse("api:entity-elements", kwargs={"pk": str(self.entity.id)})) self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/arkindex/documents/tests/test_entity_types.py b/arkindex/documents/tests/test_entity_types.py index 80522fc451..9348ee6dcc 100644 --- a/arkindex/documents/tests/test_entity_types.py +++ b/arkindex/documents/tests/test_entity_types.py @@ -365,7 +365,7 @@ class TestEntityTypesAPI(FixtureAPITestCase): self.assertDictEqual( response.json(), - {"detail": "Not found."} + {"detail": "No EntityType matches the given query."} ) self.assertEqual(filter_rights_mock.call_count, 1) diff --git a/arkindex/documents/tests/test_search_api.py b/arkindex/documents/tests/test_search_api.py index 2fe56cd2fe..9aacaf4d34 100644 --- a/arkindex/documents/tests/test_search_api.py +++ b/arkindex/documents/tests/test_search_api.py @@ -68,7 +68,7 @@ class TestSearchApi(FixtureAPITestCase): def test_corpus_not_found(self): response = self.client.get(reverse("api:corpus-search", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"})) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."}) @override_settings(ARKINDEX_FEATURES={"search": True}) @patch("arkindex.project.mixins.has_access", return_value=False) diff --git a/arkindex/documents/tests/test_selection_api.py b/arkindex/documents/tests/test_selection_api.py index 36970acf11..d2fc1d7bda 100644 --- a/arkindex/documents/tests/test_selection_api.py +++ b/arkindex/documents/tests/test_selection_api.py @@ -252,7 +252,7 @@ class TestSelectionAPI(FixtureAPITestCase): with self.assertNumQueries(3): response = self.client.delete(reverse("api:elements-selection"), data={"corpus": bad_id}) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."}) def test_delete_selection_filter_corpus_not_an_uuid(self): bad_id = "melon" @@ -362,7 +362,7 @@ class TestSelectionAPI(FixtureAPITestCase): with self.assertNumQueries(3): response = self.client.get(reverse("api:elements-selection"), data={"corpus": bad_id}) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Corpus matches the given query."}) def test_list_selection_filter_corpus_not_an_uuid(self): self.user.selected_elements.add(self.page, self.vol) diff --git a/arkindex/documents/tests/test_transcriptions.py b/arkindex/documents/tests/test_transcriptions.py index 618f9aa9ee..f884be9df2 100644 --- a/arkindex/documents/tests/test_transcriptions.py +++ b/arkindex/documents/tests/test_transcriptions.py @@ -305,7 +305,9 @@ class TestTranscriptions(FixtureAPITestCase): self.client.force_login(self.user) - with self.assertNumQueries(4): + # There should be one less query, but Django >=4.2 no longer ignores unions that are known to be empty + # https://code.djangoproject.com/ticket/35559 + with self.assertNumQueries(5): response = self.client.get( reverse("api:element-transcriptions", kwargs={"pk": str(self.page.id)}), data={ diff --git a/arkindex/ponos/tests/test_api.py b/arkindex/ponos/tests/test_api.py index d7663b63f4..5b9b3914fe 100644 --- a/arkindex/ponos/tests/test_api.py +++ b/arkindex/ponos/tests/test_api.py @@ -846,10 +846,10 @@ class TestAPI(FixtureAPITestCase): "requires_gpu": True, }, ) - self.assertQuerysetEqual(self.task2.children.all(), Task.objects.none()) + self.assertQuerySetEqual(self.task2.children.all(), Task.objects.none()) self.task2.refresh_from_db() self.assertEqual(self.task2.slug, f"{task_2_slug}_old2") - self.assertQuerysetEqual( + self.assertQuerySetEqual( restarted_task.children.all(), Task.objects.filter(id__in=[self.task3.id, task4.id]), ) @@ -912,10 +912,10 @@ class TestAPI(FixtureAPITestCase): "requires_gpu": False, }, ) - self.assertQuerysetEqual(self.task2.children.all(), Task.objects.none()) + self.assertQuerySetEqual(self.task2.children.all(), Task.objects.none()) self.task2.refresh_from_db() self.assertEqual(self.task2.slug, f"{task_2_slug}_old1") - self.assertQuerysetEqual( + self.assertQuerySetEqual( restarted_task.children.all(), Task.objects.filter(id__in=[self.task3.id, task4.id]), ) diff --git a/arkindex/process/tests/commands/test_cache_worker_runs.py b/arkindex/process/tests/commands/test_cache_worker_runs.py index 6d9e2ee6a2..b8f6c60f3e 100644 --- a/arkindex/process/tests/commands/test_cache_worker_runs.py +++ b/arkindex/process/tests/commands/test_cache_worker_runs.py @@ -47,13 +47,13 @@ class TestCacheWorkerRuns(FixtureTestCase): ) def test_run(self): - self.assertQuerysetEqual( + self.assertQuerySetEqual( WorkerRun.objects.order_by("summary").values_list("id", "has_results"), [(self.run_1.id, False), (self.run_2.id, False), (self.run_3.id, True), (self.run_4.id, True), (self.run_5.id, False)] ) with self.assertNumQueries(2): call_command("cache_worker_runs") - self.assertQuerysetEqual( + self.assertQuerySetEqual( WorkerRun.objects.order_by("summary").values_list("id", "has_results"), [(self.run_1.id, False), (self.run_2.id, True), (self.run_3.id, False), (self.run_4.id, True), (self.run_5.id, False)] ) diff --git a/arkindex/process/tests/test_process_dataset_sets.py b/arkindex/process/tests/test_process_dataset_sets.py index f314f3e1a0..373dc6dc0a 100644 --- a/arkindex/process/tests/test_process_dataset_sets.py +++ b/arkindex/process/tests/test_process_dataset_sets.py @@ -293,7 +293,7 @@ class TestProcessDatasetSets(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(ProcessDatasetSet.objects.count(), 10) self.assertTrue(ProcessDatasetSet.objects.filter(process=self.dataset_process.id, set=test_set.id).exists()) - self.assertQuerysetEqual(self.dataset_process.sets.order_by("dataset__name", "name"), [ + self.assertQuerySetEqual(self.dataset_process.sets.order_by("dataset__name", "name"), [ *self.private_dataset.sets.order_by("name"), *self.dataset1.sets.order_by("name"), test_set, diff --git a/arkindex/process/tests/test_process_elements.py b/arkindex/process/tests/test_process_elements.py index ddb62ef3d3..dc69c9734f 100644 --- a/arkindex/process/tests/test_process_elements.py +++ b/arkindex/process/tests/test_process_elements.py @@ -574,7 +574,7 @@ class TestProcessElements(FixtureAPITestCase): with self.assertNumQueries(3): response = self.client.get(reverse("api:process-elements-list", kwargs={"pk": process.id})) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Process matches the given query."}) def test_workers_mode(self): # The Workers mode returns some elements diff --git a/arkindex/process/tests/test_processes.py b/arkindex/process/tests/test_processes.py index 802e11c757..5033161fac 100644 --- a/arkindex/process/tests/test_processes.py +++ b/arkindex/process/tests/test_processes.py @@ -1755,7 +1755,7 @@ class TestProcesses(FixtureAPITestCase): process.refresh_from_db() self.assertEqual(process.state, State.Unscheduled) self.assertIsNone(process.finished) - self.assertQuerysetEqual( + self.assertQuerySetEqual( process.tasks.filter(run=1).values_list("slug", flat=True), ["import_files"], ) @@ -1791,7 +1791,7 @@ class TestProcesses(FixtureAPITestCase): process.refresh_from_db() self.assertEqual(process.state, State.Unscheduled) self.assertIsNone(process.finished) - self.assertQuerysetEqual( + self.assertQuerySetEqual( process.tasks.filter(run=1).values_list("slug", flat=True), ["import_s3"], ) @@ -1898,7 +1898,7 @@ class TestProcesses(FixtureAPITestCase): data = response.json() process = Process.objects.get(id=data["id"]) self.assertEqual(process.mode, ProcessMode.Files) - self.assertQuerysetEqual( + self.assertQuerySetEqual( process.files.all(), [ self.img_df, self.pdf_df, @@ -2063,7 +2063,7 @@ class TestProcesses(FixtureAPITestCase): reverse("api:process-start", kwargs={"pk": "12341234-1234-1234-1234-123412341234"}) ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Process matches the given query."}) def test_start_process_wrong_process_mode(self): self.assertFalse(self.user_img_process.mode in (ProcessMode.Workers, ProcessMode.Dataset)) @@ -2375,7 +2375,7 @@ class TestProcesses(FixtureAPITestCase): self.assertEqual(process2.tasks.count(), 1) task = process2.tasks.get() self.assertEqual(task.slug, run.task_slug) - self.assertQuerysetEqual(process2.sets.order_by("dataset__name"), [ + self.assertQuerySetEqual(process2.sets.order_by("dataset__name"), [ test_set_2, test_set_1 ]) @@ -2685,8 +2685,8 @@ class TestProcesses(FixtureAPITestCase): task_1 = process.tasks.get(slug=run_1.task_slug) task_2 = process.tasks.get(slug=run_2.task_slug) - self.assertQuerysetEqual(task_1.parents.all(), [init_task]) - self.assertQuerysetEqual(task_2.parents.all(), [task_1]) + self.assertQuerySetEqual(task_1.parents.all(), [init_task]) + self.assertQuerySetEqual(task_2.parents.all(), [task_1]) @override_settings(PONOS_DEFAULT_ENV={"ARKINDEX_API_TOKEN": "testToken"}) @override_settings(ARKINDEX_TASKS_IMAGE="registry.teklia.com/tasks") @@ -3137,7 +3137,7 @@ class TestProcesses(FixtureAPITestCase): "activity_state": "disabled", "use_cache": False }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( Process.objects.get(id=new_id).elements.all(), [volume], ) diff --git a/arkindex/process/tests/test_signals.py b/arkindex/process/tests/test_signals.py index 3719074bad..ecc6f86160 100644 --- a/arkindex/process/tests/test_signals.py +++ b/arkindex/process/tests/test_signals.py @@ -248,7 +248,7 @@ class TestSignals(FixtureAPITestCase): ) self.assertEqual(len(self.process_1.worker_runs.all()), 2) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.process_1.worker_runs.all(), [self.run_1, run_2], ordered=False, diff --git a/arkindex/process/tests/test_workerruns.py b/arkindex/process/tests/test_workerruns.py index efd8b2a4e1..a69e3b1ed4 100644 --- a/arkindex/process/tests/test_workerruns.py +++ b/arkindex/process/tests/test_workerruns.py @@ -328,7 +328,7 @@ class TestWorkerRuns(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Process matches the given query."}) def test_create_invalid_process_mode(self): self.client.force_login(self.user) diff --git a/arkindex/process/tests/test_workers.py b/arkindex/process/tests/test_workers.py index 3ca0775144..ac749492b8 100644 --- a/arkindex/process/tests/test_workers.py +++ b/arkindex/process/tests/test_workers.py @@ -546,7 +546,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): response = self.client.get(reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)})) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Worker matches the given query."}) self.assertListEqual(filter_rights_mock.call_args_list, [ call(self.user, Worker, Role.Contributor.value), @@ -605,7 +605,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): worker = Worker.objects.get(id=data["id"]) self.assertEqual(worker.type, self.worker_type_dla) self.assertIsNone(worker.repository) - self.assertQuerysetEqual(worker.memberships.values_list("user_id", "level"), [ + self.assertQuerySetEqual(worker.memberships.values_list("user_id", "level"), [ (self.user.id, Role.Admin.value) ]) self.assertDictEqual(data, { @@ -639,7 +639,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) self.assertFalse(WorkerType.objects.filter(slug="new_type").exists()) - self.assertQuerysetEqual(self.worker_custom.memberships.values_list("user_id", "level"), [ + self.assertQuerySetEqual(self.worker_custom.memberships.values_list("user_id", "level"), [ (self.user.id, Role.Guest.value) ]) self.assertDictEqual(response.json(), {"slug": ["You cannot use this value."]}) @@ -758,7 +758,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Worker matches the given query."}) self.assertListEqual(filter_rights_mock.call_args_list, [ call(self.user, Worker, Role.Contributor.value), call(self.user, Repository, Role.Contributor.value), @@ -990,7 +990,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertEqual(response.json(), {"detail": "No Worker matches the given query."}) self.assertListEqual(filter_rights_mock.call_args_list, [ call(self.user, Worker, Role.Contributor.value), @@ -1007,7 +1007,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): Repository.objects.none(), ] - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.patch( reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}), { @@ -1143,7 +1143,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): self.worker_reco.archived = current_value self.worker_reco.save() - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.patch( reverse("api:worker-retrieve", kwargs={"pk": str(self.worker_reco.id)}), { @@ -1333,7 +1333,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Worker matches the given query."}) def test_create_version_available_requires_docker_image(self): with self.assertNumQueries(4): @@ -2467,7 +2467,7 @@ class TestWorkersWorkerVersions(FixtureAPITestCase): response = self.client.get(reverse("api:corpus-versions", kwargs={"pk": self.corpus.id})) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."}) def test_corpus_worker_version_not_verified(self): self.user.verified_email = False diff --git a/arkindex/process/utils.py b/arkindex/process/utils.py index ef58ba9c33..95a03e4c36 100644 --- a/arkindex/process/utils.py +++ b/arkindex/process/utils.py @@ -2,8 +2,8 @@ import json from hashlib import md5 from django.conf import settings -from django.db.models import CharField, Value -from django.db.models.functions import Cast, Concat, NullIf +from django.db.models import ExpressionWrapper, F, TextField, Value +from django.db.models.functions import Concat, NullIf from django.utils.module_loading import import_string from arkindex.project.tools import RTrimChr @@ -27,11 +27,12 @@ def annotate_image_url(field="image"): so we strip any trailing slashes and add our own. This uses NullIf as this concatenation will return '/' if there is no zone on the element. """ + slash = Value("/", output_field=TextField()) return NullIf( Concat( - RTrimChr(f"{field}__server__url", Value("/")), - Value("/"), - Cast(f"{field}__path", CharField()), + RTrimChr(f"{field}__server__url", slash), + slash, + ExpressionWrapper(F(f"{field}__path"), output_field=TextField()), ), - Value("/"), + slash, ) diff --git a/arkindex/project/tests/test_argparse.py b/arkindex/project/tests/test_argparse.py index afeaeaf25f..b4b40ee64d 100644 --- a/arkindex/project/tests/test_argparse.py +++ b/arkindex/project/tests/test_argparse.py @@ -26,7 +26,7 @@ class TestArgparseHelpers(FixtureTestCase): def test_corpus_argument_many(self): arg = CorpusArgument(many=True) result = arg("tests") - self.assertQuerysetEqual(result, [self.corpus, ]) + self.assertQuerySetEqual(result, [self.corpus, ]) def test_corpus_argument_not_found(self): arg = CorpusArgument() @@ -61,7 +61,7 @@ class TestArgparseHelpers(FixtureTestCase): def test_element_argument_many(self): arg = ElementArgument(type__folder=True, many=True) result = arg("volume 1") - self.assertQuerysetEqual(result, [self.vol, ]) + self.assertQuerySetEqual(result, [self.vol, ]) def test_element_argument_multiple(self): arg = ElementArgument() diff --git a/arkindex/project/tools.py b/arkindex/project/tools.py index ab448463f8..989e1aeb96 100644 --- a/arkindex/project/tools.py +++ b/arkindex/project/tools.py @@ -2,7 +2,7 @@ from collections.abc import Iterable, Iterator, Sized from datetime import datetime, timezone from urllib.parse import urlparse -from django.db.models import Aggregate, CharField, Func +from django.db.models import Aggregate, Func, TextField from django.db.models.expressions import BaseExpression, OrderByList from django.urls import reverse @@ -151,7 +151,7 @@ class RTrimChr(Func): """ function = "RTRIM" arity = 2 - output_field = CharField() + output_field = TextField() class OrderedSetAggregate(Aggregate): diff --git a/arkindex/sql_validation/add_first_parent.sql b/arkindex/sql_validation/add_first_parent.sql index 94369ab03b..755f1b3fba 100644 --- a/arkindex/sql_validation/add_first_parent.sql +++ b/arkindex/sql_validation/add_first_parent.sql @@ -18,10 +18,10 @@ SELECT EXISTS LIMIT 1), EXISTS (SELECT 1 FROM child_paths - WHERE path @ > ARRAY['{A}'::uuid]), EXISTS + WHERE path @> ARRAY['{A}'::uuid]), EXISTS (SELECT 1 FROM parent_paths - WHERE path @ > ARRAY['{B}'::uuid]), + WHERE path @> ARRAY['{B}'::uuid]), (SELECT COUNT(*) FROM parent_paths), (SELECT path @@ -29,7 +29,7 @@ SELECT EXISTS LIMIT 1), (SELECT COALESCE(MAX(ordering) + 1, 0) FROM documents_elementpath - WHERE path @ > ARRAY['{A}'::uuid] + WHERE path @> ARRAY['{A}'::uuid] AND path[array_length(path, 1)] = '{A}'::uuid ) ; INSERT INTO documents_elementpath (id, element_id, path, ordering) @@ -45,7 +45,7 @@ UPDATE "documents_elementpath" SET "path" = ARRAY['{first_parent}'::uuid, '{A}'::uuid]::uuid[], "ordering" = 1 WHERE ("documents_elementpath"."element_id" = '{B}'::uuid - AND "documents_elementpath"."path" = (ARRAY[])::uuid[]); + AND "documents_elementpath"."path" = '{{}}'::uuid[]); UPDATE "documents_elementpath" SET "path" = array_cat(ARRAY['{first_parent}'::uuid, '{A}'::uuid], "documents_elementpath"."path")::uuid[] @@ -58,7 +58,7 @@ SELECT uuid_generate_v4(), child_paths.ordering FROM documents_elementpath child_paths, documents_elementpath new_parent_paths -WHERE child_paths.path @ > ARRAY['{first_parent}'::uuid, +WHERE child_paths.path @> ARRAY['{first_parent}'::uuid, '{A}'::uuid, '{B}'::uuid] AND new_parent_paths.element_id = '{A}'::uuid diff --git a/arkindex/sql_validation/add_second_parent.sql b/arkindex/sql_validation/add_second_parent.sql index ba4374ad9b..0d8691022a 100644 --- a/arkindex/sql_validation/add_second_parent.sql +++ b/arkindex/sql_validation/add_second_parent.sql @@ -18,10 +18,10 @@ SELECT EXISTS LIMIT 1), EXISTS (SELECT 1 FROM child_paths - WHERE path @ > ARRAY['{A}'::uuid]), EXISTS + WHERE path @> ARRAY['{A}'::uuid]), EXISTS (SELECT 1 FROM parent_paths - WHERE path @ > ARRAY['{B}'::uuid]), + WHERE path @> ARRAY['{B}'::uuid]), (SELECT COUNT(*) FROM parent_paths), (SELECT path @@ -29,7 +29,7 @@ SELECT EXISTS LIMIT 1), (SELECT COALESCE(MAX(ordering) + 1, 0) FROM documents_elementpath - WHERE path @ > ARRAY['{A}'::uuid] + WHERE path @> ARRAY['{A}'::uuid] AND path[array_length(path, 1)] = '{A}'::uuid ) ; INSERT INTO documents_elementpath (id, element_id, path, ordering) @@ -47,7 +47,7 @@ SELECT uuid_generate_v4(), child_paths.ordering FROM documents_elementpath child_paths, documents_elementpath new_parent_paths -WHERE child_paths.path @ > ARRAY['{K}'::uuid, +WHERE child_paths.path @> ARRAY['{K}'::uuid, '{B}'::uuid] AND new_parent_paths.element_id = '{A}'::uuid ; diff --git a/arkindex/sql_validation/element_move_with_children.sql b/arkindex/sql_validation/element_move_with_children.sql index 5bd41790a3..354e208d60 100644 --- a/arkindex/sql_validation/element_move_with_children.sql +++ b/arkindex/sql_validation/element_move_with_children.sql @@ -21,7 +21,7 @@ WHERE element_id = '{source_id}'::uuid ; UPDATE documents_elementpath SET path = path[2:] -WHERE path @ > ARRAY['{parent_id}'::uuid, +WHERE path @> ARRAY['{parent_id}'::uuid, '{source_id}'::uuid] AND path[0:2] = ARRAY['{parent_id}'::uuid, '{source_id}'::uuid] ; @@ -53,10 +53,10 @@ SELECT EXISTS LIMIT 1), EXISTS (SELECT 1 FROM child_paths - WHERE path @ > ARRAY['{destination_id}'::uuid]), EXISTS + WHERE path @> ARRAY['{destination_id}'::uuid]), EXISTS (SELECT 1 FROM parent_paths - WHERE path @ > ARRAY['{source_id}'::uuid]), + WHERE path @> ARRAY['{source_id}'::uuid]), (SELECT COUNT(*) FROM parent_paths), (SELECT path @@ -64,13 +64,13 @@ SELECT EXISTS LIMIT 1), (SELECT COALESCE(MAX(ordering) + 1, 0) FROM documents_elementpath - WHERE path @ > ARRAY['{destination_id}'::uuid] + WHERE path @> ARRAY['{destination_id}'::uuid] AND path[array_length(path, 1)] = '{destination_id}'::uuid ) ; UPDATE "documents_elementpath" SET "path" = ARRAY['{destination_id}'::uuid]::uuid[], "ordering" = 3 WHERE ("documents_elementpath"."element_id" = '{source_id}'::uuid - AND "documents_elementpath"."path" = (ARRAY[])::uuid[]); + AND "documents_elementpath"."path" = '{{}}'::uuid[]); UPDATE "documents_elementpath" SET "path" = array_cat(ARRAY['{destination_id}'::uuid], "documents_elementpath"."path")::uuid[] diff --git a/arkindex/sql_validation/element_move_without_child.sql b/arkindex/sql_validation/element_move_without_child.sql index 5bd41790a3..354e208d60 100644 --- a/arkindex/sql_validation/element_move_without_child.sql +++ b/arkindex/sql_validation/element_move_without_child.sql @@ -21,7 +21,7 @@ WHERE element_id = '{source_id}'::uuid ; UPDATE documents_elementpath SET path = path[2:] -WHERE path @ > ARRAY['{parent_id}'::uuid, +WHERE path @> ARRAY['{parent_id}'::uuid, '{source_id}'::uuid] AND path[0:2] = ARRAY['{parent_id}'::uuid, '{source_id}'::uuid] ; @@ -53,10 +53,10 @@ SELECT EXISTS LIMIT 1), EXISTS (SELECT 1 FROM child_paths - WHERE path @ > ARRAY['{destination_id}'::uuid]), EXISTS + WHERE path @> ARRAY['{destination_id}'::uuid]), EXISTS (SELECT 1 FROM parent_paths - WHERE path @ > ARRAY['{source_id}'::uuid]), + WHERE path @> ARRAY['{source_id}'::uuid]), (SELECT COUNT(*) FROM parent_paths), (SELECT path @@ -64,13 +64,13 @@ SELECT EXISTS LIMIT 1), (SELECT COALESCE(MAX(ordering) + 1, 0) FROM documents_elementpath - WHERE path @ > ARRAY['{destination_id}'::uuid] + WHERE path @> ARRAY['{destination_id}'::uuid] AND path[array_length(path, 1)] = '{destination_id}'::uuid ) ; UPDATE "documents_elementpath" SET "path" = ARRAY['{destination_id}'::uuid]::uuid[], "ordering" = 3 WHERE ("documents_elementpath"."element_id" = '{source_id}'::uuid - AND "documents_elementpath"."path" = (ARRAY[])::uuid[]); + AND "documents_elementpath"."path" = '{{}}'::uuid[]); UPDATE "documents_elementpath" SET "path" = array_cat(ARRAY['{destination_id}'::uuid], "documents_elementpath"."path")::uuid[] diff --git a/arkindex/sql_validation/element_trash_children.sql b/arkindex/sql_validation/element_trash_children.sql index 0ad34d8158..180543969b 100644 --- a/arkindex/sql_validation/element_trash_children.sql +++ b/arkindex/sql_validation/element_trash_children.sql @@ -18,7 +18,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid))); @@ -29,7 +29,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -40,7 +40,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -51,7 +51,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -62,7 +62,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -73,7 +73,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -84,7 +84,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -95,7 +95,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -107,7 +107,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)) RETURNING element_id) @@ -118,7 +118,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid); @@ -133,7 +133,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid))); @@ -144,7 +144,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -155,7 +155,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -166,7 +166,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -177,7 +177,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -188,7 +188,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -199,7 +199,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -210,7 +210,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -222,7 +222,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[1] IN + WHERE ("documents_elementpath"."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)) RETURNING element_id) @@ -233,7 +233,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[1] IN +WHERE ("documents_elementpath"."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid); diff --git a/arkindex/sql_validation/element_trash_deep.sql b/arkindex/sql_validation/element_trash_deep.sql index b63124f7c2..7372e92cfe 100644 --- a/arkindex/sql_validation/element_trash_deep.sql +++ b/arkindex/sql_validation/element_trash_deep.sql @@ -18,7 +18,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid))); @@ -29,7 +29,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -40,7 +40,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -51,7 +51,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -62,7 +62,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -73,7 +73,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -84,7 +84,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -95,7 +95,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[4] IN + WHERE (V1."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -107,7 +107,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[4] IN + WHERE ("documents_elementpath"."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)) RETURNING element_id) @@ -118,7 +118,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[4] IN +WHERE ("documents_elementpath"."path")[4] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid); @@ -133,7 +133,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid))); @@ -144,7 +144,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -155,7 +155,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -166,7 +166,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -177,7 +177,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -188,7 +188,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -199,7 +199,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -210,7 +210,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[3] IN + WHERE (V1."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -222,7 +222,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[3] IN + WHERE ("documents_elementpath"."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)) RETURNING element_id) @@ -233,7 +233,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[3] IN +WHERE ("documents_elementpath"."path")[3] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid); @@ -248,7 +248,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid))); @@ -259,7 +259,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -270,7 +270,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -281,7 +281,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -292,7 +292,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -303,7 +303,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -314,7 +314,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -325,7 +325,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -337,7 +337,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)) RETURNING element_id) @@ -348,7 +348,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid); @@ -363,7 +363,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid))); @@ -374,7 +374,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -385,7 +385,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -396,7 +396,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -407,7 +407,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -418,7 +418,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -429,7 +429,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -440,7 +440,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[1] IN + WHERE (V1."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)); @@ -452,7 +452,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[1] IN + WHERE ("documents_elementpath"."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid)) RETURNING element_id) @@ -463,7 +463,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[1] IN +WHERE ("documents_elementpath"."path")[1] IN (SELECT U0."id" FROM "documents_element" U0 WHERE U0."id" = '{id}'::uuid); diff --git a/arkindex/sql_validation/element_trash_ml_class.sql b/arkindex/sql_validation/element_trash_ml_class.sql index f8d7261585..3a3158045e 100644 --- a/arkindex/sql_validation/element_trash_ml_class.sql +++ b/arkindex/sql_validation/element_trash_ml_class.sql @@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -116,7 +116,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") @@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 INNER JOIN "documents_classification" U1 ON (U0."id" = U1."element_id") diff --git a/arkindex/sql_validation/indexer_prefetch.sql b/arkindex/sql_validation/indexer_prefetch.sql index 2777d0d4ef..65f43b8174 100644 --- a/arkindex/sql_validation/indexer_prefetch.sql +++ b/arkindex/sql_validation/indexer_prefetch.sql @@ -42,7 +42,7 @@ FROM FROM parent LIMIT 10000 OFFSET 0) AS parent_chunk -INNER JOIN documents_elementpath as elementpath ON (elementpath.path @ > ARRAY[parent_chunk.id]) +INNER JOIN documents_elementpath as elementpath ON (elementpath.path @> ARRAY[parent_chunk.id]) INNER JOIN documents_element as element ON (elementpath.element_id = element.id) INNER JOIN documents_elementtype elementtype ON (element.type_id = elementtype.id) ; diff --git a/arkindex/sql_validation/process_elements_filter_type.sql b/arkindex/sql_validation/process_elements_filter_type.sql index 6710d5e0f8..a9a497c321 100644 --- a/arkindex/sql_validation/process_elements_filter_type.sql +++ b/arkindex/sql_validation/process_elements_filter_type.sql @@ -65,7 +65,7 @@ SELECT "documents_element"."id", FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") WHERE ("documents_element"."corpus_id" = '{corpus_id}'::uuid - AND "documents_elementpath"."path" = (ARRAY[])::uuid[] + AND "documents_elementpath"."path" = '{{}}'::uuid[] AND "documents_element"."corpus_id" = '{corpus_id}'::uuid AND "documents_element"."type_id" = '{type_id}'::uuid) ORDER BY "documents_element"."id" ASC diff --git a/arkindex/sql_validation/process_elements_top_level.sql b/arkindex/sql_validation/process_elements_top_level.sql index 3087532fd0..03c040152c 100644 --- a/arkindex/sql_validation/process_elements_top_level.sql +++ b/arkindex/sql_validation/process_elements_top_level.sql @@ -65,7 +65,7 @@ SELECT "documents_element"."id", FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") WHERE ("documents_element"."corpus_id" = '{corpus_id}'::uuid - AND "documents_elementpath"."path" = (ARRAY[])::uuid[] + AND "documents_elementpath"."path" = '{{}}'::uuid[] AND "documents_element"."corpus_id" = '{corpus_id}'::uuid) ORDER BY "documents_element"."id" ASC LIMIT 21 diff --git a/arkindex/sql_validation/process_elements_with_image.sql b/arkindex/sql_validation/process_elements_with_image.sql index 9d89dc7c0e..7a689853ec 100644 --- a/arkindex/sql_validation/process_elements_with_image.sql +++ b/arkindex/sql_validation/process_elements_with_image.sql @@ -68,7 +68,7 @@ SELECT "documents_element"."id", "documents_element"."polygon"::bytea, "documents_element"."rotation_angle", "documents_element"."mirrored", - NULLIF(CONCAT(RTRIM("images_imageserver"."url", '/'), CONCAT('/', ("images_image"."path")::varchar)), '/') AS "image_url" + NULLIF(CONCAT((RTRIM("images_imageserver"."url", '/'))::text, (CONCAT(('/')::text, ("images_image"."path")::text))::text), '/') AS "image_url" FROM "documents_element" LEFT OUTER JOIN "images_image" ON ("documents_element"."image_id" = "images_image"."id") LEFT OUTER JOIN "images_imageserver" ON ("images_image"."server_id" = "images_imageserver"."id") diff --git a/arkindex/sql_validation/remove_child.sql b/arkindex/sql_validation/remove_child.sql index 0ec747fdad..a757299fb8 100644 --- a/arkindex/sql_validation/remove_child.sql +++ b/arkindex/sql_validation/remove_child.sql @@ -16,7 +16,7 @@ DELETE FROM documents_elementpath child_paths USING documents_elementpath old_parent_paths WHERE old_parent_paths.element_id = '{B}'::uuid AND old_parent_paths.path[array_length(old_parent_paths.path, 1)] = '{A}'::uuid - AND child_paths.path @ > (old_parent_paths.path || '{B}'::uuid) ; + AND child_paths.path @> (old_parent_paths.path || '{B}'::uuid) ; DELETE FROM "documents_elementpath" diff --git a/arkindex/sql_validation/remove_child_last_parent.sql b/arkindex/sql_validation/remove_child_last_parent.sql index 9dd30683ac..fa81733d12 100644 --- a/arkindex/sql_validation/remove_child_last_parent.sql +++ b/arkindex/sql_validation/remove_child_last_parent.sql @@ -14,7 +14,7 @@ WHERE element_id = '{B}'::uuid ; UPDATE documents_elementpath SET path = path[3:] -WHERE path @ > ARRAY['{first_parent}'::uuid, +WHERE path @> ARRAY['{first_parent}'::uuid, '{A}'::uuid, '{B}'::uuid] AND path[0:3] = ARRAY['{first_parent}'::uuid, @@ -31,7 +31,7 @@ DELETE FROM documents_elementpath child_paths USING documents_elementpath old_parent_paths WHERE old_parent_paths.element_id = '{B}'::uuid AND old_parent_paths.path[array_length(old_parent_paths.path, 1)] = '{A}'::uuid - AND child_paths.path @ > (old_parent_paths.path || '{B}'::uuid) ; + AND child_paths.path @> (old_parent_paths.path || '{B}'::uuid) ; DELETE FROM "documents_elementpath" diff --git a/arkindex/sql_validation/remove_children_multiple_parents.sql b/arkindex/sql_validation/remove_children_multiple_parents.sql index d5670523cb..c1565c51de 100644 --- a/arkindex/sql_validation/remove_children_multiple_parents.sql +++ b/arkindex/sql_validation/remove_children_multiple_parents.sql @@ -11,7 +11,7 @@ DELETE FROM documents_elementpath child_paths USING documents_elementpath parent_paths WHERE parent_paths.element_id = '{A}'::uuid AND parent_paths.path <> ARRAY['{first_parent}'::uuid] - AND child_paths.path @ > (parent_paths.path || '{A}'::uuid) ; + AND child_paths.path @> (parent_paths.path || '{A}'::uuid) ; DELETE FROM documents_elementpath parent_paths USING documents_elementpath other_paths @@ -21,7 +21,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid] UPDATE documents_elementpath SET path = path[2 + 1:] -WHERE path @ > ARRAY['{first_parent}'::uuid, +WHERE path @> ARRAY['{first_parent}'::uuid, '{A}'::uuid] AND path[:2] = ARRAY['{first_parent}'::uuid, '{A}'::uuid] ; diff --git a/arkindex/sql_validation/remove_children_no_parents.sql b/arkindex/sql_validation/remove_children_no_parents.sql index 4d31a5ff82..dba5386430 100644 --- a/arkindex/sql_validation/remove_children_no_parents.sql +++ b/arkindex/sql_validation/remove_children_no_parents.sql @@ -15,7 +15,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid] UPDATE documents_elementpath SET path = path[1 + 1:] -WHERE path @ > ARRAY['{A}'::uuid] +WHERE path @> ARRAY['{A}'::uuid] AND path[:1] = ARRAY['{A}'::uuid] ; RELEASE SAVEPOINT "{savepoint}" diff --git a/arkindex/sql_validation/remove_children_single_parent.sql b/arkindex/sql_validation/remove_children_single_parent.sql index c05f2af5da..7d86e0d019 100644 --- a/arkindex/sql_validation/remove_children_single_parent.sql +++ b/arkindex/sql_validation/remove_children_single_parent.sql @@ -15,7 +15,7 @@ WHERE parent_paths.path && ARRAY['{A}'::uuid] UPDATE documents_elementpath SET path = path[2 + 1:] -WHERE path @ > ARRAY['{X}'::uuid, +WHERE path @> ARRAY['{X}'::uuid, '{A}'::uuid] AND path[:2] = ARRAY['{X}'::uuid, '{A}'::uuid] ; diff --git a/arkindex/sql_validation/worker_results_delete_all_versions.sql b/arkindex/sql_validation/worker_results_delete_all_versions.sql index b0fe051fd7..afbb1ee13b 100644 --- a/arkindex/sql_validation/worker_results_delete_all_versions.sql +++ b/arkindex/sql_validation/worker_results_delete_all_versions.sql @@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -116,7 +116,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid diff --git a/arkindex/sql_validation/worker_results_delete_in_corpus.sql b/arkindex/sql_validation/worker_results_delete_in_corpus.sql index 1f7a8878f0..3f7e788120 100644 --- a/arkindex/sql_validation/worker_results_delete_in_corpus.sql +++ b/arkindex/sql_validation/worker_results_delete_in_corpus.sql @@ -19,7 +19,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -31,7 +31,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -43,7 +43,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -55,7 +55,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -67,7 +67,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -79,7 +79,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -91,7 +91,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -103,7 +103,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -116,7 +116,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -128,7 +128,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid diff --git a/arkindex/sql_validation/worker_results_delete_under_parent_included.sql b/arkindex/sql_validation/worker_results_delete_under_parent_included.sql index 91623264d4..522be37240 100644 --- a/arkindex/sql_validation/worker_results_delete_under_parent_included.sql +++ b/arkindex/sql_validation/worker_results_delete_under_parent_included.sql @@ -208,7 +208,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -221,7 +221,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -234,7 +234,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -247,7 +247,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -260,7 +260,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -273,7 +273,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -286,7 +286,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -299,7 +299,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -313,7 +313,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -326,7 +326,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid diff --git a/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql b/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql index eec3d75ca8..073cd3dc98 100644 --- a/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql +++ b/arkindex/sql_validation/worker_results_delete_under_parent_included_worker_run.sql @@ -197,7 +197,7 @@ WHERE "documents_transcriptionentity"."id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -210,7 +210,7 @@ WHERE "documents_transcription"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -223,7 +223,7 @@ WHERE "process_workeractivity"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -236,7 +236,7 @@ WHERE "documents_metadata"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -249,7 +249,7 @@ WHERE "documents_classification"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -262,7 +262,7 @@ WHERE "documents_selection"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -275,7 +275,7 @@ WHERE "process_processelement"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -288,7 +288,7 @@ WHERE "process_process"."element_id" IN (SELECT V0."id" FROM "documents_element" V0 INNER JOIN "documents_elementpath" V1 ON (V0."id" = V1."element_id") - WHERE V1."path"[2] IN + WHERE (V1."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -302,7 +302,7 @@ WITH element_ids (id) AS (SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") - WHERE "documents_elementpath"."path"[2] IN + WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid @@ -315,7 +315,7 @@ WHERE element.id = element_ids.id ; SELECT "documents_element"."id" FROM "documents_element" INNER JOIN "documents_elementpath" ON ("documents_element"."id" = "documents_elementpath"."element_id") -WHERE "documents_elementpath"."path"[2] IN +WHERE ("documents_elementpath"."path")[2] IN (SELECT U0."id" FROM "documents_element" U0 WHERE (U0."corpus_id" = '{corpus_id}'::uuid diff --git a/arkindex/training/serializers.py b/arkindex/training/serializers.py index 9cd60e6a34..96b73b3e13 100644 --- a/arkindex/training/serializers.py +++ b/arkindex/training/serializers.py @@ -565,6 +565,9 @@ class DatasetSetSerializer(serializers.ModelSerializer): model = DatasetSet fields = ("id", "name", "dataset", ) read_only_fields = ("id", ) + # Remove the DRF-provided unique validator, which causes extra queries. + # We do our own unique validation using the already prefetched sets on the dataset. + validators = [] def validate_name(self, name): if any(ds.name == name for ds in self.context["dataset"].sets.all()): diff --git a/arkindex/training/tests/test_dataset_sets_api.py b/arkindex/training/tests/test_dataset_sets_api.py index d5c3f630ef..cafedafb83 100644 --- a/arkindex/training/tests/test_dataset_sets_api.py +++ b/arkindex/training/tests/test_dataset_sets_api.py @@ -66,7 +66,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) @patch("arkindex.users.managers.BaseACLManager.filter_rights") def test_create_no_read_access(self, filter_rights_mock): @@ -79,7 +79,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) self.assertEqual(filter_rights_mock.call_count, 1) self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value)) @@ -183,7 +183,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) def test_update_set_doesnt_exist(self): self.client.force_login(self.user) @@ -194,7 +194,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."}) @patch("arkindex.users.managers.BaseACLManager.filter_rights") def test_update_no_read_access(self, filter_rights_mock): @@ -207,7 +207,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) self.assertEqual(filter_rights_mock.call_count, 1) self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value)) @@ -312,7 +312,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) def test_partial_update_set_doesnt_exist(self): self.client.force_login(self.user) @@ -323,7 +323,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."}) @patch("arkindex.users.managers.BaseACLManager.filter_rights") def test_partial_update_no_read_access(self, filter_rights_mock): @@ -336,7 +336,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) self.assertEqual(filter_rights_mock.call_count, 1) self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value)) @@ -438,7 +438,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) def test_destroy_set_doesnt_exist(self): self.client.force_login(self.user) @@ -448,7 +448,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetSet matches the given query."}) @patch("arkindex.users.managers.BaseACLManager.filter_rights") def test_destroy_no_read_access(self, filter_rights_mock): @@ -460,7 +460,7 @@ class TestDatasetSetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) self.assertEqual(filter_rights_mock.call_count, 1) self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value)) diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py index 1bb2a5aa91..5fab4af070 100644 --- a/arkindex/training/tests/test_datasets_api.py +++ b/arkindex/training/tests/test_datasets_api.py @@ -63,7 +63,7 @@ class TestDatasetsAPI(FixtureAPITestCase): with self.assertNumQueries(3): response = self.client.get(reverse("api:corpus-datasets", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"})) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."}) @patch("arkindex.project.mixins.has_access", return_value=False) def test_list_private_corpus(self, has_access_mock): @@ -158,7 +158,7 @@ class TestDatasetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Corpus matches the given query."}) @patch("arkindex.project.mixins.has_access", return_value=False) def test_create_private_corpus(self, has_access_mock): @@ -490,7 +490,7 @@ class TestDatasetsAPI(FixtureAPITestCase): format="json" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) def test_update_name_too_long(self): self.client.force_login(self.user) @@ -822,7 +822,7 @@ class TestDatasetsAPI(FixtureAPITestCase): def test_partial_update(self): self.client.force_login(self.user) - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.patch( reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}), data={"description": "Omedeto!", "unique_elements": False}, @@ -870,7 +870,7 @@ class TestDatasetsAPI(FixtureAPITestCase): def test_partial_update_requires_ponos_auth(self): self.client.force_login(self.user) - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.patch( reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}), data={ @@ -884,7 +884,7 @@ class TestDatasetsAPI(FixtureAPITestCase): }) def test_partial_update_ponos_task_state_update(self): - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.patch( reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}), HTTP_AUTHORIZATION=f"Ponos {self.task.token}", @@ -899,7 +899,7 @@ class TestDatasetsAPI(FixtureAPITestCase): def test_partial_update_ponos_task_state_requires_dataset_in_process(self): self.process.process_sets.all().delete() - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.patch( reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}), HTTP_AUTHORIZATION=f"Ponos {self.task.token}", @@ -1022,7 +1022,7 @@ class TestDatasetsAPI(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) self.assertEqual(filter_rights_mock.call_count, 1) self.assertEqual(filter_rights_mock.call_args, call(self.user, Corpus, Role.Guest.value)) @@ -1034,7 +1034,7 @@ class TestDatasetsAPI(FixtureAPITestCase): reverse("api:dataset-update", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}) ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) def test_retrieve(self): self.client.force_login(self.user) @@ -1115,7 +1115,7 @@ class TestDatasetsAPI(FixtureAPITestCase): reverse("api:dataset-update", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"}), ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No Dataset matches the given query."}) def test_delete_dataset_in_process_forbidden(self): self.client.force_login(self.user) @@ -1568,7 +1568,7 @@ class TestDatasetsAPI(FixtureAPITestCase): format="json", ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertQuerysetEqual( + self.assertQuerySetEqual( train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"), [("train", "Volume 1, page 1r")] ) @@ -1601,7 +1601,7 @@ class TestDatasetsAPI(FixtureAPITestCase): format="json", ) self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertQuerysetEqual( + self.assertQuerySetEqual( ( DatasetElement.objects .filter(set__dataset=self.dataset) @@ -1724,7 +1724,7 @@ class TestDatasetsAPI(FixtureAPITestCase): def test_add_from_selection(self): train_set = self.dataset.sets.get(name="train") train_set.set_elements.create(element=self.page1) - self.assertQuerysetEqual( + self.assertQuerySetEqual( train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"), [("train", "Volume 1, page 1r")] ) @@ -1738,7 +1738,7 @@ class TestDatasetsAPI(FixtureAPITestCase): format="json", ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertQuerysetEqual( + self.assertQuerySetEqual( train_set.set_elements.values_list("set__name", "element__name").order_by("element__name"), [ ("train", "Volume 1"), @@ -1780,7 +1780,7 @@ class TestDatasetsAPI(FixtureAPITestCase): format="json", ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertQuerysetEqual( + self.assertQuerySetEqual( ( DatasetElement.objects .filter(set__dataset=self.dataset) @@ -2268,7 +2268,7 @@ class TestDatasetsAPI(FixtureAPITestCase): "id": str(dev_clone.id) } ]) - self.assertQuerysetEqual( + self.assertQuerySetEqual( DatasetElement.objects.filter(set__dataset_id=clone.id).values_list("set__name", "element__name").order_by("element__name", "set__name"), [ ("dev", "Volume 1"), @@ -2427,7 +2427,7 @@ class TestDatasetsAPI(FixtureAPITestCase): + "?set=train" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."}) def test_destroy_dataset_element_set_doesnt_exist(self): self.client.force_login(self.user) @@ -2438,7 +2438,7 @@ class TestDatasetsAPI(FixtureAPITestCase): + "?set=match" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."}) def test_destroy_dataset_element_element_doesnt_exist(self): self.client.force_login(self.user) @@ -2449,7 +2449,7 @@ class TestDatasetsAPI(FixtureAPITestCase): + "?set=train" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."}) def test_destroy_dataset_element_element_not_in_dataset(self): train_set = self.dataset.sets.get(name="train") @@ -2462,7 +2462,7 @@ class TestDatasetsAPI(FixtureAPITestCase): + "?set=train" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."}) def test_destroy_dataset_element_wrong_set(self): dev_set, _, train_set = self.dataset.sets.all().order_by("name") @@ -2476,7 +2476,7 @@ class TestDatasetsAPI(FixtureAPITestCase): + "?set=train" ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No DatasetElement matches the given query."}) def test_destroy_dataset_element(self): self.client.force_login(self.user) diff --git a/arkindex/training/tests/test_model_api.py b/arkindex/training/tests/test_model_api.py index 93038de206..6a7fce4921 100644 --- a/arkindex/training/tests/test_model_api.py +++ b/arkindex/training/tests/test_model_api.py @@ -353,7 +353,7 @@ class TestModelAPI(FixtureAPITestCase): with self.assertNumQueries(1): response = self.client.get(reverse("api:model-version-download", kwargs={"pk": uuid4()}), {"token": "hehe_perhaps"}) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - self.assertDictEqual(response.json(), {"detail": "Not found."}) + self.assertDictEqual(response.json(), {"detail": "No ModelVersion matches the given query."}) def test_download_model_version_non_available(self): """ @@ -1301,7 +1301,7 @@ class TestModelAPI(FixtureAPITestCase): self.model_version3.parent = self.model_version2 self.model_version3.save() - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.patch( reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}), {"parent": None}, @@ -1332,7 +1332,7 @@ class TestModelAPI(FixtureAPITestCase): s3_presigned_url.return_value = "http://s3/get_url" self.client.force_login(self.user2) - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.patch( reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}), # self.model_version3 is a version of self.model2, while self.model_version1 belongs to self.model1 @@ -1393,7 +1393,7 @@ class TestModelAPI(FixtureAPITestCase): self.client.force_login(self.user2) current_hash = self.model_version3.hash - with self.assertNumQueries(5): + with self.assertNumQueries(4): response = self.client.patch( reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}), {"hash": self.model_version4.hash}, @@ -1463,7 +1463,7 @@ class TestModelAPI(FixtureAPITestCase): current_hash = self.model_version3.hash self.client.force_login(self.user1) - with self.assertNumQueries(6): + with self.assertNumQueries(5): response = self.client.patch( reverse("api:model-version-retrieve", kwargs={"pk": str(self.model_version3.id)}), {"archive_hash": "d" * 32, "hash": "e" * 32, "size": 32}, diff --git a/arkindex/training/tests/test_model_compatible_worker.py b/arkindex/training/tests/test_model_compatible_worker.py index 20a19ff5b7..a1d06e321d 100644 --- a/arkindex/training/tests/test_model_compatible_worker.py +++ b/arkindex/training/tests/test_model_compatible_worker.py @@ -190,12 +190,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): "model": str(self.model1.id), "worker": str(self.worker2.id), }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1, self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -220,12 +220,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): "model": str(self.model1.id), "worker": str(self.worker2.id), }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1, self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -248,12 +248,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): "model": str(self.model1.id), "worker": str(self.worker2.id), }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1, self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -275,12 +275,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): self.assertEqual(response.json(), { "worker": ["This worker is already marked as compatible with this model."], }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1, self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -303,12 +303,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): self.assertEqual(response.json(), { "model": ["This model is archived."], }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -473,12 +473,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -500,12 +500,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -525,12 +525,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -549,14 +549,14 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) self.assertEqual(response.json(), { - "detail": "Not found.", + "detail": "No Model_compatible_workers matches the given query.", }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, @@ -580,12 +580,12 @@ class TestModelCompatibleWorkerManage(FixtureAPITestCase): self.assertEqual(response.json(), { "model": ["This model is archived."], }) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model1.compatible_workers.all(), [self.worker1, self.worker2], ordered=False, ) - self.assertQuerysetEqual( + self.assertQuerySetEqual( self.model2.compatible_workers.all(), [self.worker2], ordered=False, diff --git a/arkindex/users/api.py b/arkindex/users/api.py index 6769b89633..51789957e2 100644 --- a/arkindex/users/api.py +++ b/arkindex/users/api.py @@ -88,9 +88,6 @@ class UserCreate(CreateAPIView): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) - if User.objects.filter(email=serializer.validated_data["email"]).exists(): - raise ValidationError({"email": ["An user with this email address already exists."]}) - user = serializer.save() login(self.request, user) diff --git a/arkindex/users/serializers.py b/arkindex/users/serializers.py index c8060116ea..41ccf7d98b 100644 --- a/arkindex/users/serializers.py +++ b/arkindex/users/serializers.py @@ -7,6 +7,7 @@ from django.db import transaction from django.utils.http import urlsafe_base64_decode from drf_spectacular.utils import extend_schema_field, inline_serializer from rest_framework import serializers +from rest_framework.validators import UniqueValidator from arkindex.documents.models import Corpus from arkindex.users.models import Group, Role, Scope, User, UserScope @@ -99,6 +100,17 @@ class NewUserSerializer(serializers.ModelSerializer): "email", "password" ) + extra_kwargs = { + "email": { + "validators": [ + # DRF automatically adds this validator, but we override it to change the error message + UniqueValidator( + queryset=User.objects.all(), + message="A user with this email address already exists.", + ) + ] + }, + } def validate(self, data): data = super().validate(data) @@ -195,7 +207,9 @@ class UserEmailVerificationSerializer(UserSerializer): "is_admin", "auth_token", ) - extra_kwargs = {} + extra_kwargs = { + "email": {"validators": []} + } def validate(self, data): error_msg = "There is no user with this email or the token is invalid." diff --git a/arkindex/users/tests/test_registration.py b/arkindex/users/tests/test_registration.py index 393d8724cf..17de7a3a79 100644 --- a/arkindex/users/tests/test_registration.py +++ b/arkindex/users/tests/test_registration.py @@ -407,9 +407,9 @@ class TestRegistration(FixtureAPITestCase): format="json", ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertDictEqual(response.json(), {"email": ["An user with this email address already exists."]}) + self.assertDictEqual(response.json(), {"email": ["A user with this email address already exists."]}) - # Asserts that the check is insensitive on the email field + def test_register_existing_user_ignore_case(self): email = "eMaIL@adDreSs.cOm" self.assertTrue(User.objects.filter(email=email).exists()) response = self.client.post( @@ -418,7 +418,7 @@ class TestRegistration(FixtureAPITestCase): format="json", ) self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) - self.assertDictEqual(response.json(), {"email": ["An user with this email address already exists."]}) + self.assertDictEqual(response.json(), {"email": ["A user with this email address already exists."]}) def test_send_validation_email_requires_auth(self): response = self.client.post(reverse("api:send-verification-email")) diff --git a/base/requirements.txt b/base/requirements.txt index 45e9e466e9..7d69933625 100644 --- a/base/requirements.txt +++ b/base/requirements.txt @@ -1,6 +1,6 @@ boto3==1.18.13 cryptography==3.4.7 -Django==4.1.7 +Django==4.2.13 ed25519==1.5 lxml==4.9.2 psycopg2-binary==2.9.1 diff --git a/requirements.txt b/requirements.txt index afa3b928e3..ae31e0fe6f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ django-cors-headers==3.14.0 django-enumfields==2.1.1 django-pgtrigger==4.7.0 django-rq==2.10.1 -djangorestframework==3.14.0 +djangorestframework==3.15.2 djangorestframework-simplejwt==5.2.2 docker==7.0.0 drf-spectacular==0.27.2 diff --git a/tests-requirements.txt b/tests-requirements.txt index a3d8fb5d32..a2566e1498 100644 --- a/tests-requirements.txt +++ b/tests-requirements.txt @@ -1,5 +1,6 @@ coverage==7.2.3 moto==4.1.8 responses==0.23.1 +sqlparse==0.5.0 tripoli==2.0.0 unittest-xml-reporting==3.2.0 -- GitLab