Skip to content
Snippets Groups Projects
Commit 9de3a947 authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'volume-metadata-iiif' into 'master'

Add volume and act metadata in IIIF manifests

See merge request !147
parents 08ed4674 48bdc53e
No related branches found
No related tags found
1 merge request!147Add volume and act metadata in IIIF manifests
from django.conf import settings
from rest_framework import serializers
from arkindex.documents.models import Element, ElementType, Page, Act
from arkindex.documents.models import Element, ElementType, Page, Act, MetaData, MetaType
from arkindex.images.models import Image, Zone
from arkindex.project.tools import sslify_url, build_absolute_url
import urllib.parse
......@@ -44,6 +44,15 @@ class ImageThumbnailManifestSerializer(serializers.BaseSerializer):
}
class ManifestMetadataSerializer(serializers.ModelSerializer):
label = serializers.CharField(source='name')
class Meta:
model = MetaData
fields = ('label', 'value')
class ElementCanvasManifestSerializer(serializers.BaseSerializer):
"""
Serialize an element's zone into a IIIF canvas
......@@ -157,7 +166,12 @@ class ManifestSerializer(serializers.BaseSerializer):
],
"viewingHint": "individuals",
"label": element.name,
"viewingDirection": "left-to-right"
"viewingDirection": "left-to-right",
"metadata": ManifestMetadataSerializer(
element.metadatas.exclude(type=MetaType.HTML),
context=self.context,
many=True,
).data,
}
def get_canvases(self, element):
......
......@@ -2,7 +2,7 @@ from django.urls import reverse
from arkindex.project.tests import FixtureAPITestCase
from rest_framework import status
from tripoli import IIIFValidator
from arkindex.documents.models import Element, ElementType
from arkindex.documents.models import Element, ElementType, MetaType
class TestVolumeManifestSerializer(FixtureAPITestCase):
......@@ -11,6 +11,11 @@ class TestVolumeManifestSerializer(FixtureAPITestCase):
def test_normal_manifest(self):
# Just a normal situation.
vol = Element.objects.get(type=ElementType.Volume, name="Volume 1")
vol.metadatas.create(name='test 1', type=MetaType.Text, value='Blah')
vol.metadatas.create(name='test 2', type=MetaType.Date, value='1337-01-01')
vol.metadatas.create(name='test 3', type=MetaType.Location, value='Somewhere')
vol.metadatas.create(name='test 4', type=MetaType.HTML, value='<p>oh no</p>')
response = self.client.get(reverse('api:volume-manifest', kwargs={'pk': vol.id}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
manifest = response.json()
......@@ -22,6 +27,7 @@ class TestVolumeManifestSerializer(FixtureAPITestCase):
self.assertIn("structures", manifest)
self.assertIn("sequences", manifest)
self.assertIn("label", manifest)
self.assertIn("metadata", manifest)
self.assertEqual(manifest['@type'], "sc:Manifest")
self.assertEqual(manifest['@context'],
......@@ -73,6 +79,13 @@ class TestVolumeManifestSerializer(FixtureAPITestCase):
self.assertEqual(res['service']['profile'],
"http://iiif.io/api/image/2/level2.json")
self.assertEqual(len(manifest['metadata']), 3)
self.assertCountEqual(manifest['metadata'], [
{"label": "test 1", "value": "Blah"},
{"label": "test 2", "value": "1337-01-01"},
{"label": "test 3", "value": "Somewhere"},
])
def test_no_page(self):
# A manifest for an empty volume
response = self.client.get(reverse('api:volume-manifest', kwargs={
......@@ -83,6 +96,7 @@ class TestVolumeManifestSerializer(FixtureAPITestCase):
self.assertEqual(manifest['thumbnail'], None)
self.assertEqual(len(manifest['structures']), 1)
self.assertEqual(len(manifest['metadata']), 0)
topstruct = manifest['structures'][0]
self.assertEqual(len(topstruct['ranges']), 0)
self.assertEqual(len(manifest['sequences']), 1)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment