From 2d6606b0b13c78c9d2ef4fe08c0a3be661c042b1 Mon Sep 17 00:00:00 2001
From: mlbonhomme <bonhomme@teklia.com>
Date: Tue, 10 Sep 2024 16:32:56 +0200
Subject: [PATCH] Replace default Element not found message with
 ElementRetrieve

---
 arkindex/documents/api/elements.py                 | 7 ++++++-
 arkindex/documents/tests/test_retrieve_elements.py | 6 ++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py
index 4d6f2a4481..6a5d8fea87 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 5632a510b6..4a7226a344 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)
-- 
GitLab