Added uniqueness constraints to Tag, NewsletterArticle, and NewsletterIssue, and...
[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                 def handle_subclasses(cls):
44                         for subclass in cls.__subclasses__():
45                                 try:
46                                         if issubclass(subclass, models.Model):
47                                                 if not subclass._meta.abstract:
48                                                         if not self.inclusive and subclass is self.cls:
49                                                                 continue
50                                                         contenttype = ContentType.objects.get_for_model(subclass)
51                                                         contenttype_pks.append(contenttype.pk)
52                                         handle_subclasses(subclass)
53                                 except:
54                                         pass
55                 handle_subclasses(self.cls)
56                 return models.Q(pk__in=contenttype_pks)
57
58
59 def fattr(*args, **kwargs):
60         def wrapper(function):
61                 for key in kwargs:
62                         setattr(function, key, kwargs[key])
63                 return function
64         return wrapper