Using spec properties from ImageModel.

This commit is contained in:
Matthew Tretter 2011-09-08 08:30:54 -04:00
parent 2387cc4be2
commit a9895f335a
3 changed files with 24 additions and 28 deletions

View file

@ -8,7 +8,7 @@ from django.db.models.signals import post_delete
from django.utils.html import conditional_escape as escape
from django.utils.translation import ugettext_lazy as _
from imagekit import specs
from imagekit.specs import ImageSpec, Descriptor
from imagekit.lib import *
from imagekit.options import Options
from imagekit.utils import img_to_fobj
@ -38,25 +38,20 @@ class ImageModelBase(ModelBase):
module.
"""
def __init__(cls, name, bases, attrs):
parents = [b for b in bases if isinstance(b, ImageModelBase)]
if not parents:
return
user_opts = getattr(cls, 'IKOptions', None)
opts = Options(user_opts)
if not opts.specs:
try:
module = __import__(opts.spec_module, {}, {}, [''])
except ImportError:
raise ImportError('Unable to load imagekit config module: %s' \
% opts.spec_module)
opts.specs.extend([spec for spec in module.__dict__.values() \
if isinstance(spec, type) \
and issubclass(spec, specs.ImageSpec) \
and spec != specs.ImageSpec])
for spec in opts.specs:
setattr(cls, spec.name(), specs.Descriptor(spec))
setattr(cls, '_ik', opts)
def __init__(self, name, bases, attrs):
if [b for b in bases if isinstance(b, ImageModelBase)]:
user_opts = getattr(self, 'IKOptions', None)
specs = []
for k, v in attrs.items():
if isinstance(v, ImageSpec):
setattr(self, k, Descriptor(v, k))
specs.append(v)
user_opts.specs = specs
opts = Options(user_opts)
setattr(self, '_ik', opts)
ModelBase.__init__(self, name, bases, attrs)
class ImageModel(models.Model):
@ -72,9 +67,6 @@ class ImageModel(models.Model):
class Meta:
abstract = True
class IKOptions:
pass
def admin_thumbnail_view(self):
if not self._imgfield:
return None
@ -92,6 +84,9 @@ class ImageModel(models.Model):
admin_thumbnail_view.short_description = _('Thumbnail')
admin_thumbnail_view.allow_tags = True
class IKOptions:
pass
@property
def _imgfield(self):
return getattr(self, self._ik.image_field)

View file

@ -16,7 +16,6 @@ class Options(object):
cache_filename_fields = ['pk', ]
cache_filename_format = "%(filename)s_%(specname)s.%(extension)s"
admin_thumbnail_spec = 'admin_thumbnail'
spec_module = 'imagekit.defaults'
specs = None
#storage = defaults to image_field.storage

View file

@ -34,11 +34,12 @@ class ImageSpec(object):
class Accessor(object):
def __init__(self, obj, spec):
def __init__(self, obj, spec, property_name):
self._img = None
self._fmt = None
self._obj = obj
self.spec = spec
self.property_name = property_name
def _get_imgfile(self):
format = self._img.format or 'JPEG'
@ -86,7 +87,7 @@ class Accessor(object):
if issubclass(processor, processors.Format):
extension = processor.extension
filename_format_dict = {'filename': filename,
'specname': self.spec.name(),
'specname': self.property_name,
'extension': extension.lstrip('.')}
cache_filename_fields = self._obj._ik.cache_filename_fields
filename_format_dict.update(dict(zip(
@ -138,8 +139,9 @@ class Accessor(object):
class Descriptor(object):
def __init__(self, spec):
def __init__(self, spec, property_name):
self._property_name = property_name
self._spec = spec
def __get__(self, obj, type=None):
return Accessor(obj, self._spec)
return Accessor(obj, self._spec, self._property_name)