django-imagekit/imagekit/models/fields/utils.py
Matthew Tretter 5c6d1aef5d Rename ImageSpecFile
You can generate other "spec" files (using apply will get you one). This
one is for saving cache files and its name should reflect that.
2012-10-16 23:51:26 -04:00

37 lines
1.6 KiB
Python

from ...files import ImageSpecCacheFile
from django.db.models.fields.files import ImageField
class ImageSpecFileDescriptor(object):
def __init__(self, field, attname):
self.attname = attname
self.field = field
def __get__(self, instance, owner):
if instance is None:
return self.field
else:
field_name = getattr(self.field, 'image_field', None)
if field_name:
source_file = getattr(instance, field_name)
else:
image_fields = [getattr(instance, f.attname) for f in \
instance.__class__._meta.fields if \
isinstance(f, ImageField)]
if len(image_fields) == 0:
raise Exception('%s does not define any ImageFields, so your' \
' %s ImageSpecField has no image to act on.' % \
(instance.__class__.__name__, self.attname))
elif len(image_fields) > 1:
raise Exception('%s defines multiple ImageFields, but you' \
' have not specified an image_field for your %s' \
' ImageSpecField.' % (instance.__class__.__name__,
self.attname))
else:
source_file = image_fields[0]
file = ImageSpecCacheFile(self.field.spec, source_file)
instance.__dict__[self.attname] = file
return file
def __set__(self, instance, value):
instance.__dict__[self.attname] = value