From 4016d5264ab049c33c845c5337ce2a3e50754268 Mon Sep 17 00:00:00 2001
From: Russell Keith-Magee <russell@keith-magee.com>
Date: Mon, 21 Jul 2008 11:52:11 +0000
Subject: [PATCH] Fixed #7727 -- Improved the checks for import failure when
 using PIL. Under PyPy, you can import the PIL module, but when you try to use
 it, the underlying _imaging module will not be available. Thanks to Maciej
 Fijalkowski (fijal) for the report and suggested fix.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8016 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 AUTHORS                                | 1 +
 django/forms/fields.py                 | 5 +++++
 tests/modeltests/model_forms/models.py | 6 ++++--
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index 24e3e5bcac..d7945d4a1a 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -150,6 +150,7 @@ answer newbie questions, and generally made Django that much better:
     Stefane Fermgier <sf@fermigier.com>
     Afonso Fernández Nogueira <fonzzo.django@gmail.com>
     J. Pablo Fernandez <pupeno@pupeno.com>
+    Maciej Fijalkowski
     Matthew Flanagan <http://wadofstuff.blogspot.com>
     Eric Floehr <eric@intellovations.com>
     Vincent Foley <vfoleybourgon@yahoo.ca>
diff --git a/django/forms/fields.py b/django/forms/fields.py
index 9df8955392..134b63a625 100644
--- a/django/forms/fields.py
+++ b/django/forms/fields.py
@@ -503,6 +503,11 @@ class ImageField(FileField):
             #  but it must be called immediately after the constructor
             trial_image = Image.open(file)
             trial_image.verify()
+        except ImportError: 
+            # Under PyPy, it is possible to import PIL. However, the underlying
+            # _imaging C module isn't available, so an ImportError will be 
+            # raised. Catch and re-raise. 
+            raise
         except Exception: # Python Imaging Library doesn't recognize it as an image
             raise ValidationError(self.error_messages['invalid_image'])
         if hasattr(f, 'seek') and callable(f.seek):
diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py
index cc9efd0f94..be2a8ba835 100644
--- a/tests/modeltests/model_forms/models.py
+++ b/tests/modeltests/model_forms/models.py
@@ -69,8 +69,10 @@ class ImageFile(models.Model):
     description = models.CharField(max_length=20)
     try:
         # If PIL is available, try testing PIL.
-        # Otherwise, it's equivalent to TextFile above.
-        import Image
+        # Checking for the existence of Image is enough for CPython, but
+        # for PyPy, you need to check for the underlying modules
+        # If PIL is not available, this test is equivalent to TextFile above.
+        import Image, _imaging
         image = models.ImageField(upload_to=tempfile.gettempdir())
     except ImportError:
         image = models.FileField(upload_to=tempfile.gettempdir())