59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
from collections import OrderedDict
|
|
|
|
from rest_framework.fields import Field
|
|
|
|
from ..models import SourceImageIOError
|
|
from ..utils import to_svg_safe_spec
|
|
|
|
|
|
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",
|
|
"full_url": "https://media.example.com/media/images/myimage.max-165x165.jpg",
|
|
"width": 165,
|
|
"height": 100,
|
|
"alt": "Image alt text"
|
|
}
|
|
|
|
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, preserve_svg=False, *args, **kwargs):
|
|
self.filter_spec = filter_spec
|
|
self.preserve_svg = preserve_svg
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def to_representation(self, image):
|
|
try:
|
|
if image.is_svg() and self.preserve_svg:
|
|
filter_spec = to_svg_safe_spec(self.filter_spec)
|
|
else:
|
|
filter_spec = self.filter_spec
|
|
|
|
thumbnail = image.get_rendition(filter_spec)
|
|
|
|
return OrderedDict(
|
|
[
|
|
("url", thumbnail.url),
|
|
("full_url", thumbnail.full_url),
|
|
("width", thumbnail.width),
|
|
("height", thumbnail.height),
|
|
("alt", thumbnail.alt),
|
|
]
|
|
)
|
|
except SourceImageIOError:
|
|
return OrderedDict(
|
|
[
|
|
("error", "SourceImageIOError"),
|
|
]
|
|
)
|