From 755278253ee792fc8a7589081261c6f0a66e1423 Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Fri, 18 Jan 2008 15:53:19 +0000 Subject: [PATCH] Fixed #6302 for ImageFields. git-svn-id: http://code.djangoproject.com/svn/django/trunk@7025 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/newforms/fields.py | 2 + tests/modeltests/model_forms/models.py | 88 +++++++++++++++++++++++-- tests/modeltests/model_forms/test.png | Bin 0 -> 482 bytes 3 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 tests/modeltests/model_forms/test.png diff --git a/django/newforms/fields.py b/django/newforms/fields.py index 0761b8f2af..bc3e543037 100644 --- a/django/newforms/fields.py +++ b/django/newforms/fields.py @@ -466,6 +466,8 @@ class ImageField(FileField): f = super(ImageField, self).clean(data, initial) if f is None: return None + elif not data and initial: + return initial from PIL import Image from cStringIO import StringIO try: diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index ff3f20e197..f1fed8f1e1 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -64,6 +64,13 @@ class TextFile(models.Model): def __unicode__(self): return self.description + +class ImageFile(models.Model): + description = models.CharField(max_length=20) + image = models.FileField(upload_to=tempfile.gettempdir()) + + def __unicode__(self): + return self.description __test__ = {'API_TESTS': """ >>> from django import newforms as forms @@ -718,7 +725,7 @@ True ... class Meta: ... model = TextFile -Test conditions when files is either not given or empty. +# Test conditions when files is either not given or empty. >>> f = TextFileForm(data={'description': u'Assistance'}) >>> f.is_valid() @@ -727,7 +734,7 @@ False >>> f.is_valid() False -Upload a file and ensure it all works as expected. +# Upload a file and ensure it all works as expected. >>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test1.txt', 'content': 'hello world'}}) >>> f.is_valid() @@ -738,8 +745,8 @@ True >>> instance.file u'.../test1.txt' -Edit an instance that already has the file defined in the model. This will not -save the file again, but leave it exactly as it is. +# Edit an instance that already has the file defined in the model. This will not +# save the file again, but leave it exactly as it is. >>> f = TextFileForm(data={'description': u'Assistance'}, instance=instance) >>> f.is_valid() @@ -750,11 +757,11 @@ u'.../test1.txt' >>> instance.file u'.../test1.txt' -Delete the current file since this is not done by Django. +# Delete the current file since this is not done by Django. >>> os.unlink(instance.get_file_filename()) -Override the file by uploading a new one. +# Override the file by uploading a new one. >>> f = TextFileForm(data={'description': u'Assistance'}, files={'file': {'filename': 'test2.txt', 'content': 'hello world'}}, instance=instance) >>> f.is_valid() @@ -765,7 +772,7 @@ u'.../test2.txt' >>> instance.delete() -Test the non-required FileField +# Test the non-required FileField >>> f = TextFileForm(data={'description': u'Assistance'}) >>> f.fields['file'].required = False @@ -782,4 +789,71 @@ True >>> instance.file u'.../test3.txt' >>> instance.delete() + +# ImageField ################################################################### + +# ImageField and FileField are nearly identical, but they differ slighty when +# it comes to validation. This specifically tests that #6302 is fixed for +# both file fields and image fields. + +>>> class ImageFileForm(ModelForm): +... class Meta: +... model = ImageFile + +>>> image_data = open(os.path.join(os.path.dirname(__file__), "test.png")).read() + +>>> f = ImageFileForm(data={'description': u'An image'}, files={'image': {'filename': 'test.png', 'content': image_data}}) +>>> f.is_valid() +True +>>> type(f.cleaned_data['image']) + +>>> instance = f.save() +>>> instance.image +u'.../test.png' + +# Edit an instance that already has the image defined in the model. This will not +# save the image again, but leave it exactly as it is. + +>>> f = ImageFileForm(data={'description': u'Look, it changed'}, instance=instance) +>>> f.is_valid() +True +>>> f.cleaned_data['image'] +u'.../test.png' +>>> instance = f.save() +>>> instance.image +u'.../test.png' + +# Delete the current image since this is not done by Django. + +>>> os.unlink(instance.get_image_filename()) + +# Override the file by uploading a new one. + +>>> f = ImageFileForm(data={'description': u'Changed it'}, files={'image': {'filename': 'test2.png', 'content': image_data}}, instance=instance) +>>> f.is_valid() +True +>>> instance = f.save() +>>> instance.image +u'.../test2.png' + +>>> instance.delete() + +# Test the non-required ImageField + +>>> f = ImageFileForm(data={'description': u'Test'}) +>>> f.fields['image'].required = False +>>> f.is_valid() +True +>>> instance = f.save() +>>> instance.image +'' + +>>> f = ImageFileForm(data={'description': u'And a final one'}, files={'image': {'filename': 'test3.png', 'content': image_data}}, instance=instance) +>>> f.is_valid() +True +>>> instance = f.save() +>>> instance.image +u'.../test3.png' +>>> instance.delete() + """} diff --git a/tests/modeltests/model_forms/test.png b/tests/modeltests/model_forms/test.png new file mode 100644 index 0000000000000000000000000000000000000000..4f17cd075d0ad42a7e64f0f7b1a0232a9a7c35a4 GIT binary patch literal 482 zcmV<80UiE{P)1#%%7O+Pik(-92n&yf8QeS9 z!ef{&akk(2oxXFvLw#dI3meP$TRAMn!k4V+YD`Q-8osIfXGg5tElY+ir)P82Em(Mm z7dJ=TM%nl#NxA?Lfr#EZB#9|BR|klTi4`me01*IdMo+XE+7{G*Q+UXhxP;aXi zECT?&@AYov6G)7W2XK6G@_Q5^;PU1gfF(CS{9GTi!!6CMx_TNr9Tt0DcFwKuUX~01 zjB*4M0Z@Z#I54-qs0P)#qN=Qv%yd(#|0!^Kb)I2L1MuK~d{JI>a&UP)F0Y4(1Pet~ zm}sE27r@Tp-fzKanx?3VVA0>wZ8H}JwczB+Y-lTUo9(BA$daL~zw3jhEB literal 0 HcmV?d00001