Skip to content

Commit 87041a5

Browse files
marthamarealMalteIwanicki
authored andcommitted
[Fixes GeoNode#10041] Review the thumbnail scaling process (GeoNode#10046)
* -[Fixes GeoNode#10040] Remove auto-generated thumbnail for documents * - update thumbnail pixels * - add tests * - fix-tests * - fix-tests
1 parent 25e5a84 commit 87041a5

File tree

6 files changed

+51
-124
lines changed

6 files changed

+51
-124
lines changed

geonode/base/models.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -1741,8 +1741,7 @@ def save_thumbnail(self, filename, image):
17411741
url = storage_manager.url(upload_path)
17421742
try:
17431743
# Optimize the Thumbnail size and resolution
1744-
_default_thumb_size = getattr(
1745-
settings, 'THUMBNAIL_GENERATOR_DEFAULT_SIZE', {'width': 240, 'height': 200})
1744+
_default_thumb_size = settings.THUMBNAIL_SIZE
17461745
im = Image.open(storage_manager.open(actual_name))
17471746
im.thumbnail(
17481747
(_default_thumb_size['width'], _default_thumb_size['height']),

geonode/documents/renderers.py

-118
This file was deleted.

geonode/documents/tasks.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
#
1818
#########################################################################
19+
import io
20+
21+
from PIL import Image
22+
1923
from celery.utils.log import get_task_logger
2024

2125
from geonode.celery_app import app
2226
from geonode.storage.manager import storage_manager
2327

2428
from ..base.models import ResourceBase
2529
from .models import Document
26-
from .renderers import (generate_thumbnail_content)
2730

2831
logger = get_task_logger(__name__)
2932

@@ -61,9 +64,13 @@ def create_document_thumbnail(self, object_id):
6164
image_file = storage_manager.open(dname, 'rb')
6265

6366
try:
64-
thumbnail_content = generate_thumbnail_content(image_file)
67+
image = Image.open(image_file)
68+
with io.BytesIO() as output:
69+
image.save(output, format='PNG')
70+
thumbnail_content = output.getvalue()
71+
output.close()
6572
except Exception as e:
66-
logger.debug(f"Could not generate thumbnail, setting thumbnail_url to None: {e}")
73+
logger.debug(f"Could not generate thumbnail: {e}")
6774
finally:
6875
if image_file is not None:
6976
image_file.close()

geonode/documents/tests.py

+38
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from io import BytesIO
3232

3333
from unittest.mock import patch
34+
from urllib.parse import urlparse
3435

3536
from django.urls import reverse
3637
from django.conf import settings
@@ -95,6 +96,7 @@ def tearDownClass(cls):
9596
def setUp(self):
9697
super().setUp()
9798
create_models('map')
99+
self.project_root = os.path.abspath(os.path.dirname(__file__))
98100
self.imgfile = io.BytesIO(
99101
b'GIF87a\x01\x00\x01\x00\x80\x01\x00\x00\x00\x00ccc,\x00'
100102
b'\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;')
@@ -266,6 +268,42 @@ def test_replace_document(self):
266268
# Remove document
267269
d.delete()
268270

271+
def test_non_image_documents_thumbnail(self):
272+
self.client.login(username='admin', password='admin')
273+
try:
274+
with open(os.path.join(f"{self.project_root}", "tests/data/text.txt"), "rb") as f:
275+
data = {
276+
'title': "Non img File Doc",
277+
'doc_file': f,
278+
'extension': 'txt'
279+
}
280+
self.client.post(reverse('document_upload'), data=data)
281+
d = Document.objects.get(title='Non img File Doc')
282+
self.assertIsNone(d.thumbnail_url)
283+
finally:
284+
Document.objects.filter(title='Non img File Doc').delete()
285+
286+
def test_image_documents_thumbnail(self):
287+
self.client.login(username='admin', password='admin')
288+
try:
289+
with open(os.path.join(f"{self.project_root}", "tests/data/img.gif"), "rb") as f:
290+
data = {
291+
'title': "img File Doc",
292+
'doc_file': f,
293+
'extension': 'gif',
294+
}
295+
with self.settings(THUMBNAIL_SIZE={'width': 400, 'height': 200}):
296+
self.client.post(reverse('document_upload'), data=data)
297+
d = Document.objects.get(title='img File Doc')
298+
self.assertIsNotNone(d.thumbnail_url)
299+
thumb_file = os.path.join(
300+
settings.MEDIA_ROOT, f"thumbs/{os.path.basename(urlparse(d.thumbnail_url).path)}"
301+
)
302+
file = Image.open(thumb_file)
303+
self.assertEqual(file.size, (400, 200))
304+
finally:
305+
Document.objects.filter(title='img File Doc').delete()
306+
269307
def test_upload_document_form_size_limit(self):
270308
form_data = {
271309
'title': 'GeoNode Map',

geonode/documents/tests/data/text.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TEST

geonode/settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1997,7 +1997,7 @@ def get_geonode_catalogue_service():
19971997
'THUMBNAIL_GENERATOR', 'geonode.thumbs.thumbnails.create_gs_thumbnail_geonode')
19981998

19991999
THUMBNAIL_SIZE = {
2000-
'width': int(os.environ.get('THUMBNAIL_GENERATOR_DEFAULT_SIZE_WIDTH', 240)),
2000+
'width': int(os.environ.get('THUMBNAIL_GENERATOR_DEFAULT_SIZE_WIDTH', 500)),
20012001
'height': int(os.environ.get('THUMBNAIL_GENERATOR_DEFAULT_SIZE_HEIGHT', 200))
20022002
}
20032003

0 commit comments

Comments
 (0)