From 0a2cb474301ea3d189eff674487af6c0cd764c65 Mon Sep 17 00:00:00 2001 From: Jonathan Ellenberger Date: Tue, 19 May 2015 12:38:56 -0400 Subject: [PATCH] Only showing 'clear' when field is optional #14 Includes: * Widget updates * New test model + fixture data * CSS tweaks * New widget tests --- tests/admin.py | 3 +- tests/fixtures/versatileimagefield.json | 12 ++ tests/models.py | 22 +++ tests/tests.py | 156 ++++++++++++++++-- .../css/versatileimagefield-djangoadmin.css | 17 +- versatileimagefield/widgets.py | 21 ++- 6 files changed, 205 insertions(+), 26 deletions(-) diff --git a/tests/admin.py b/tests/admin.py index efa4e98..0fdb660 100644 --- a/tests/admin.py +++ b/tests/admin.py @@ -3,7 +3,7 @@ from versatileimagefield.widgets import VersatileImagePPOISelectWidget -from .models import VersatileImageTestModel +from .models import VersatileImageTestModel, VersatileImageWidgetTestModel class VersatileImageTestModelForm(ModelForm): @@ -27,3 +27,4 @@ class VersatileImageTestModelAdmin(admin.ModelAdmin): admin.site.register(VersatileImageTestModel, VersatileImageTestModelAdmin) +admin.site.register(VersatileImageWidgetTestModel) diff --git a/tests/fixtures/versatileimagefield.json b/tests/fixtures/versatileimagefield.json index 305dffb..dbcd295 100644 --- a/tests/fixtures/versatileimagefield.json +++ b/tests/fixtures/versatileimagefield.json @@ -98,5 +98,17 @@ }, "model": "tests.versatileimagetestmodel", "pk": 9 +}, +{ + "fields": { + "image": "python-logo.png", + "image_no_ppoi": "python-logo.jpg", + "optional_image": "exif-orientation-examples/Landscape_8.jpg", + "optional_image_with_ppoi": "exif-orientation-examples/Landscape_6.jpg", + "ppoi": "0.5x0.5", + "optional_image_with_ppoi_ppoi": "1.0x1.0" + }, + "model": "tests.versatileimagewidgettestmodel", + "pk": 1 } ] diff --git a/tests/models.py b/tests/models.py index ef70e01..a12d466 100644 --- a/tests/models.py +++ b/tests/models.py @@ -53,3 +53,25 @@ class VersatileImageTestModel(models.Model): blank=True ) ppoi = PPOIField() + + +class VersatileImageWidgetTestModel(models.Model): + """A model for testing VersatileImageField widgets""" + image = VersatileImageField( + upload_to='./', + ppoi_field='ppoi', + ) + image_no_ppoi = VersatileImageField( + upload_to='./', + ) + optional_image = VersatileImageField( + upload_to='./', + blank=True + ) + optional_image_with_ppoi = VersatileImageField( + upload_to='./', + blank=True, + ppoi_field='optional_image_with_ppoi_ppoi' + ) + ppoi = PPOIField() + optional_image_with_ppoi_ppoi = PPOIField() diff --git a/tests/tests.py b/tests/tests.py index 282610c..f49093f 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -19,7 +19,7 @@ from django.test import Client, TestCase from django.test.utils import override_settings from django.utils._os import upath -from django.utils.six.moves import cPickle as pickle +from django.utils.six.moves import cPickle from PIL import Image from versatileimagefield.files import VersatileImageFileDescriptor @@ -52,7 +52,7 @@ from versatileimagefield.versatileimagefield import CroppedImage, InvertImage from .forms import VersatileImageTestModelForm -from .models import VersatileImageTestModel +from .models import VersatileImageTestModel, VersatileImageWidgetTestModel from .serializers import VersatileImageTestModelSerializer @@ -63,6 +63,7 @@ def setUp(self): self.jpg = VersatileImageTestModel.objects.get(img_type='jpg') self.png = VersatileImageTestModel.objects.get(img_type='png') self.gif = VersatileImageTestModel.objects.get(img_type='gif') + self.widget_test = VersatileImageWidgetTestModel.objects.get(pk=1) password = '12345' user = User.objects.create_user( username='test', @@ -351,27 +352,156 @@ def test_widget_javascript(self): Ensures the VersatileImagePPOIClickWidget widget loads appropriately and its image preview is available """ - response = self.client.get('/admin/tests/versatileimagetestmodel/1/') + response = self.client.get( + '/admin/tests/versatileimagewidgettestmodel/1/' + ) self.assertEqual(response.status_code, 200) + # Test required field with PPOI + self.assertInHTML( + ( + """ +
+
+ + python-logo.png +
+ +
+ +
+
+
+
+
+ +
+
+
+
+ + +
+ +
+ """ + ), + str(response.content) + ) + # Test required field no PPOI + self.assertInHTML( + ( + """ +
+
+ + python-logo.jpg +
+
+ + +
+ +
+ """ + ), + str(response.content) + ) + # Test optional image no PPOI + self.assertInHTML( + ( + """ +
+ +
+ + +
+
+ + +
+ +
+ """ + ), + str(response.content) + ) + # Test optional image with PPOI self.assertInHTML( ( - '' + """ +
+ +
+ + +
+
+ +
+
+
+
+
+ +
+
+
+
+ + +
+ +
+ """ ), str(response.content) ) + # Test that javascript loads correctly self.assertInHTML( ( - '' + '' ), str(response.content) ) self.assertTrue( - self.png.image.field.storage.exists( - self.png.image.thumbnail['300x300'].name + self.widget_test.image.field.storage.exists( + self.widget_test.image.thumbnail['300x300'].name ) ) @@ -406,11 +536,11 @@ def test_VersatileImageField_picklability(self): """ Ensures VersatileImageField instances can be pickled/unpickled. """ - pickle.dump( + cPickle.dump( self.jpg, open("pickletest.p", "wb") ) - jpg_unpickled = pickle.load( + jpg_unpickled = cPickle.load( open("pickletest.p", "rb") ) jpg_instance = jpg_unpickled diff --git a/versatileimagefield/static/versatileimagefield/css/versatileimagefield-djangoadmin.css b/versatileimagefield/static/versatileimagefield/css/versatileimagefield-djangoadmin.css index b37083b..f8c9190 100644 --- a/versatileimagefield/static/versatileimagefield/css/versatileimagefield-djangoadmin.css +++ b/versatileimagefield/static/versatileimagefield/css/versatileimagefield-djangoadmin.css @@ -2,18 +2,15 @@ div.versatileimagefield { float:left; clear:right; display:block; + min-width:350px; } label.versatileimagefield-label { - display:block; + display:inline; float:left; - clear:right; - font-weight:bold !important; + clear:both; font-size:1em; -} - -label.versatileimagefield-label:after { - content:": "; + padding-top:0px; } div.sizedimage-mod { @@ -27,3 +24,9 @@ div.image-wrap.outer { div.sizedimage-mod:first-child { margin-top:0; } +div.versatileimagefield input[type='file'] { + margin-top:0px; + margin-bottom:0px; + padding-top:0px; + padding-bottom:0px; +} diff --git a/versatileimagefield/widgets.py b/versatileimagefield/widgets.py index 364c028..9ab3db2 100644 --- a/versatileimagefield/widgets.py +++ b/versatileimagefield/widgets.py @@ -25,19 +25,30 @@ class ClearableFileInputWithImagePreview(ClearableFileInput): ppoi_label = ugettext_lazy('Primary Point of Interest') + template_with_initial = ( + '
' + ' %(initial)s ' + '
' + '%(clear_template)s' + '
' + '' + '%(input)s' + '
' + ) template_with_clear = ( + '
' '%(clear)s ' + '%(clear_checkbox_label)s: ' + '
' ) template_with_initial_and_imagepreview = """
%(initial)s
-
- %(clear_template)s -
+ %(clear_template)s
@@ -125,7 +136,7 @@ def render(self, name, value, attrs=None): else: template = self.template_with_initial - if not self.is_required: + if value.field.blank: checkbox_name = self.clear_checkbox_name(name) checkbox_id = self.clear_checkbox_id(checkbox_name) substitutions['clear_checkbox_name'] = conditional_escape(