Skip to content
Snippets Groups Projects
Commit 30847b83 authored by Erwan Rouchet's avatar Erwan Rouchet
Browse files

Merge branch 'fix-638' into 'master'

Automatically create image server from IIIF url

Closes #638

See merge request !1199
parents f2e426af ecec72ac
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