Skip to content
Snippets Groups Projects
Commit ecec72ac authored by Bastien Abadie's avatar Bastien Abadie Committed by Erwan Rouchet
Browse files

Automatically create image server from IIIF url

parent f2e426af
No related branches found
No related tags found
1 merge request!1199Automatically create image server from IIIF url
......@@ -2,6 +2,10 @@ from django.conf import settings
from django.db import models
from django.utils.functional import cached_property
# Lower-case markers that *may* indicate a IIIF server handles
# images after that path
IIIF_MARKERS = ('/iiif/', '/i3f/')
class ImageServerManager(models.Manager):
......@@ -20,6 +24,19 @@ class ImageServerManager(models.Manager):
servers_count = servers.count()
if not servers_count:
# Try to detect a IIIF marker in the url
# and create a new image server automatically
for marker in IIIF_MARKERS:
if marker not in url.lower():
continue
server_url = url[:url.lower().index(marker) + len(marker)]
return self.create(
url=server_url,
display_name=server_url,
validated=True,
)
raise self.model.DoesNotExist(
'This resource does not match any existing image server'
)
......
......@@ -340,6 +340,16 @@ class TestImageApi(FixtureAPITestCase):
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
def test_create_iiif_image_new_server(self):
self.client.force_login(self.superuser)
self.assertFalse(ImageServer.objects.filter(url='https://randomserver.com/iiif').exists())
response = self.client.post(
reverse('api:iiif-url-create'),
{'url': 'https://randomserver.com/iiif/path/to/image.jpg'}
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertTrue(ImageServer.objects.filter(url='https://randomserver.com/iiif').exists())
def test_create_iiif_image_wrong_urls(self):
self.client.force_login(self.superuser)
# Create a server with same prefix as existing one
......@@ -354,9 +364,7 @@ class TestImageApi(FixtureAPITestCase):
'sftp://images.com/iiif/007'
],
'This resource does not match any existing image server': [
'https://images.com/iiif/007',
'https://iiif.net/v2/007',
'ftp://iiif.io/iiif/image_path'
],
'This resource matched multiple existing image servers': [
'https://test-server.eu/images/v2/images/image.jpg'
......
......@@ -147,3 +147,37 @@ class TestImageServer(TestCase):
with self.assertNumQueries(1):
self.assertEqual(objects.local, self.root_srv_1)
self.assertEqual(objects.local, self.root_srv_1)
def test_from_url(self):
"""
Test ImageServer detection from images url
"""
ImageServer.objects.update(validated=True)
self.assertEqual(ImageServer.objects.from_url('http://server.dev/iiif/test.jpg'), self.root_srv_1)
self.assertEqual(ImageServer.objects.from_url('http://server2.dev/iiif/test.jpg'), self.root_srv_2)
self.assertEqual(ImageServer.objects.count(), 5)
# A new server will be created
new_server = ImageServer.objects.from_url('http://new.server.dev/iiif/test.jpg')
self.assertEqual(ImageServer.objects.count(), 6)
self.assertEqual(new_server.url, 'http://new.server.dev/iiif/')
self.assertEqual(new_server.display_name, 'http://new.server.dev/iiif/')
self.assertTrue(new_server.validated)
# And then reused for later calls
self.assertEqual(ImageServer.objects.from_url('http://new.server.dev/iiif/path%2Fto%2Ffile.jpg'), new_server)
self.assertEqual(ImageServer.objects.count(), 6)
# We also support i3f and weird formats
new_server = ImageServer.objects.from_url('https://whatever.online/prefix/I3f/xxx/test.jpg')
self.assertEqual(ImageServer.objects.count(), 7)
self.assertEqual(new_server.url, 'https://whatever.online/prefix/I3f/')
self.assertEqual(new_server.display_name, 'https://whatever.online/prefix/I3f/')
self.assertTrue(new_server.validated)
new_server = ImageServer.objects.from_url('http://whatever.online/prefixYz/IIIf/path/to/image.jpg')
self.assertEqual(ImageServer.objects.count(), 8)
self.assertEqual(new_server.url, 'http://whatever.online/prefixYz/IIIf/')
self.assertEqual(new_server.display_name, 'http://whatever.online/prefixYz/IIIf/')
self.assertTrue(new_server.validated)
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