MultiViews now pass extra_context and node to view functions that accept them as...
[philo.git] / utils.py
1 from django.db import models
2 from django.contrib.contenttypes.models import ContentType
3
4
5 class ContentTypeLimiter(object):
6         def q_object(self):
7                 return models.Q(pk__in=[])
8         
9         def add_to_query(self, query, *args, **kwargs):
10                 query.add_q(self.q_object(), *args, **kwargs)
11
12
13 class ContentTypeRegistryLimiter(ContentTypeLimiter):
14         def __init__(self):
15                 self.classes = []
16         
17         def register_class(self, cls):
18                 self.classes.append(cls)
19         
20         def unregister_class(self, cls):
21                 self.classes.remove(cls)
22         
23         def q_object(self):
24                 contenttype_pks = []
25                 for cls in self.classes:
26                         try:
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)
31                         except:
32                                 pass
33                 return models.Q(pk__in=contenttype_pks)
34
35
36 class ContentTypeSubclassLimiter(ContentTypeLimiter):
37         def __init__(self, cls, inclusive=False):
38                 self.cls = cls
39                 self.inclusive = inclusive
40         
41         def q_object(self):
42                 contenttype_pks = []
43                 for subclass in self.cls.__subclasses__():
44                         try:
45                                 if issubclass(subclass, models.Model):
46                                         if not subclass._meta.abstract:
47                                                 if not self.inclusive and subclass is self.cls:
48                                                         continue
49                                                 contenttype = ContentType.objects.get_for_model(subclass)
50                                                 contenttype_pks.append(contenttype.pk)
51                         except:
52                                 pass
53                 return models.Q(pk__in=contenttype_pks)
54
55
56 def fattr(*args, **kwargs):
57         def wrapper(function):
58                 for key in kwargs:
59                         setattr(function, key, kwargs[key])
60                 return function
61         return wrapper