diff --git a/arkindex/documents/models.py b/arkindex/documents/models.py index 43eaff67f15d1d4d0695c0f8066224360337bf9c..211d9cd44aadec7809872db97ece1605327e7e0a 100644 --- a/arkindex/documents/models.py +++ b/arkindex/documents/models.py @@ -513,3 +513,28 @@ class MetaData(models.Model): unique_together = ( ('element', 'name'), ) + + def is_single_line(self): + return self.type != MetaType.HTML and not self.is_list() and len(self.value.splitlines()) <= 1 + + def is_list(self): + # TODO: Remove is_list when we move to Entities + return self.name.lower() in ('persons', 'places', 'subjects') + + def __eq__(self, other): + if not isinstance(other, MetaData): + return False + return (self.is_single_line(), self.type == MetaType.HTML, self.is_list(), self.name) == ( + other.is_single_line(), other.type == MetaType.HTML, other.is_list(), self.name) + + def __gt__(self, other): + if self.is_single_line(): + return self.name.__gt__(other.name) + if self.type == MetaType.HTML: + return other.is_single_line() + if self.is_list(): + return other.is_single_line() or other.type == MetaType.HTML + return True + + def __ge__(self, other): + return self.__eq__(other) or self.__gt__(other) diff --git a/arkindex/documents/serializers/elements.py b/arkindex/documents/serializers/elements.py index 012e5ba0ada7e71a9994b90c1144bb27678b1ffe..400580ef83442c909a3e18a1910ce071cd79a70b 100644 --- a/arkindex/documents/serializers/elements.py +++ b/arkindex/documents/serializers/elements.py @@ -112,7 +112,10 @@ class ActSerializer(serializers.ModelSerializer): read_only=True, ) children = ElementLightSerializer(source='child_elements', read_only=True, many=True) - metadatas = MetaDataSerializer(read_only=True, many=True) + metadata = serializers.SerializerMethodField() + + def get_metadata(self, obj): + return MetaDataSerializer(sorted(list(obj.metadatas.all())), many=True).data class Meta: model = Act @@ -122,7 +125,7 @@ class ActSerializer(serializers.ModelSerializer): 'number', 'parents', 'children', - 'metadatas', + 'metadata', ) read_only_fields = ('id', ) diff --git a/arkindex/documents/tests/test_act.py b/arkindex/documents/tests/test_act.py index c4958d21e703cbfd2792c1c5884868ab691e0018..2396012b53c539ab9affb148a2b5a436114948d2 100644 --- a/arkindex/documents/tests/test_act.py +++ b/arkindex/documents/tests/test_act.py @@ -59,7 +59,7 @@ class TestAct(FixtureAPITestCase): 'type': 'surface', } ], - 'metadatas': []} + 'metadata': []} ) def test_act_metadatas(self): @@ -68,7 +68,7 @@ class TestAct(FixtureAPITestCase): # No metadatas in api response = self.client.get(reverse('api:act-edit', kwargs={'pk': self.act.id})) self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertListEqual(response.json()['metadatas'], []) + self.assertListEqual(response.json()['metadata'], []) # Create some metadatas metas = [ @@ -81,7 +81,7 @@ class TestAct(FixtureAPITestCase): response = self.client.get(reverse('api:act-edit', kwargs={'pk': self.act.id})) self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertListEqual( - response.json()['metadatas'], + response.json()['metadata'], [{'id': str(metas[1].id), 'name': 'origin', 'type': 'date', diff --git a/arkindex/documents/tests/test_metadata.py b/arkindex/documents/tests/test_metadata.py new file mode 100644 index 0000000000000000000000000000000000000000..de89dfa870f08a98dbedfe2edd4e88106acf2088 --- /dev/null +++ b/arkindex/documents/tests/test_metadata.py @@ -0,0 +1,24 @@ +from arkindex.documents.models import MetaData, MetaType +from django.test import TestCase + + +class TestMetaData(TestCase): + + def test_sort(self): + data = [ + MetaData(name="persons", type=MetaType.Text, value='a'), + MetaData(name="location", type=MetaType.Location, value='somewhere'), + MetaData(name="summary", type=MetaType.HTML, value='<a>a</a>'), + MetaData(name="places", type=MetaType.Text, value='a\na'), + MetaData(name="something", type=MetaType.Text, value='in one line'), + MetaData(name="other thing", type=MetaType.Text, value='in\nmultiple\nlines'), + MetaData(name="subjects", type=MetaType.Text, value='a\na\na'), + MetaData(name="date", type=MetaType.Date, value='1337-04-02'), + ] + + data = sorted(data) + + self.assertListEqual( + [m.name for m in data], + ['date', 'location', 'something', 'summary', 'persons', 'places', 'subjects', 'other thing'], + )