From 1920af583bca423ff37fdcb5079f2aeb93840fe6 Mon Sep 17 00:00:00 2001
From: Erwan Rouchet <rouchet@teklia.com>
Date: Tue, 6 Aug 2024 14:46:28 +0200
Subject: [PATCH] Replace classes with classifications in element lists

---
 arkindex/documents/api/elements.py                 |  8 ++++++--
 arkindex/documents/serializers/elements.py         |  5 +++--
 arkindex/documents/tests/test_children_elements.py | 12 ++++++------
 arkindex/documents/tests/test_classes.py           |  8 ++++----
 arkindex/documents/tests/test_parents_elements.py  |  2 +-
 arkindex/training/tests/test_datasets_api.py       |  8 ++++----
 6 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/arkindex/documents/api/elements.py b/arkindex/documents/api/elements.py
index 754c780007..831f54678d 100644
--- a/arkindex/documents/api/elements.py
+++ b/arkindex/documents/api/elements.py
@@ -465,7 +465,7 @@ class ElementsListAutoSchema(AutoSchema):
                 OpenApiParameter(
                     "with_classes",
                     description="Returns all classifications for each element. "
-                                "Otherwise, `classes` will always be null.",
+                                "Otherwise, `classifications` will always be null.",
                     type=bool,
                     required=False,
                 ),
@@ -922,7 +922,11 @@ class ElementsListBase(CorpusACLMixin, DestroyModelMixin, ListAPIView):
 
         with_classes = self.clean_params.get("with_classes")
         if with_classes and with_classes.lower() not in ("false", "0"):
-            prefetch.add(Prefetch("classifications", queryset=classifications_queryset, to_attr="classes"))
+            prefetch.add(Prefetch(
+                "classifications",
+                queryset=classifications_queryset,
+                to_attr="prefetched_classifications",
+            ))
 
         with_metadata = self.clean_params.get("with_metadata")
         if with_metadata and with_metadata.lower() not in ("false", "0"):
diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py
index 578b57de9a..e8c014777a 100644
--- a/arkindex/documents/serializers/elements.py
+++ b/arkindex/documents/serializers/elements.py
@@ -418,11 +418,12 @@ class ElementTinySerializer(serializers.ModelSerializer):
 
 class ElementListSerializer(ElementTinySerializer):
     created = serializers.DateTimeField(read_only=True)
