Initial implementation of new Node system whereby Nodes are separate from the objects...
[philo.git] / utils.py
index e3d1124..5fc3274 100644 (file)
--- a/utils.py
+++ b/utils.py
@@ -1,3 +1,58 @@
+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:
 def fattr(*args, **kwargs):
        def wrapper(function):
                for key in kwargs: