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
This commit is contained in:
parent
e6740cb39c
commit
7578981626
|
@ -30,7 +30,12 @@ class ImageFile(File):
|
||||||
|
|
||||||
def get_image_dimensions(file_or_path):
|
def get_image_dimensions(file_or_path):
|
||||||
"""Returns the (width, height) of an image, given an open file or a 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()
|
p = PILImageFile.Parser()
|
||||||
close = False
|
close = False
|
||||||
if hasattr(file_or_path, 'read'):
|
if hasattr(file_or_path, 'read'):
|
||||||
|
|
|
@ -47,10 +47,14 @@ def get_validation_errors(outfile, app=None):
|
||||||
if isinstance(f, models.FileField) and not f.upload_to:
|
if isinstance(f, models.FileField) and not f.upload_to:
|
||||||
e.add(opts, '"%s": FileFields require an "upload_to" attribute.' % f.name)
|
e.add(opts, '"%s": FileFields require an "upload_to" attribute.' % f.name)
|
||||||
if isinstance(f, models.ImageField):
|
if isinstance(f, models.ImageField):
|
||||||
|
# Try to import PIL in either of the two ways it can end up installed.
|
||||||
try:
|
try:
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
except ImportError:
|
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):
|
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)
|
e.add(opts, '"%s": BooleanFields do not accept null values. Use a NullBooleanField instead.' % f.name)
|
||||||
if f.choices:
|
if f.choices:
|
||||||
|
|
|
@ -467,7 +467,12 @@ class ImageField(FileField):
|
||||||
f = super(ImageField, self).to_python(data)
|
f = super(ImageField, self).to_python(data)
|
||||||
if f is None:
|
if f is None:
|
||||||
return 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
|
# We need to get a file object for PIL. We might have a path or we might
|
||||||
# have to read the data into memory.
|
# have to read the data into memory.
|
||||||
|
|
|
@ -93,11 +93,15 @@ class TextFile(models.Model):
|
||||||
return self.description
|
return self.description
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# If PIL is available, try testing ImageFields.
|
# If PIL is available, try testing ImageFields. Checking for the existence
|
||||||
# Checking for the existence of Image is enough for CPython, but
|
# of Image is enough for CPython, but for PyPy, you need to check for the
|
||||||
# for PyPy, you need to check for the underlying modules
|
# underlying modules If PIL is not available, ImageField tests are omitted.
|
||||||
# If PIL is not available, ImageField tests are omitted.
|
# Try to import PIL in either of the two ways it can end up installed.
|
||||||
from PIL import Image, _imaging
|
try:
|
||||||
|
from PIL import Image, _imaging
|
||||||
|
except ImportError:
|
||||||
|
import Image, _imaging
|
||||||
|
|
||||||
test_images = True
|
test_images = True
|
||||||
|
|
||||||
class ImageFile(models.Model):
|
class ImageFile(models.Model):
|
||||||
|
|
|
@ -18,12 +18,16 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import dummy_threading as threading
|
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:
|
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
|
from PIL import Image, _imaging
|
||||||
except ImportError:
|
except ImportError:
|
||||||
Image = None
|
try:
|
||||||
|
import Image, _imaging
|
||||||
|
except ImportError:
|
||||||
|
Image = None
|
||||||
|
|
||||||
class FileStorageTests(unittest.TestCase):
|
class FileStorageTests(unittest.TestCase):
|
||||||
storage_class = FileSystemStorage
|
storage_class = FileSystemStorage
|
||||||
|
|
|
@ -6,12 +6,17 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
from django.utils import _decimal as decimal # Python 2.3 fallback
|
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:
|
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
|
from PIL import Image, _imaging
|
||||||
except ImportError:
|
except ImportError:
|
||||||
Image = None
|
try:
|
||||||
|
import Image, _imaging
|
||||||
|
except ImportError:
|
||||||
|
Image = None
|
||||||
|
|
||||||
from django.core.files.storage import FileSystemStorage
|
from django.core.files.storage import FileSystemStorage
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
Loading…
Reference in New Issue