Update django-sponsors.
[prawokultury.git] / menu / helpers.py
1 class MenuItem(object):
2     html_id = None
3
4     def __init__(self, url, title, html_id=None):
5         self.url = url
6         self.title = title
7         self.html_id = html_id
8
9     def is_active(self, request, value):
10         return request.get_full_path() == str(self.url)
11
12     def check_active(self, request, value):
13         self.active = self.is_active(request, value)
14
15     def get_url(self):
16         return self.url
17
18     def get_title(self):
19         return self.title
20
21
22 class ObjectMenuItem(MenuItem):
23     """Menu item corresponding to an object.
24
25     If no url or title is provided, get_absolute_url and __unicode__ are used.
26     You can also provide a reverse lookup dictionary, as in {model: field_name}.
27     """
28     def __init__(self, obj_lookup, url=None, rev_lookups=None, title=None, html_id=None):
29         super(ObjectMenuItem, self).__init__(url=url, title=title, html_id=html_id)
30         self.obj_lookup = obj_lookup
31         self.rev_lookups = rev_lookups
32
33     @property
34     def obj(self):
35         from migdal.models import Entry
36         try:
37             entry = Entry.objects.get(**self.obj_lookup)
38         except Entry.DoesNotExist:
39             return
40         if not entry.published:
41             return None
42         return entry
43
44     def get_title(self):
45         return self.title or unicode(self.obj)
46
47     @property
48     def get_url(self):
49         return self.url or self.obj.get_absolute_url()
50
51     def is_active(self, request, value):
52         if value == self.obj:
53             return True
54         if self.rev_lookups:
55             for model, manager in self.rev_lookups.items():
56                 if (isinstance(value, model) and 
57                         self.obj in getattr(value, manager).all()):
58                     return True
59         return False
60
61
62 class ModelMenuItem(MenuItem):
63     """Menu item corresponding to a model, optionally filtered by some fields."""
64
65     def __init__(self, model, url, field_lookups=None, title=None, html_id=None):
66         if title is None:
67             title = unicode(model)
68         super(ModelMenuItem, self).__init__(title=title, url=url, html_id=html_id)
69         self.model = model
70         self.field_lookups = field_lookups
71
72     def is_active(self, request, value):
73         if value == self.model and not self.field_lookups:
74             return True
75         if isinstance(value, self.model) and self.field_lookups:
76             lookups_ok = True
77             for field, lookup in self.field_lookups.items():
78                 if getattr(value, field) != lookup:
79                     lookups_ok = False
80             if lookups_ok:
81                 return True
82         return False
83
84     def get_title(self):
85         return self.title or unicode(self.model)