django-imagekit/src/imagekit/specs.py

108 lines
3.1 KiB
Python
Raw Normal View History

2009-01-04 18:30:03 +00:00
""" ImageKit image specifications
2009-01-04 17:38:06 +00:00
2009-01-04 18:30:03 +00:00
All imagekit specifications must inherit from the ImageSpec class. Models
inheriting from IKModel will be modified with a descriptor/accessor for each
spec found.
2009-01-04 17:38:06 +00:00
"""
2009-01-04 22:14:13 +00:00
import os
2009-01-08 21:11:15 +00:00
from imagekit.lib import *
2009-01-08 20:04:20 +00:00
from imagekit.utils import img_to_fobj
from django.core.files.base import ContentFile
2009-01-04 22:14:13 +00:00
2009-01-04 18:30:03 +00:00
class ImageSpec(object):
2009-01-04 22:14:13 +00:00
pre_cache = False
2009-01-08 20:04:20 +00:00
quality = 70
2009-01-04 17:38:06 +00:00
increment_count = False
processors = []
2009-01-04 18:30:03 +00:00
@classmethod
def name(cls):
return getattr(cls, 'access_as', cls.__name__.lower())
@classmethod
2009-01-08 18:37:15 +00:00
def process(cls, image, obj):
2009-01-04 18:30:03 +00:00
processed_image = image.copy()
for proc in cls.processors:
2009-01-08 18:37:15 +00:00
processed_image = proc.process(processed_image, obj)
2009-01-04 18:30:03 +00:00
return processed_image
class Accessor(object):
def __init__(self, obj, spec):
self._img = None
self._obj = obj
self.spec = spec
2009-01-08 20:04:20 +00:00
def _get_imgfile(self):
format = self._img.format or 'JPEG'
if format != 'JPEG':
imgfile = img_to_fobj(self._img, format)
else:
imgfile = img_to_fobj(self._img, format,
quality=int(self.spec.quality),
optimize=True)
return imgfile
def _create(self):
if self._exists():
return
2009-01-08 20:04:20 +00:00
self._img = self.spec.process(Image.open(self._obj._imgfield.file),
2009-01-08 18:37:15 +00:00
self._obj)
2009-01-08 20:04:20 +00:00
content = ContentFile(self._get_imgfile().read())
self._obj._imgfield.storage.save(self._path(), content)
def _delete(self):
self._obj._imgfield.storage.delete(self._path())
def _exists(self):
return self._obj._imgfield.storage.exists(self._path())
def _name(self):
filename, ext = os.path.splitext(os.path.basename(self._obj._imgfield.path))
2009-01-04 22:14:13 +00:00
return self._obj._ik.cache_filename_format % \
2009-01-04 18:30:03 +00:00
{'filename': filename,
2009-01-04 22:14:13 +00:00
'specname': self.spec.name(),
2009-01-04 18:30:03 +00:00
'extension': ext.lstrip('.')}
def _path(self):
return os.path.join(self._obj._ik.cache_dir, self._name())
2009-01-04 18:30:03 +00:00
@property
def url(self):
self._create()
if self.spec.increment_count:
2009-01-04 18:30:03 +00:00
fieldname = self._obj._ik.save_count_as
if fieldname is not None:
current_count = getattr(self._obj, fieldname)
setattr(self._obj, fieldname, current_count + 1)
return self._obj._imgfield.storage.url(self._path())
@property
def file(self):
self._create()
return self._obj._imgfield.storage.open(self._path())
2009-01-04 18:30:03 +00:00
@property
def image(self):
if self._img is None:
self._create()
self._img = Image.open(self.file)
2009-01-04 18:30:03 +00:00
return self._img
@property
def width(self):
return self.image.size[0]
@property
def height(self):
return self.image.size[1]
class Descriptor(object):
def __init__(self, spec):
self._spec = spec
def __get__(self, obj, type=None):
return Accessor(obj, self._spec)