From df41459e65d088210a038f5eccb130b625614bc3 Mon Sep 17 00:00:00 2001 From: Matthew Tretter Date: Sun, 10 Feb 2013 15:39:33 -0500 Subject: [PATCH] Fix signals for abstract models Includes a fix for undispatched signals, as well as signals being handled twice. A regression of #126 Related: #185 --- imagekit/specs/sourcegroups.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/imagekit/specs/sourcegroups.py b/imagekit/specs/sourcegroups.py index b782595..59810bd 100644 --- a/imagekit/specs/sourcegroups.py +++ b/imagekit/specs/sourcegroups.py @@ -13,6 +13,7 @@ have two responsibilities: from django.db.models.signals import post_init, post_save, post_delete from django.utils.functional import wraps +import inspect from ..cachefiles import LazyImageCacheFile from ..signals import source_created, source_changed, source_deleted from ..utils import get_nonabstract_descendants @@ -26,8 +27,15 @@ def ik_model_receiver(fn): """ @wraps(fn) def receiver(self, sender, **kwargs): - if sender in (src.model_class for src in self._source_groups): - fn(self, sender=sender, **kwargs) + if not inspect.isclass(sender): + return + for src in self._source_groups: + if issubclass(sender, src.model_class): + fn(self, sender=sender, **kwargs) + + # If we find a match, return. We don't want to handle the signal + # more than once. + return return receiver @@ -77,7 +85,7 @@ class ModelSignalRouter(object): """ return dict((src.image_field, getattr(instance, src.image_field)) for - src in self._source_groups if src.model_class is instance.__class__) + src in self._source_groups if isinstance(instance, src.model_class)) @ik_model_receiver def post_save_receiver(self, sender, instance=None, created=False, raw=False, **kwargs): @@ -110,7 +118,7 @@ class ModelSignalRouter(object): """ for source_group in self._source_groups: - if source_group.model_class is model_class and source_group.image_field == attname: + if issubclass(model_class, source_group.model_class) and source_group.image_field == attname: signal.send(sender=source_group, source=file)