import os
from functools import lru_cache

from django.core.checks import Warning, register
from willow.image import Image


@lru_cache()
def has_jpeg_support():
    wagtail_jpg = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.jpg")
    succeeded = True

    with open(wagtail_jpg, "rb") as f:
        try:
            Image.open(f)
        except (IOError, Image.LoaderError):
            succeeded = False

    return succeeded


@lru_cache()
def has_png_support():
    wagtail_png = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.png")
    succeeded = True

    with open(wagtail_png, "rb") as f:
        try:
            Image.open(f)
        except (IOError, Image.LoaderError):
            succeeded = False

    return succeeded


@register("files")
def image_library_check(app_configs, **kwargs):
    errors = []

    if not has_jpeg_support():
        errors.append(
            Warning(
                "JPEG image support is not available",
                hint="Check that the 'libjpeg' library is installed, then reinstall Pillow.",
            )
        )

    if not has_png_support():
        errors.append(
            Warning(
                "PNG image support is not available",
                hint="Check that the 'zlib' library is installed, then reinstall Pillow.",
            )
        )

    return errors

import os
from functools import lru_cache

from django.core.checks import Warning, register
from willow.image import Image


@lru_cache()
def has_jpeg_support():
    wagtail_jpg = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.jpg")
    succeeded = True

    with open(wagtail_jpg, "rb") as f:
        try:
            Image.open(f)
        except IOError:
            succeeded = False

    return succeeded


@lru_cache()
def has_png_support():
    wagtail_png = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.png")
    succeeded = True

    with open(wagtail_png, "rb") as f:
        try:
            Image.open(f)
        except IOError:
            succeeded = False

    return succeeded


@register("files")
def image_library_check(app_configs, **kwargs):
    errors = []

    if not has_jpeg_support():
        errors.append(
            Warning(
                "JPEG image support is not available",
                hint="Check that the 'libjpeg' library is installed, then reinstall Pillow.",
            )
        )

    if not has_png_support():
        errors.append(
            Warning(
                "PNG image support is not available",
                hint="Check that the 'zlib' library is installed, then reinstall Pillow.",
            )
        )

    return errors

Remove broken reference to Image.LoaderError
Remove broken reference to Image.LoaderError

This exception has not existed since Willow 0.3. Type checking on the 'except' line only happens when an exception occurs, so most of the time this is harmless, but if an unrelated exception occurs here (such as that caused by a faulty filetype library: https://github.com/h2non/filetype.py/issues/130) the real exception gets masked by an AttributeError for the missing definition.

  import os
  from functools import lru_cache
  
  from django.core.checks import Warning, register
  from willow.image import Image
  
  
  @lru_cache()
  def has_jpeg_support():
      wagtail_jpg = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.jpg")
      succeeded = True
  
      with open(wagtail_jpg, "rb") as f:
          try:
              Image.open(f)
-         except (IOError, Image.LoaderError):
+         except IOError:
              succeeded = False
  
      return succeeded
  
  
  @lru_cache()
  def has_png_support():
      wagtail_png = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.png")
      succeeded = True
  
      with open(wagtail_png, "rb") as f:
          try:
              Image.open(f)
-         except (IOError, Image.LoaderError):
+         except IOError:
              succeeded = False
  
      return succeeded
  
  
  @register("files")
  def image_library_check(app_configs, **kwargs):
      errors = []
  
      if not has_jpeg_support():
          errors.append(
              Warning(
                  "JPEG image support is not available",
                  hint="Check that the 'libjpeg' library is installed, then reinstall Pillow.",
              )
          )
  
      if not has_png_support():
          errors.append(
              Warning(
                  "PNG image support is not available",
                  hint="Check that the 'zlib' library is installed, then reinstall Pillow.",
              )
          )
  
      return errors
  
Remove broken reference to Image.LoaderError
## Code Before:
import os
from functools import lru_cache

from django.core.checks import Warning, register
from willow.image import Image


@lru_cache()
def has_jpeg_support():
    wagtail_jpg = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.jpg")
    succeeded = True

    with open(wagtail_jpg, "rb") as f:
        try:
            Image.open(f)
        except (IOError, Image.LoaderError):
            succeeded = False

    return succeeded


@lru_cache()
def has_png_support():
    wagtail_png = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.png")
    succeeded = True

    with open(wagtail_png, "rb") as f:
        try:
            Image.open(f)
        except (IOError, Image.LoaderError):
            succeeded = False

    return succeeded


@register("files")
def image_library_check(app_configs, **kwargs):
    errors = []

    if not has_jpeg_support():
        errors.append(
            Warning(
                "JPEG image support is not available",
                hint="Check that the 'libjpeg' library is installed, then reinstall Pillow.",
            )
        )

    if not has_png_support():
        errors.append(
            Warning(
                "PNG image support is not available",
                hint="Check that the 'zlib' library is installed, then reinstall Pillow.",
            )
        )

    return errors

## Instruction:
Remove broken reference to Image.LoaderError
## Code After:
import os
from functools import lru_cache

from django.core.checks import Warning, register
from willow.image import Image


@lru_cache()
def has_jpeg_support():
    wagtail_jpg = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.jpg")
    succeeded = True

    with open(wagtail_jpg, "rb") as f:
        try:
            Image.open(f)
        except IOError:
            succeeded = False

    return succeeded


@lru_cache()
def has_png_support():
    wagtail_png = os.path.join(os.path.dirname(__file__), "check_files", "wagtail.png")
    succeeded = True

    with open(wagtail_png, "rb") as f:
        try:
            Image.open(f)
        except IOError:
            succeeded = False

    return succeeded


@register("files")
def image_library_check(app_configs, **kwargs):
    errors = []

    if not has_jpeg_support():
        errors.append(
            Warning(
                "JPEG image support is not available",
                hint="Check that the 'libjpeg' library is installed, then reinstall Pillow.",
            )
        )

    if not has_png_support():
        errors.append(
            Warning(
                "PNG image support is not available",
                hint="Check that the 'zlib' library is installed, then reinstall Pillow.",
            )
        )

    return errors
