From 41aa03f7aac20f137d99d3c1cec6e81091e3c723 Mon Sep 17 00:00:00 2001 From: Eva Bardou <ebardou@teklia.com> Date: Thu, 29 Apr 2021 12:09:57 +0200 Subject: [PATCH] Implement UFCN custom_open_image behaviour in basic open_image function --- arkindex_worker/models.py | 23 ++++++++++++++++++++--- tests/test_element.py | 28 ++++++++++++++-------------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/arkindex_worker/models.py b/arkindex_worker/models.py index 356eb490..bea558be 100644 --- a/arkindex_worker/models.py +++ b/arkindex_worker/models.py @@ -55,6 +55,14 @@ class Element(MagicDict): Describes any kind of element. """ + def resize_zone_url(self, size="full"): + if size == "full": + return self.zone.url + else: + parts = self.zone.url.split("/") + parts[-3] = size + return "/".join(parts) + def image_url(self, size="full"): """ When possible, will return the S3 URL for images, so an ML worker can bypass IIIF servers @@ -79,10 +87,16 @@ class Element(MagicDict): bounding_box = polygon_bounding_box(self.zone.polygon) return bounding_box.width > max_width or bounding_box.height > max_height - def open_image(self, *args, max_size=None, **kwargs): + def open_image(self, *args, max_size=None, use_full_image=False, **kwargs): """ Open this element's image as a Pillow image. - This does not crop the image to the element's polygon. + + If use_full_image is False: + Use zone url, instead of the full image url to be able to get + single page from double page image. + Else: + This does not crop the image to the element's polygon. + :param max_size: Subresolution of the image. """ if not self.get("zone"): @@ -119,7 +133,10 @@ class Element(MagicDict): resize = "full" try: - return open_image(self.image_url(resize), *args, **kwargs) + if use_full_image: + return open_image(self.image_url(resize), *args, **kwargs) + else: + return open_image(self.resize_zone_url(resize), *args, **kwargs) except HTTPError as e: if ( self.zone.image.get("s3_url") is not None diff --git a/tests/test_element.py b/tests/test_element.py index 072405b2..bd2d5697 100644 --- a/tests/test_element.py +++ b/tests/test_element.py @@ -62,7 +62,7 @@ def test_open_image(mocker): } } ) - assert elt.open_image() == "an image!" + assert elt.open_image(use_full_image=True) == "an image!" assert open_mock.call_count == 1 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" @@ -87,19 +87,19 @@ def test_open_image_resize_portrait(mocker): } ) # Resize = original size - assert elt.open_image(max_size=600) == "an image!" + assert elt.open_image(max_size=600, use_full_image=True) == "an image!" assert open_mock.call_count == 1 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" ) # Resize = smaller height - assert elt.open_image(max_size=400) == "an image!" + assert elt.open_image(max_size=400, use_full_image=True) == "an image!" assert open_mock.call_count == 2 assert open_mock.call_args == mocker.call( "http://something/full/266,400/0/default.jpg" ) # Resize = bigger height - assert elt.open_image(max_size=800) == "an image!" + assert elt.open_image(max_size=800, use_full_image=True) == "an image!" assert open_mock.call_count == 3 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" @@ -123,7 +123,7 @@ def test_open_image_resize_partial_element(mocker): } } ) - assert elt.open_image(max_size=400) == "an image!" + assert elt.open_image(max_size=400, use_full_image=True) == "an image!" assert open_mock.call_count == 1 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" @@ -148,19 +148,19 @@ def test_open_image_resize_landscape(mocker): } ) # Resize = original size - assert elt.open_image(max_size=600) == "an image!" + assert elt.open_image(max_size=600, use_full_image=True) == "an image!" assert open_mock.call_count == 1 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" ) # Resize = smaller width - assert elt.open_image(max_size=400) == "an image!" + assert elt.open_image(max_size=400, use_full_image=True) == "an image!" assert open_mock.call_count == 2 assert open_mock.call_args == mocker.call( "http://something/full/400,266/0/default.jpg" ) # Resize = bigger width - assert elt.open_image(max_size=800) == "an image!" + assert elt.open_image(max_size=800, use_full_image=True) == "an image!" assert open_mock.call_count == 3 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" @@ -185,19 +185,19 @@ def test_open_image_resize_square(mocker): } ) # Resize = original size - assert elt.open_image(max_size=400) == "an image!" + assert elt.open_image(max_size=400, use_full_image=True) == "an image!" assert open_mock.call_count == 1 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" ) # Resize = smaller - assert elt.open_image(max_size=200) == "an image!" + assert elt.open_image(max_size=200, use_full_image=True) == "an image!" assert open_mock.call_count == 2 assert open_mock.call_args == mocker.call( "http://something/full/200,200/0/default.jpg" ) # Resize = bigger - assert elt.open_image(max_size=800) == "an image!" + assert elt.open_image(max_size=800, use_full_image=True) == "an image!" assert open_mock.call_count == 3 assert open_mock.call_args == mocker.call( "http://something/full/full/0/default.jpg" @@ -234,7 +234,7 @@ def test_open_image_s3(mocker): elt = Element( {"zone": {"image": {"url": "http://something", "s3_url": "http://s3url"}}} ) - assert elt.open_image() == "an image!" + assert elt.open_image(use_full_image=True) == "an image!" assert open_mock.call_count == 1 assert open_mock.call_args == mocker.call("http://s3url") @@ -256,7 +256,7 @@ def test_open_image_s3_retry(mocker): ) with pytest.raises(NotImplementedError): - elt.open_image() + elt.open_image(use_full_image=True) def test_open_image_s3_retry_once(mocker): @@ -274,4 +274,4 @@ def test_open_image_s3_retry_once(mocker): ) with pytest.raises(NotImplementedError): - elt.open_image() + elt.open_image(use_full_image=True) -- GitLab