diff --git a/arkindex/documents/models.py b/arkindex/documents/models.py index 046b66237cdce8f70938c3b9fac2968ff4a57651..5d0109d11b64ea98a14d67e3cf857785c2806376 100644 --- a/arkindex/documents/models.py +++ b/arkindex/documents/models.py @@ -1,6 +1,6 @@ import re import uuid -from urllib.parse import urljoin +from urllib.parse import urljoin, urlparse from django.conf import settings from django.contrib.contenttypes.fields import GenericRelation @@ -649,6 +649,11 @@ class Element(IndexableModel): from arkindex.project.tools import bounding_box x, y, width, height = bounding_box(self.polygon) + # Handle IIIF URLs with query parameters (cannot use urljoin as it will remove the query parameters) + parsed_url = urlparse(self.image.url) + if parsed_url.query: + return f"{self.image.url}/{x},{y},{width},{height}/full/0/default.jpg" + return urljoin( self.image.url + "/", f"{x},{y},{width},{height}/full/0/default.jpg" @@ -671,6 +676,12 @@ class Element(IndexableModel): # Do no attempt to upsize small images for thumbnails thumbnail_height = min(400, height) + + # Handle IIIF URLs with query parameters (cannot use urljoin as it will remove the query parameters) + parsed_url = urlparse(self.image.url) + if parsed_url.query: + return f"{self.image.url}/{x},{y},{width},{height}/,{thumbnail_height}/{rotation_param}/default.jpg" + return urljoin( self.image.url + "/", f"{x},{y},{width},{height}/,{thumbnail_height}/{rotation_param}/default.jpg" diff --git a/arkindex/documents/tests/test_element.py b/arkindex/documents/tests/test_element.py index a2e101144c4fa2d7a4c23c20a4e105145a36e9df..b0e0fef47c015fbfe2d16927bf598e144fa0bb91 100644 --- a/arkindex/documents/tests/test_element.py +++ b/arkindex/documents/tests/test_element.py @@ -36,23 +36,51 @@ class TestElement(FixtureTestCase): ) self.assertEqual(element.iiif_url, "http://server/img1/10,20,30,40/full/0/default.jpg") + def test_iiif_url_query_params(self): + # Element.iiif_url can handles URLs with query parameters + test_image = self.imgsrv.images.create(path="blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif", width=1000, height=1000,) + element = Element( + name="Something", + type=self.element_type, + image=test_image, + polygon=[ + [10, 20], + [40, 20], + [40, 60], + [10, 60], + [10, 20], + ], + ) + self.assertEqual(element.iiif_url, "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/full/0/default.jpg") + def test_iiif_thumbnail_url(self): + test_image = self.imgsrv.images.create(path="blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif", width=1000, height=1000,) + cases = [ - (0, False, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/0/default.jpg"), - (0, True, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/!0/default.jpg"), - (180, False, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/180/default.jpg"), - (180, True, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/!180/default.jpg"), - (0, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/0/default.jpg"), - (0, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!0/default.jpg"), - (180, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/180/default.jpg"), - (180, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!180/default.jpg"), + (self.image, 0, False, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/0/default.jpg"), + (self.image, 0, True, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/img1/500,100,150,700/,400/!0/default.jpg"), + (self.image, 180, False, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/180/default.jpg"), + (self.image, 180, True, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/img1/500,580,150,120/,120/!180/default.jpg"), + (self.image, 0, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/0/default.jpg"), + (self.image, 0, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!0/default.jpg"), + (self.image, 180, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/180/default.jpg"), + (self.image, 180, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/img1/10,20,30,40/,40/!180/default.jpg"), + # Image with query parameters in the IIIF URL + (test_image, 0, False, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,100,150,700/,400/0/default.jpg"), + (test_image, 0, True, [[500, 100], [650, 100], [650, 800], [500, 800], [500, 100]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,100,150,700/,400/!0/default.jpg"), + (test_image, 180, False, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,580,150,120/,120/180/default.jpg"), + (test_image, 180, True, [[500, 580], [650, 580], [650, 700], [500, 700], [500, 580]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/500,580,150,120/,120/!180/default.jpg"), + (test_image, 0, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/0/default.jpg"), + (test_image, 0, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/!0/default.jpg"), + (test_image, 180, False, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/180/default.jpg"), + (test_image, 180, True, [[10, 20], [40, 20], [40, 60], [10, 60], [10, 20]], "http://server/blahblah-bin/something.something?IIIF=01/02/2020601/https___moon_prism__power/makeup.original.tif/10,20,30,40/,40/!180/default.jpg"), ] - for rotation_angle, mirrored, polygon, expected_url in cases: + for image, rotation_angle, mirrored, polygon, expected_url in cases: with self.subTest(rotation_angle=rotation_angle, mirrored=mirrored): element = Element( name="Something", type=self.element_type, - image=self.image, + image=image, polygon=polygon, rotation_angle=rotation_angle, mirrored=mirrored,