diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ca2ec5a629f2a70b1ea1e31412691b479a137e43..c58015fa048d18a3d520bd6ae5142764e5d62978 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 29185f9b0d4c36622dbc9171bf22c329505e4891..591f81dd54dd465832f8e0497f3895677af12bdb 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 bae7596a20b60e587058f283515abe7628e32064..7a59f33418a604b88eb369a6c09a738d9cafc65d 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 b7d70eb7852d42b9023af21f01e714b19b54d1be..f1de6db990c54cdbecdcd1562245d686e1bf7639 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 d4b500c73569d9ba14d1d31e445b3280343aee88..85664b510acfbfaa7428919aa6cb09fab7cd59c8 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 fc6b747da335aabf97e8f0c20826808aa1a9c626..9dddf4bde8c95a948a197c69264278c9cdbad9e9 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 ee5b35614b928cc7d251954c2640f925ea3a01db..89eb4f5bace02e2a107a12feb7d7c14542959400 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 23c898525498a9f0762dce10a5875418bfeb3c41..a949b6e74dcc6a2af3be28b69472f1feb1725ae7 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 80522fc451a73b6cd7a6867ad7c96260232cd00d..9348ee6dcce7e8d4b384d9da94728d74cc16cc19 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 2fe56cd2fe22fbf09f8c694c1d450e84f8da4ab7..9aacaf4d34af09a2817daf16e51ba0868f37113c 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 36970acf11db753ba11684eea97bf8862c913f72..d2fc1d7bda25f8561c1c55895950aabdba46a089 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 618f9aa9eee3ba2405e0e68be69c60212be4d232..f884be9df2d491ab45e79f2e96c76a538657ea72 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 d7663b63f4618322bbda48379e5a50032b855a27..5b9b3914fe2e655bc97817e55155d7e4fba32551 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 6d9e2ee6a2c3f74561f89394324dbdd1f3e004da..b8f6c60f3e2a3ef59238a0392ee0283196317a2a 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 f314f3e1a04e2d9ddd0ff51115a3a5bb886e4037..373dc6dc0a4e04b1fb0d9e72512637b12f24413c 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 ddb62ef3d3bd3cd06d77df0ca3bf242000308210..dc69c9734f620296462c965b3e41ddf9368680aa 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 802e11c757343a3cbdcf90fed70e9633f957424c..5033161fac9846353985d19fe2c4fedc58f63676 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 3719074bad7d53449539e6179dd46a562b3127ac..ecc6f86160753e32daac2557625c78d27bf95b5d 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 efd8b2a4e1ec1ab62d19553723577fa2c82b05be..a69e3b1ed4cd7b89b98443eb4493e8b7662143ee 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 3ca0775144b31712cf9d01fed8c168bcfa28b284..ac749492b81df2cec7414bd43c623db4d19531e1 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 ef58ba9c33eff9aa2d6be4912a4c6cea74013a87..95a03e4c36ca62a1f412f6301d68a9426c37133c 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 afeaeaf25f68b6b6750494f2ed2524e2233d67bb..b4b40ee64d8d131e71680887ae6a25c129aebf0d 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 ab448463f8b008537077603e579814aea024c477..989e1aeb96fd6be8299035b1d0c227a996604612 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 94369ab03b01498afecf35e500cb54d8c81bbf84..755f1b3fba9910e0f10aa7928806985768a33b4b 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 ba4374ad9b9d833fc176ee9ed2c7f8d9d6e0c8a6..0d8691022ae2be762d6e99705a4321f2915617e4 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 5bd41790a3b95dffce1f82660d6e1523d816eae9..354e208d6070f14d16b1290e5228ee07924927c4 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 5bd41790a3b95dffce1f82660d6e1523d816eae9..354e208d6070f14d16b1290e5228ee07924927c4 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 0ad34d8158a14e83173c689578007cae862219be..180543969b7f03f13feacdc75d18440d104e2062 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 b63124f7c229b37bf6460ea2202a729b9f785f9d..7372e92cfe80826f4cb7386d23dbc070c965cbde 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 f8d72615855a09982e74956399d2a610398db8cd..3a3158045e2a82b71bc3dc7626dcf4a4c7033ab4 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 2777d0d4ef7c99d0105c994f6521d3fbfd690b2c..65f43b8174dbb8d66c406862ef62c4adeec110d6 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 6710d5e0f85a9237dae975069b430d4d7d7e96fc..a9a497c321403265231ce8392bfd126651d32f4b 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 3087532fd0d1af1d4ba9ccc640a4c043230453ea..03c040152c5e3f753d5617b4c972f783eeed3e00 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 9d89dc7c0ec86556af2927dece2c53a23268d167..7a689853ec57350c081348192797ac83ed0b8d8d 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 0ec747fdade130f12190a588659ec2b85277028a..a757299fb87794f180b62d5be7b0aba79f792511 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 9dd30683ac5939138d87d59ff8b85a7763f0f5b1..fa81733d12fb29f028d5348cb35ed6d96794c7df 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 d5670523cb70f2af9441da7ff753b592161be2fa..c1565c51de3235b33068628fec68dd730438e3c6 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 4d31a5ff820082b6dd3200c9cc501458aed6ca51..dba5386430e325efe67307007ec0b1af839f9177 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 c05f2af5dafc765f547ba9236ab10faffc24c08e..7d86e0d01945344eb36a0f4c88df5e20f5eaca33 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 b0fe051fd7af7137ad8735bcc12187b4dba8908c..afbb1ee13b353ad86d4a0a1746799073eaf36f97 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 1f7a8878f002212c850049203263228230e49233..3f7e78812071e184a6aa9a62d332b70dd4751789 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 91623264d44c5dc3b5f08eb0425bc69ee0b36aae..522be37240fad985107954ddf49098be0c261c06 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 eec3d75ca84a3732c124497d61a0f16da46b75ff..073cd3dc98b317958739b6683c4bbfcbc63fe66e 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 9cd60e6a34c0d2717e42a40329f09c50be7f94f7..96b73b3e13704e3c34371d865d137002fc4e7633 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 d5c3f630efd1c5ec7ae6a63b1c96251765a7a3d9..cafedafb83aba56654d34b3a7e5d6b835d8aec2b 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 1bb2a5aa915b3263e7752fba027b9f7e37ac5b7b..5fab4af070552dec22fca1248b5c410bacf25023 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 93038de206903844350e429ce057008736a82465..6a7fce49213e6e3e970893ff8b96bfb521db26f0 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 20a19ff5b7ea233d6b306dc088aaa8ec97a3c4b9..a1d06e321d17944c1c5b3c053cd05650d2deb6ab 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 6769b896330677403d23f39a0125ceb5ef7085eb..51789957e2f052da933f24ecf3fb1b790e7607e7 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 c8060116eae68a406289dc03eb51fbe7d5f212d8..41ccf7d98b1864079140297123da71bd6a177163 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 393d8724cf6eb27dae7663d137a921aff20a17e4..17de7a3a798df534b3eb4ed4ab07cbde833e95d1 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 45e9e466e9abcb9a5aa4b7469517f35f779b973e..7d6993362554d236d4b0745fc9461d585b9cc17f 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 afa3b928e3b1d091bb04b8180405e07bc155dfeb..ae31e0fe6f03fbb6442f81ebce6ec321a1c9e4f2 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 a3d8fb5d32611c4abdb0b238a75f00d1eca6571c..a2566e14984fb1c6411f417754acc2ad5f00a35c 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