from __future__ import absolute_import, unicode_literals

from collections import OrderedDict

from rest_framework.fields import Field

from ...models import SourceImageIOError
from ..v2.serializers import ImageSerializer


class ImageRenditionField(Field):
    """
    A field that generates a rendition with the specified filter spec, and serialises
    details of that rendition.

    Example:
    "thumbnail": {
        "url": "/media/images/myimage.max-165x165.jpg",
        "width": 165,
        "height": 100
    }

    If there is an error with the source image. The dict will only contain a single
    key, "error", indicating this error:

    "thumbnail": {
        "error": "SourceImageIOError"
    }
    """
    def __init__(self, filter_spec, *args, **kwargs):
        self.filter_spec = filter_spec
        super(ImageRenditionField, self).__init__(*args, **kwargs)

    def get_attribute(self, instance):
        return instance

    def to_representation(self, image):
        try:
            thumbnail = image.get_rendition(self.filter_spec)

            return OrderedDict([
                ('url', thumbnail.url),
                ('width', thumbnail.width),
                ('height', thumbnail.height),
            ])
        except SourceImageIOError:
            return OrderedDict([
                ('error', 'SourceImageIOError'),
            ])


class AdminImageSerializer(ImageSerializer):
    thumbnail = ImageRenditionField('max-165x165', read_only=True)

from __future__ import absolute_import, unicode_literals

from collections import OrderedDict

from rest_framework.fields import Field

from ...models import SourceImageIOError
from ..v2.serializers import ImageSerializer


class ImageRenditionField(Field):
    """
    A field that generates a rendition with the specified filter spec, and serialises
    details of that rendition.

    Example:
    "thumbnail": {
        "url": "/media/images/myimage.max-165x165.jpg",
        "width": 165,
        "height": 100
    }

    If there is an error with the source image. The dict will only contain a single
    key, "error", indicating this error:

    "thumbnail": {
        "error": "SourceImageIOError"
    }
    """
    def __init__(self, filter_spec, *args, **kwargs):
        self.filter_spec = filter_spec
        super(ImageRenditionField, self).__init__(*args, **kwargs)

    def to_representation(self, image):
        try:
            thumbnail = image.get_rendition(self.filter_spec)

            return OrderedDict([
                ('url', thumbnail.url),
                ('width', thumbnail.width),
                ('height', thumbnail.height),
            ])
        except SourceImageIOError:
            return OrderedDict([
                ('error', 'SourceImageIOError'),
            ])


class AdminImageSerializer(ImageSerializer):
    thumbnail = ImageRenditionField('max-165x165', source='*', read_only=True)

Use source keyword argument (instead of overriding get_attribute)
Use source keyword argument (instead of overriding get_attribute)

This allows the ImageRenditionField to be used on models that contain an
image field.

  from __future__ import absolute_import, unicode_literals
  
  from collections import OrderedDict
  
  from rest_framework.fields import Field
  
  from ...models import SourceImageIOError
  from ..v2.serializers import ImageSerializer
  
  
  class ImageRenditionField(Field):
      """
      A field that generates a rendition with the specified filter spec, and serialises
      details of that rendition.
  
      Example:
      "thumbnail": {
          "url": "/media/images/myimage.max-165x165.jpg",
          "width": 165,
          "height": 100
      }
  
      If there is an error with the source image. The dict will only contain a single
      key, "error", indicating this error:
  
      "thumbnail": {
          "error": "SourceImageIOError"
      }
      """
      def __init__(self, filter_spec, *args, **kwargs):
          self.filter_spec = filter_spec
          super(ImageRenditionField, self).__init__(*args, **kwargs)
  
-     def get_attribute(self, instance):
-         return instance
- 
      def to_representation(self, image):
          try:
              thumbnail = image.get_rendition(self.filter_spec)
  
              return OrderedDict([
                  ('url', thumbnail.url),
                  ('width', thumbnail.width),
                  ('height', thumbnail.height),
              ])
          except SourceImageIOError:
              return OrderedDict([
                  ('error', 'SourceImageIOError'),
              ])
  
  
  class AdminImageSerializer(ImageSerializer):
-     thumbnail = ImageRenditionField('max-165x165', read_only=True)
+     thumbnail = ImageRenditionField('max-165x165', source='*', read_only=True)
  
Use source keyword argument (instead of overriding get_attribute)
## Code Before:
from __future__ import absolute_import, unicode_literals

from collections import OrderedDict

from rest_framework.fields import Field

from ...models import SourceImageIOError
from ..v2.serializers import ImageSerializer


class ImageRenditionField(Field):
    """
    A field that generates a rendition with the specified filter spec, and serialises
    details of that rendition.

    Example:
    "thumbnail": {
        "url": "/media/images/myimage.max-165x165.jpg",
        "width": 165,
        "height": 100
    }

    If there is an error with the source image. The dict will only contain a single
    key, "error", indicating this error:

    "thumbnail": {
        "error": "SourceImageIOError"
    }
    """
    def __init__(self, filter_spec, *args, **kwargs):
        self.filter_spec = filter_spec
        super(ImageRenditionField, self).__init__(*args, **kwargs)

    def get_attribute(self, instance):
        return instance

    def to_representation(self, image):
        try:
            thumbnail = image.get_rendition(self.filter_spec)

            return OrderedDict([
                ('url', thumbnail.url),
                ('width', thumbnail.width),
                ('height', thumbnail.height),
            ])
        except SourceImageIOError:
            return OrderedDict([
                ('error', 'SourceImageIOError'),
            ])


class AdminImageSerializer(ImageSerializer):
    thumbnail = ImageRenditionField('max-165x165', read_only=True)

## Instruction:
Use source keyword argument (instead of overriding get_attribute)
## Code After:
from __future__ import absolute_import, unicode_literals

from collections import OrderedDict

from rest_framework.fields import Field

from ...models import SourceImageIOError
from ..v2.serializers import ImageSerializer


class ImageRenditionField(Field):
    """
    A field that generates a rendition with the specified filter spec, and serialises
    details of that rendition.

    Example:
    "thumbnail": {
        "url": "/media/images/myimage.max-165x165.jpg",
        "width": 165,
        "height": 100
    }

    If there is an error with the source image. The dict will only contain a single
    key, "error", indicating this error:

    "thumbnail": {
        "error": "SourceImageIOError"
    }
    """
    def __init__(self, filter_spec, *args, **kwargs):
        self.filter_spec = filter_spec
        super(ImageRenditionField, self).__init__(*args, **kwargs)

    def to_representation(self, image):
        try:
            thumbnail = image.get_rendition(self.filter_spec)

            return OrderedDict([
                ('url', thumbnail.url),
                ('width', thumbnail.width),
                ('height', thumbnail.height),
            ])
        except SourceImageIOError:
            return OrderedDict([
                ('error', 'SourceImageIOError'),
            ])


class AdminImageSerializer(ImageSerializer):
    thumbnail = ImageRenditionField('max-165x165', source='*', read_only=True)
