From 807beef4180c8eda60015674fc9f7c9fa1c5d810 Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Sun, 12 Feb 2012 16:00:43 -0500 Subject: [PATCH] Centralized spec properies --- imagekit/base.py | 40 +++++++++++++++----------- imagekit/templatetags/imagekit_tags.py | 12 +++++--- 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/imagekit/base.py b/imagekit/base.py index 2fc3d65..b6865d7 100644 --- a/imagekit/base.py +++ b/imagekit/base.py @@ -36,26 +36,32 @@ def autodiscover(): raise -class ImageSpec(object): - def __init__(self, *args, **kwargs): - self._args = args - self._kwargs = kwargs +class SpecWrapper(object): + """ + Wraps a user-defined spec object so we can access properties that don't + exist without errors. - def get_file(self, source_file, spec_id): - return ImageSpecFile(source_file, spec_id, *self._args, **self._kwargs) + """ + def __init__(self, spec): + self.processors = getattr(spec, 'processors', None) + self.format = getattr(spec, 'format', None) + self.options = getattr(spec, 'options', None) + self.autoconvert = getattr(spec, 'autoconvert', True) + self.storage = getattr(spec, 'storage', None) self.image_cache_backend = getattr(spec, 'image_cache_backend', None) \ or get_default_image_cache_backend() class ImageSpecFile(ImageFieldFile): - def __init__(self, source_file, spec_id, processors=None, format=None, options={}, - autoconvert=True, storage=None, cache_state_backend=None): - self.generator = SpecFileGenerator(processors=processors, - format=format, options=options, autoconvert=autoconvert, - storage=storage) - self.storage = storage or source_file.storage - self.cache_state_backend = cache_state_backend or \ - get_default_cache_state_backend() + def __init__(self, spec, source_file, spec_id): + spec = SpecWrapper(spec) + + self.storage = spec.storage or source_file.storage + self.generator = SpecFileGenerator(processors=spec.processors, + format=spec.format, options=spec.options, + autoconvert=spec.autoconvert, storage=self.storage) + + self.spec = spec self.source_file = source_file self.spec_id = spec_id @@ -71,13 +77,13 @@ class ImageSpecFile(ImageFieldFile): file = property(_get_file, ImageFieldFile._set_file, ImageFieldFile._del_file) def clear(self): - return self.cache_state_backend.clear(self) + return self.spec.image_cache_backend.clear(self) def invalidate(self): - return self.cache_state_backend.invalidate(self) + return self.spec.image_cache_backend.invalidate(self) def validate(self): - return self.cache_state_backend.validate(self) + return self.spec.image_cache_backend.validate(self) @property def name(self): diff --git a/imagekit/templatetags/imagekit_tags.py b/imagekit/templatetags/imagekit_tags.py index c9d6f55..c8069a8 100644 --- a/imagekit/templatetags/imagekit_tags.py +++ b/imagekit/templatetags/imagekit_tags.py @@ -1,5 +1,7 @@ -from django import template import os +from django import template +from .. import ImageSpecFile + register = template.Library() @@ -56,11 +58,13 @@ class SpecNode(template.Node): return os.path.join(os.path.join('cache', filepath), new_name) def render(self, context): - spec_id = self.spec_id.resolve(context) - spec = spec_registry.get_spec(spec_id) source_image = self.source_image.resolve(context) variable_name = str(self.variable_name) - context[variable_name] = spec.get_file(source_image, spec_id) + spec_id = self.spec_id.resolve(context) + spec = spec_registry.get_spec(spec_id) + if callable(spec): + spec = spec() + context[variable_name] = ImageSpecFile(spec, source_image, spec_id) return ''