From 757898162670b1a3178af3a0dc9fa2921c48702c Mon Sep 17 00:00:00 2001 From: Jacob Kaplan-Moss Date: Sun, 14 Feb 2010 18:28:28 +0000 Subject: [PATCH] Fixed #6054: work around PIL's installation brokeness by detecting either of the two ways it can end up being installed. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12429 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/files/images.py | 7 ++++++- django/core/management/validation.py | 6 +++++- django/forms/fields.py | 7 ++++++- tests/modeltests/model_forms/models.py | 14 +++++++++----- tests/regressiontests/file_storage/tests.py | 10 +++++++--- tests/regressiontests/model_fields/models.py | 11 ++++++++--- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/django/core/files/images.py b/django/core/files/images.py index 24c1151e8d..55008b548a 100644 --- a/django/core/files/images.py +++ b/django/core/files/images.py @@ -30,7 +30,12 @@ class ImageFile(File): def get_image_dimensions(file_or_path): """Returns the (width, height) of an image, given an open file or a path.""" - from PIL import ImageFile as PILImageFile + # Try to import PIL in either of the two ways it can end up installed. + try: + from PIL import ImageFile as PILImageFile + except ImportError: + import ImageFile as PILImageFile + p = PILImageFile.Parser() close = False if hasattr(file_or_path, 'read'): diff --git a/django/core/management/validation.py b/django/core/management/validation.py index 97164d75c3..46cdfc5c46 100644 --- a/django/core/management/validation.py +++ b/django/core/management/validation.py @@ -47,10 +47,14 @@ def get_validation_errors(outfile, app=None): if isinstance(f, models.FileField) and not f.upload_to: e.add(opts, '"%s": FileFields require an "upload_to" attribute.' % f.name) if isinstance(f, models.ImageField): + # Try to import PIL in either of the two ways it can end up installed. try: from PIL import Image except ImportError: - e.add(opts, '"%s": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .' % f.name) + try: + import Image + except ImportError: + e.add(opts, '"%s": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .' % f.name) if isinstance(f, models.BooleanField) and getattr(f, 'null', False): e.add(opts, '"%s": BooleanFields do not accept null values. Use a NullBooleanField instead.' % f.name) if f.choices: diff --git a/django/forms/fields.py b/django/forms/fields.py index 2e6eb821f3..f5f3abf49d 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -467,7 +467,12 @@ class ImageField(FileField): f = super(ImageField, self).to_python(data) if f is None: return None - from PIL import Image + + # Try to import PIL in either of the two ways it can end up installed. + try: + from PIL import Image + except ImportError: + import Image # We need to get a file object for PIL. We might have a path or we might # have to read the data into memory. diff --git a/tests/modeltests/model_forms/models.py b/tests/modeltests/model_forms/models.py index 400229a9c7..b8b826ac09 100644 --- a/tests/modeltests/model_forms/models.py +++ b/tests/modeltests/model_forms/models.py @@ -93,11 +93,15 @@ class TextFile(models.Model): return self.description try: - # If PIL is available, try testing ImageFields. - # 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, ImageField tests are omitted. - from PIL import Image, _imaging + # If PIL is available, try testing ImageFields. 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, ImageField tests are omitted. + # Try to import PIL in either of the two ways it can end up installed. + try: + from PIL import Image, _imaging + except ImportError: + import Image, _imaging + test_images = True class ImageFile(models.Model): diff --git a/tests/regressiontests/file_storage/tests.py b/tests/regressiontests/file_storage/tests.py index c228764e06..81ea48950c 100644 --- a/tests/regressiontests/file_storage/tests.py +++ b/tests/regressiontests/file_storage/tests.py @@ -18,12 +18,16 @@ try: except ImportError: import dummy_threading as threading +# Try to import PIL in either of the two ways it can end up installed. +# Checking for the existence of Image is enough for CPython, but +# for PyPy, you need to check for the underlying modules try: - # Checking for the existence of Image is enough for CPython, but - # for PyPy, you need to check for the underlying modules from PIL import Image, _imaging except ImportError: - Image = None + try: + import Image, _imaging + except ImportError: + Image = None class FileStorageTests(unittest.TestCase): storage_class = FileSystemStorage diff --git a/tests/regressiontests/model_fields/models.py b/tests/regressiontests/model_fields/models.py index 083e86fb1c..39c9abe17d 100644 --- a/tests/regressiontests/model_fields/models.py +++ b/tests/regressiontests/model_fields/models.py @@ -6,12 +6,17 @@ try: except ImportError: from django.utils import _decimal as decimal # Python 2.3 fallback +# Try to import PIL in either of the two ways it can end up installed. +# Checking for the existence of Image is enough for CPython, but for PyPy, +# you need to check for the underlying modules. + try: - # Checking for the existence of Image is enough for CPython, but for PyPy, - # you need to check for the underlying modules. from PIL import Image, _imaging except ImportError: - Image = None + try: + import Image, _imaging + except ImportError: + Image = None from django.core.files.storage import FileSystemStorage from django.db import models