diff options
| author | Tim Graham <timograham@gmail.com> | 2014-03-21 10:54:53 -0400 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-03-21 10:54:53 -0400 |
| commit | 4965a774074780f3e4858bcc975476f71edf2c2c (patch) | |
| tree | 938b3f520bf53384ca644c4e85cf737a9a466771 /django | |
| parent | 6d1ae5e27c3fe612209023bacd8a201fffedc375 (diff) | |
Removed PIL compatability layer per deprecation timeline.
refs #19934.
Diffstat (limited to 'django')
| -rw-r--r-- | django/core/files/images.py | 12 | ||||
| -rw-r--r-- | django/db/models/fields/files.py | 5 | ||||
| -rw-r--r-- | django/forms/fields.py | 4 | ||||
| -rw-r--r-- | django/utils/image.py | 157 |
4 files changed, 10 insertions, 168 deletions
diff --git a/django/core/files/images.py b/django/core/files/images.py index b289d789ad..8883ae4416 100644 --- a/django/core/files/images.py +++ b/django/core/files/images.py @@ -1,7 +1,7 @@ """ Utility functions for handling images. -Requires Pillow (or PIL), as you might imagine. +Requires Pillow as you might imagine. """ import zlib @@ -35,9 +35,9 @@ def get_image_dimensions(file_or_path, close=False): 'close' to True to close the file at the end if it is initially in an open state. """ - from django.utils.image import ImageFile as PILImageFile + from PIL import ImageFile as PillowImageFile - p = PILImageFile.Parser() + p = PillowImageFile.Parser() if hasattr(file_or_path, 'read'): file = file_or_path file_pos = file.tell() @@ -46,9 +46,9 @@ def get_image_dimensions(file_or_path, close=False): file = open(file_or_path, 'rb') close = True try: - # Most of the time PIL only needs a small chunk to parse the image and - # get the dimensions, but with some TIFF files PIL needs to parse the - # whole file. + # Most of the time Pillow only needs a small chunk to parse the image + # and get the dimensions, but with some TIFF files Pillow needs to + # parse the whole file. chunk_size = 1024 while 1: data = file.read(chunk_size) diff --git a/django/db/models/fields/files.py b/django/db/models/fields/files.py index 0b2a24a895..6cb49db24a 100644 --- a/django/db/models/fields/files.py +++ b/django/db/models/fields/files.py @@ -4,7 +4,6 @@ import os from django import forms from django.db.models.fields import Field from django.core import checks -from django.core.exceptions import ImproperlyConfigured from django.core.files.base import File from django.core.files.storage import default_storage from django.core.files.images import ImageFile @@ -386,8 +385,8 @@ class ImageField(FileField): def _check_image_library_installed(self): try: - from django.utils.image import Image # NOQA - except ImproperlyConfigured: + from PIL import Image # NOQA + except ImportError: return [ checks.Error( 'Cannot use ImageField because Pillow is not installed.', diff --git a/django/forms/fields.py b/django/forms/fields.py index 63ed153f0b..0ee66a9db3 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -641,7 +641,7 @@ class ImageField(FileField): if f is None: return None - from django.utils.image import Image + from PIL import Image # We need to get a file object for Pillow. We might have a path or we might # have to read the data into memory. @@ -659,7 +659,7 @@ class ImageField(FileField): # verify() must be called immediately after the constructor. Image.open(file).verify() except Exception: - # Pillow (or PIL) doesn't recognize it as an image. + # Pillow doesn't recognize it as an image. six.reraise(ValidationError, ValidationError( self.error_messages['invalid_image'], code='invalid_image', diff --git a/django/utils/image.py b/django/utils/image.py deleted file mode 100644 index 795300c1e4..0000000000 --- a/django/utils/image.py +++ /dev/null @@ -1,157 +0,0 @@ -# -*- coding: utf-8 -*- -""" -To provide a shim layer over Pillow/PIL situation until the PIL support is -removed. See #19934. - - -Combinations To Account For -=========================== - -* Pillow: - - * never has ``_imaging`` under any Python - * has the ``Image.alpha_composite``, which may aid in detection - -* PIL - - * CPython 2.x may have _imaging (& work) - * CPython 2.x may *NOT* have _imaging (broken & needs a error message) - * CPython 3.x doesn't work - * PyPy will *NOT* have _imaging (but works?) - * On some platforms (Homebrew and RHEL6 reported) _imaging isn't available, - the needed import is from PIL import _imaging (refs #21355) - -Restated, that looks like: - -* If we're on Python 2.x, it could be either Pillow or PIL: - - * If ``import _imaging`` results in ``ImportError``, either they have a - working Pillow installation or a broken PIL installation, so we need to - detect further: - - * To detect, we first ``import Image``. - * If ``Image`` has a ``alpha_composite`` attribute present, only Pillow - has this, so we assume it's working. - * If ``Image`` DOES NOT have a ``alpha_composite``attribute, it must be - PIL & is a broken (likely C compiler-less) install, which we need to - warn the user about. - - * If ``import _imaging`` works, it must be PIL & is a working install. - -* Python 3.x - - * If ``import Image`` works, it must be Pillow, since PIL isn't Python 3.x - compatible. - -* PyPy - - * If ``import _imaging`` results in ``ImportError``, it could be either - Pillow or PIL, both of which work without it on PyPy, so we're fine. - - -Approach -======== - -* Attempt to import ``Image`` - - * ``ImportError`` - nothing is installed, toss an exception - * Either Pillow or the PIL is installed, so continue detecting - -* Attempt to ``hasattr(Image, 'alpha_composite')`` - - * If it works, it's Pillow & working - * If it fails, we've got a PIL install, continue detecting - - * The only option here is that we're on Python 2.x or PyPy, of which - we only care about if we're on CPython. - * If we're on CPython, attempt to ``from PIL import _imaging`` and - ``import _imaging`` - - * ``ImportError`` - Bad install, toss an exception - -""" -from __future__ import unicode_literals - -import warnings - -from django.core.exceptions import ImproperlyConfigured -from django.utils.deprecation import RemovedInDjango18Warning -from django.utils.translation import ugettext_lazy as _ - - -Image = None -_imaging = None -ImageFile = None - - -def _detect_image_library(): - global Image - global _imaging - global ImageFile - - # Skip re-attempting to import if we've already run detection. - if Image is not None: - return Image, _imaging, ImageFile - - # Assume it's not there. - PIL_imaging = False - - try: - # Try from the Pillow (or one variant of PIL) install location first. - from PIL import Image as PILImage - except ImportError as err: - try: - # If that failed, try the alternate import syntax for PIL. - import Image as PILImage - except ImportError as err: - # Neither worked, so it's likely not installed. - raise ImproperlyConfigured( - _("Neither Pillow nor PIL could be imported: %s") % err - ) - - # ``Image.alpha_composite`` was added to Pillow in SHA: e414c6 & is not - # available in any version of the PIL. - if hasattr(PILImage, 'alpha_composite'): - PIL_imaging = False - else: - # We're dealing with the PIL. Determine if we're on CPython & if - # ``_imaging`` is available. - import platform - - # This is the Alex Approved™ way. - # See http://mail.python.org/pipermail//pypy-dev/2011-November/008739.html - if platform.python_implementation().lower() == 'cpython': - # We're on CPython (likely 2.x). Since a C compiler is needed to - # produce a fully-working PIL & will create a ``_imaging`` module, - # we'll attempt to import it to verify their kit works. - try: - from PIL import _imaging as PIL_imaging - except ImportError: - try: - import _imaging as PIL_imaging - except ImportError as err: - raise ImproperlyConfigured( - _("The '_imaging' module for the PIL could not be " - "imported: %s") % err - ) - - # Try to import ImageFile as well. - try: - from PIL import ImageFile as PILImageFile - except ImportError: - # This import cannot fail unless Pillow/PIL install is completely - # broken (e.g. missing Python modules). - import ImageFile as PILImageFile - - # Finally, warn about deprecation... - if PIL_imaging is not False: - warnings.warn( - "Support for the PIL will be removed in Django 1.8. Please " + - "uninstall it & install Pillow instead.", - RemovedInDjango18Warning - ) - - return PILImage, PIL_imaging, PILImageFile - - -Image, _imaging, ImageFile = _detect_image_library() |
