From 9891314b8e77d82edf7eafe3bd237da0ac585da5 Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Fri, 5 Apr 2013 12:25:02 -0400 Subject: [PATCH 1/5] Don't error if same generator is registered --- imagekit/registry.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/imagekit/registry.py b/imagekit/registry.py index a28738f..620f9f8 100644 --- a/imagekit/registry.py +++ b/imagekit/registry.py @@ -15,7 +15,8 @@ class GeneratorRegistry(object): before_access.connect(self.before_access_receiver) def register(self, id, generator): - if id in self._generators: + registered_generator = self._generators.get(id) + if registered_generator and generator != self._generators[id]: raise AlreadyRegistered('The generator with id %s is' ' already registered' % id) self._generators[id] = generator From dafebc9a4de03fcd5c31fd038af5c8ccba3d30a2 Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Fri, 5 Apr 2013 14:11:26 -0400 Subject: [PATCH 2/5] Don't call register without spec --- imagekit/specs/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/imagekit/specs/__init__.py b/imagekit/specs/__init__.py index c12acfa..3c65836 100644 --- a/imagekit/specs/__init__.py +++ b/imagekit/specs/__init__.py @@ -202,7 +202,9 @@ class SpecHost(object): """ self.spec_id = id - register.generator(id, self._original_spec) + + if self._original_spec: + register.generator(id, self._original_spec) def get_spec(self, source): """ From 41ab2c0fa3282108efd4574f64d2b4b9662adf73 Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Fri, 5 Apr 2013 14:57:11 -0400 Subject: [PATCH 3/5] Use different name for different signature --- imagekit/models/fields/__init__.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/imagekit/models/fields/__init__.py b/imagekit/models/fields/__init__.py index 1042d83..9556991 100644 --- a/imagekit/models/fields/__init__.py +++ b/imagekit/models/fields/__init__.py @@ -7,7 +7,9 @@ from ...registry import register class SpecHostField(SpecHost): - def set_spec_id(self, cls, name): + def _set_spec_id(self, cls, name): + spec_id = getattr(self, 'spec_id', None) + # Generate a spec_id to register the spec with. The default spec id is # ":_" if not getattr(self, 'spec_id', None): @@ -59,7 +61,7 @@ class ImageSpecField(SpecHostField): source = image_fields[0] setattr(cls, name, ImageSpecFileDescriptor(self, name, source)) - self.set_spec_id(cls, name) + self._set_spec_id(cls, name) # Add the model and field as a source for this spec id register.source_group(self.spec_id, ImageFieldSourceGroup(cls, source)) @@ -92,7 +94,7 @@ class ProcessedImageField(models.ImageField, SpecHostField): height_field, **kwargs) def contribute_to_class(self, cls, name): - self.set_spec_id(cls, name) + self._set_spec_id(cls, name) return super(ProcessedImageField, self).contribute_to_class(cls, name) From 091b2137d08e146dbe7dc57b29e1a7714999bb46 Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Fri, 5 Apr 2013 14:57:41 -0400 Subject: [PATCH 4/5] Always call set_spec_id --- imagekit/models/fields/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/imagekit/models/fields/__init__.py b/imagekit/models/fields/__init__.py index 9556991..3f1a2f6 100644 --- a/imagekit/models/fields/__init__.py +++ b/imagekit/models/fields/__init__.py @@ -12,13 +12,13 @@ class SpecHostField(SpecHost): # Generate a spec_id to register the spec with. The default spec id is # ":_" - if not getattr(self, 'spec_id', None): + if not spec_id: spec_id = (u'%s:%s:%s' % (cls._meta.app_label, cls._meta.object_name, name)).lower() - # Register the spec with the id. This allows specs to be overridden - # later, from outside of the model definition. - super(SpecHostField, self).set_spec_id(spec_id) + # Register the spec with the id. This allows specs to be overridden + # later, from outside of the model definition. + super(SpecHostField, self).set_spec_id(spec_id) class ImageSpecField(SpecHostField): From 6f9f99e86c5262581246505a5911e899e1eb177c Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Fri, 5 Apr 2013 15:28:36 -0400 Subject: [PATCH 5/5] Fields shouldn't cause AlreadyRegistered exceptions --- imagekit/specs/__init__.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/imagekit/specs/__init__.py b/imagekit/specs/__init__.py index 3c65836..9a2ba66 100644 --- a/imagekit/specs/__init__.py +++ b/imagekit/specs/__init__.py @@ -4,7 +4,7 @@ from hashlib import md5 import pickle from ..cachefiles.backends import get_default_cachefile_backend from ..cachefiles.strategies import StrategyWrapper -from ..exceptions import MissingSource +from ..exceptions import AlreadyRegistered, MissingSource from ..processors import ProcessorPipeline from ..utils import open_image, img_to_fobj, get_by_qname from ..registry import generator_registry, register @@ -204,7 +204,15 @@ class SpecHost(object): self.spec_id = id if self._original_spec: - register.generator(id, self._original_spec) + try: + register.generator(id, self._original_spec) + except AlreadyRegistered: + # Fields should not cause AlreadyRegistered exceptions. If a + # spec is already registered, that should be used. It is + # especially important that an error is not thrown here because + # of South, which will create duplicate models as part of its + # "fake orm," therefore re-registering specs. + pass def get_spec(self, source): """