From af6ebcb469bf564be50a3f134eaa16e7be3e84b7 Mon Sep 17 00:00:00 2001 From: Sean Bell Date: Sat, 9 Feb 2013 00:55:49 -0500 Subject: [PATCH] Fixing iteration over objects for abstract models --- imagekit/specs/sourcegroups.py | 6 ++++-- imagekit/utils.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/imagekit/specs/sourcegroups.py b/imagekit/specs/sourcegroups.py index 1693470..b782595 100644 --- a/imagekit/specs/sourcegroups.py +++ b/imagekit/specs/sourcegroups.py @@ -15,6 +15,7 @@ from django.db.models.signals import post_init, post_save, post_delete from django.utils.functional import wraps from ..cachefiles import LazyImageCacheFile from ..signals import source_created, source_changed, source_deleted +from ..utils import get_nonabstract_descendants def ik_model_receiver(fn): @@ -131,8 +132,9 @@ class ImageFieldSourceGroup(object): particular model. """ - for instance in self.model_class.objects.all(): - yield getattr(instance, self.image_field) + for model in get_nonabstract_descendants(self.model_class): + for instance in model.objects.all().iterator(): + yield getattr(instance, self.image_field) class SourceGroupFilesGenerator(object): diff --git a/imagekit/utils.py b/imagekit/utils.py index 6f4fd52..d749ac6 100644 --- a/imagekit/utils.py +++ b/imagekit/utils.py @@ -23,6 +23,17 @@ def _get_models(apps): return models +def get_nonabstract_descendants(model): + """ Returns all non-abstract descendants of the model. """ + if model._meta.abstract: + descendants = [] + for m in model.__subclasses__(): + descendants += get_nonabstract_descendants(m) + return descendants + else: + return [model] + + def get_by_qname(path, desc): try: dot = path.rindex('.')