1 from django.db import models
2 from django.contrib.contenttypes.models import ContentType
5 class ContentTypeLimiter(object):
7 return models.Q(pk__in=[])
9 def add_to_query(self, query, *args, **kwargs):
10 query.add_q(self.q_object(), *args, **kwargs)
13 class ContentTypeRegistryLimiter(ContentTypeLimiter):
17 def register_class(self, cls):
18 self.classes.append(cls)
20 def unregister_class(self, cls):
21 self.classes.remove(cls)
25 for cls in self.classes:
27 if issubclass(cls, models.Model):
28 if not cls._meta.abstract:
29 contenttype = ContentType.objects.get_for_model(cls)
30 contenttype_pks.append(contenttype.pk)
33 return models.Q(pk__in=contenttype_pks)
36 class ContentTypeSubclassLimiter(ContentTypeLimiter):
37 def __init__(self, cls, inclusive=False):
39 self.inclusive = inclusive
43 for subclass in self.cls.__subclasses__():
45 if issubclass(subclass, models.Model):
46 if not subclass._meta.abstract:
47 if not self.inclusive and subclass is self.cls:
49 contenttype = ContentType.objects.get_for_model(subclass)
50 contenttype_pks.append(contenttype.pk)
53 return models.Q(pk__in=contenttype_pks)
56 def fattr(*args, **kwargs):
57 def wrapper(function):
59 setattr(function, key, kwargs[key])