Centralized spec properies

This commit is contained in:
Matthew Tretter 2012-02-12 16:00:43 -05:00
parent 6a1a22825b
commit 807beef418
2 changed files with 31 additions and 21 deletions

View file

@ -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):

View file

@ -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 ''