Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 46fdca9049
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 62 lines (48 sloc) 1.524 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
from django.db import models
from django.contrib.contenttypes.models import ContentType


class ContentTypeLimiter(object):
def q_object(self):
return models.Q(pk__in=[])

def add_to_query(self, query, *args, **kwargs):
query.add_q(self.q_object(), *args, **kwargs)


class ContentTypeRegistryLimiter(ContentTypeLimiter):
def __init__(self):
self.classes = []

def register_class(self, cls):
self.classes.append(cls)

def unregister_class(self, cls):
self.classes.remove(cls)

def q_object(self):
contenttype_pks = []
for cls in self.classes:
try:
if issubclass(cls, models.Model):
if not cls._meta.abstract:
contenttype = ContentType.objects.get_for_model(cls)
contenttype_pks.append(contenttype.pk)
except:
pass
return models.Q(pk__in=contenttype_pks)


class ContentTypeSubclassLimiter(ContentTypeLimiter):
def __init__(self, cls, inclusive=False):
self.cls = cls
self.inclusive = inclusive

def q_object(self):
contenttype_pks = []
for subclass in self.cls.__subclasses__():
try:
if issubclass(subclass, models.Model):
if not subclass._meta.abstract:
if not self.inclusive and subclass is self.cls:
continue
contenttype = ContentType.objects.get_for_model(subclass)
contenttype_pks.append(contenttype.pk)
except:
pass
return models.Q(pk__in=contenttype_pks)


def fattr(*args, **kwargs):
def wrapper(function):
for key in kwargs:
setattr(function, key, kwargs[key])
return function
return wrapper
Something went wrong with that request. Please try again.