diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py index 4d6f2a44814e948cbfa4b23a976c64cab5d394ae..6a5d8fea87ea5221f733e14b9cae22d9ed26abf4 100644 --- a/arkindex/documents/api/elements.py +++ b/arkindex/documents/api/elements.py @@ -21,6 +21,7 @@ from django.db.models import ( prefetch_related_objects, ) from django.db.models.functions import Cast +from django.http import Http404 from django.shortcuts import get_object_or_404 from django.utils.functional import cached_property from drf_spectacular.types import OpenApiTypes @@ -1291,7 +1292,11 @@ class ElementRetrieve(ACLMixin, RetrieveUpdateDestroyAPIView): def get_object(self): # Prevent duplicating database request if not hasattr(self, "element"): - self.element = super().get_object() + try: + self.element = super().get_object() + except Http404: + # Replacing the default "No Element matches the given query" message + raise Http404(f"Element {self.kwargs['pk']} not found.") return self.element def get_queryset(self): diff --git a/arkindex/documents/tests/test_retrieve_elements.py b/arkindex/documents/tests/test_retrieve_elements.py index 5632a510b69d8845cd1afbf6bfc3f7626476c06c..4a7226a344ee0efe4dbd46735d86ca086e5b1ed7 100644 --- a/arkindex/documents/tests/test_retrieve_elements.py +++ b/arkindex/documents/tests/test_retrieve_elements.py @@ -25,6 +25,12 @@ class TestRetrieveElements(FixtureAPITestCase): super().setUp() self.page = self.corpus.elements.get(name="Volume 1, page 1r") + def test_get_element_does_not_exist(self): + with self.assertNumQueries(1): + response = self.client.get(reverse("api:element-retrieve", kwargs={"pk": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"})) + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(response.json(), {"detail": "Element aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa not found."}) + def test_get_element(self): ml_class = MLClass.objects.create(name="text", corpus=self.corpus) classification = self.vol.classifications.create(worker_version=self.worker_version, worker_run=self.worker_run, ml_class=ml_class, confidence=0.8)