From ed5df159a03b0c3c0d17f9e7be8d925e9e73f669 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Fri, 19 May 2017 15:39:38 +0200 Subject: [PATCH] check cover image dimensions in forms --- apps/cover/forms.py | 28 ++++++++++++++++++-- apps/cover/templates/cover/image_detail.html | 1 - apps/cover/views.py | 2 +- redakcja/settings/common.py | 2 ++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/apps/cover/forms.py b/apps/cover/forms.py index 5cc316b2..36010c75 100755 --- a/apps/cover/forms.py +++ b/apps/cover/forms.py @@ -3,12 +3,16 @@ # This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # +from StringIO import StringIO + from django import forms +from django.conf import settings from django.utils.translation import ugettext_lazy as _, ugettext from cover.models import Image from django.utils.text import mark_safe +from PIL import Image as PILImage -from cover.utils import get_flickr_data, FlickrError +from cover.utils import get_flickr_data, FlickrError, URLOpener class ImageAddForm(forms.ModelForm): @@ -34,8 +38,19 @@ class ImageAddForm(forms.ModelForm): def clean(self): cleaned_data = super(ImageAddForm, self).clean() - if not cleaned_data.get('download_url', None) and not cleaned_data.get('file', None): + download_url = cleaned_data.get('download_url', None) + uploaded_file = cleaned_data.get('file', None) + if not download_url and not uploaded_file: raise forms.ValidationError('No image specified') + if download_url: + image_data = URLOpener().open(download_url).read() + width, height = PILImage.open(StringIO(image_data)).size + else: + width, height = PILImage.open(uploaded_file.file).size + min_width, min_height = settings.MIN_COVER_SIZE + if width < min_width or height < min_height: + raise forms.ValidationError('Image too small: %sx%s, minimal dimensions %sx%s' % + (width, height, min_width, min_height)) return cleaned_data @@ -45,6 +60,15 @@ class ImageEditForm(forms.ModelForm): model = Image exclude = ['download_url'] + def clean(self): + cleaned_data = super(ImageEditForm, self).clean() + uploaded_file = cleaned_data.get('file', None) + width, height = PILImage.open(uploaded_file.file).size + min_width, min_height = settings.MIN_COVER_SIZE + if width < min_width or height < min_height: + raise forms.ValidationError('Image too small: %sx%s, minimal dimensions %sx%s' % + (width, height, min_width, min_height)) + class ReadonlyImageEditForm(ImageEditForm): """Form used for not editing an Image.""" diff --git a/apps/cover/templates/cover/image_detail.html b/apps/cover/templates/cover/image_detail.html index d09a6580..cf8f921f 100755 --- a/apps/cover/templates/cover/image_detail.html +++ b/apps/cover/templates/cover/image_detail.html @@ -27,7 +27,6 @@ {% if editable %}
{% csrf_token %} - {{ form.non_field_errors }} {% endif %} {{ form.as_table }} diff --git a/apps/cover/views.py b/apps/cover/views.py index 607d8088..25033c18 100644 --- a/apps/cover/views.py +++ b/apps/cover/views.py @@ -98,7 +98,7 @@ def image(request, pk): editable = False return render(request, "cover/image_detail.html", { - "object": image, + "object": Image.objects.get(id=image.id), "form": form, "editable": editable, }) diff --git a/redakcja/settings/common.py b/redakcja/settings/common.py index 5146dcda..ccb021e6 100644 --- a/redakcja/settings/common.py +++ b/redakcja/settings/common.py @@ -144,6 +144,8 @@ CELERY_ACCEPT_CONTENT = ['pickle'] # Remove when all tasks jsonable. SHOW_APP_VERSION = False +MIN_COVER_SIZE = (915, 1270) + try: from redakcja.settings.compress import * except ImportError: -- 2.20.1