-    classes = ClassificationSerializer(
+    classifications = ClassificationSerializer(
         many=True,
         default=None,
         read_only=True,
         help_text="Classifications on this element, if the `with_classes` option has been enabled.",
+        source="prefetched_classifications",
     )
     metadata = MetaDataLightSerializer(
         many=True,
@@ -463,7 +464,7 @@ class ElementListSerializer(ElementTinySerializer):
         model = Element
         fields = ElementTinySerializer.Meta.fields + (
             "created",
-            "classes",
+            "classifications",
             "metadata",
             "transcriptions",
             "has_children",
diff --git a/arkindex/documents/tests/test_children_elements.py b/arkindex/documents/tests/test_children_elements.py
index c127584ea8..9515f9b9a3 100644
--- a/arkindex/documents/tests/test_children_elements.py
+++ b/arkindex/documents/tests/test_children_elements.py
@@ -104,7 +104,7 @@ class TestChildrenElements(FixtureAPITestCase):
                     "name": self.corpus.name,
                     "public": self.corpus.public,
                 },
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
@@ -135,7 +135,7 @@ class TestChildrenElements(FixtureAPITestCase):
                     "name": self.corpus.name,
                     "public": self.corpus.public,
                 },
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
@@ -185,7 +185,7 @@ class TestChildrenElements(FixtureAPITestCase):
                     "name": self.corpus.name,
                     "public": self.corpus.public,
                 },
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
@@ -215,7 +215,7 @@ class TestChildrenElements(FixtureAPITestCase):
                 "rotation_angle": 0,
                 "mirrored": False,
                 "created": lonely_element.created.isoformat().replace("+00:00", "Z"),
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
@@ -260,7 +260,7 @@ class TestChildrenElements(FixtureAPITestCase):
                 "rotation_angle": 0,
                 "mirrored": False,
                 "created": lonely_element.created.isoformat().replace("+00:00", "Z"),
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
@@ -295,7 +295,7 @@ class TestChildrenElements(FixtureAPITestCase):
                 "rotation_angle": 0,
                 "mirrored": False,
                 "created": worker_run_child.created.isoformat().replace("+00:00", "Z"),
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
diff --git a/arkindex/documents/tests/test_classes.py b/arkindex/documents/tests/test_classes.py
index b0fd1b3f29..a91094f0c9 100644
--- a/arkindex/documents/tests/test_classes.py
+++ b/arkindex/documents/tests/test_classes.py
@@ -331,7 +331,7 @@ class TestClasses(FixtureAPITestCase):
         self.assertEqual(data["count"], 12)
         for elt in data["results"]:
             self.assertCountEqual(
-                list(map(lambda c: (c["worker_run"], c["ml_class"]["name"], c["confidence"]), elt["classes"])),
+                list(map(lambda c: (c["worker_run"], c["ml_class"]["name"], c["confidence"]), elt["classifications"])),
                 [
                     ({"id": str(self.worker_run_1.id), "summary": self.worker_run_1.summary}, "cover", .99),
                     ({"id": str(self.worker_run_2.id), "summary": self.worker_run_2.summary}, "cover", .99),
@@ -351,7 +351,7 @@ class TestClasses(FixtureAPITestCase):
             )
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         for elt in response.json()["results"]:
-            self.assertIsNone(elt["classes"])
+            self.assertIsNone(elt["classifications"])
 
     def test_element_parents_classes(self):
         with self.assertNumQueries(6):
@@ -364,7 +364,7 @@ class TestClasses(FixtureAPITestCase):
         self.assertEqual(data["count"], 12)
         for elt in data["results"]:
             self.assertCountEqual(
-                list(map(lambda c: (c["worker_run"], c["ml_class"]["name"], c["confidence"]), elt["classes"])),
+                list(map(lambda c: (c["worker_run"], c["ml_class"]["name"], c["confidence"]), elt["classifications"])),
                 [
                     ({"id": str(self.worker_run_1.id), "summary": self.worker_run_1.summary}, "cover", .99),
                     ({"id": str(self.worker_run_2.id), "summary": self.worker_run_2.summary}, "cover", .99),
@@ -384,7 +384,7 @@ class TestClasses(FixtureAPITestCase):
         self.assertEqual(data["count"], 12)
         for elt in data["results"]:
             self.assertCountEqual(
-                list(map(lambda c: (c["worker_run"], c["ml_class"]["name"], c["confidence"]), elt["classes"])),
+                list(map(lambda c: (c["worker_run"], c["ml_class"]["name"], c["confidence"]), elt["classifications"])),
                 [
                     ({"id": str(self.worker_run_1.id), "summary": self.worker_run_1.summary}, "cover", .99),
                     ({"id": str(self.worker_run_2.id), "summary": self.worker_run_2.summary}, "cover", .99),
diff --git a/arkindex/documents/tests/test_parents_elements.py b/arkindex/documents/tests/test_parents_elements.py
index 829eaf9868..08af037a84 100644
--- a/arkindex/documents/tests/test_parents_elements.py
+++ b/arkindex/documents/tests/test_parents_elements.py
@@ -84,7 +84,7 @@ class TestParentsElements(FixtureAPITestCase):
                 "confidence": None,
                 "zone": None,
                 "created": "2020-02-02T01:23:45.678000Z",
-                "classes": None,
+                "classifications": None,
                 "has_children": None,
                 "metadata": None,
                 "transcriptions": None,
diff --git a/arkindex/training/tests/test_datasets_api.py b/arkindex/training/tests/test_datasets_api.py
index 0113b00ca0..366166fa9b 100644
--- a/arkindex/training/tests/test_datasets_api.py
+++ b/arkindex/training/tests/test_datasets_api.py
@@ -1368,7 +1368,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                         "url": "http://server/img1/0,0,1000,1000/full/0/default.jpg"
                     },
                     "rotation_angle": 0,
-                    "classes": None,
+                    "classifications": None,
                     "has_children": None,
                     "metadata": None,
                     "transcriptions": None,
@@ -1417,7 +1417,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                         "url": "http://server/img2/0,0,1000,1000/full/0/default.jpg"
                     },
                     "rotation_angle": 0,
-                    "classes": None,
+                    "classifications": None,
                     "has_children": None,
                     "metadata": None,
                     "transcriptions": None,
@@ -1466,7 +1466,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                         "url": "http://server/img3/0,0,1000,1000/full/0/default.jpg"
                     },
                     "rotation_angle": 42,
-                    "classes": None,
+                    "classifications": None,
                     "has_children": None,
                     "metadata": None,
                     "transcriptions": None,
@@ -1490,7 +1490,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
                     },
                     "zone": None,
                     "rotation_angle": 0,
-                    "classes": None,
+                    "classifications": None,
                     "has_children": None,
                     "metadata": None,
                     "transcriptions": None,
-- 
GitLab