Minor changes
[prawokultury.git] / menu / helpers.py
1 class MenuItem(object):
2     html_id = None
3
4     class InvalidMenuItem(BaseException):
5         pass
6
7     def __init__(self, url, title, html_id=None, more_urls=None):
8         self.url = url
9         self.title = title
10         self.html_id = html_id
11         self.more_urls = more_urls or set()
12
13     def is_valid(self):
14         return True
15
16     def is_active(self, request, value):
17         url = request.get_full_path()
18         return url == str(self.url) or url in set(str(url) for url in self.more_urls)
19
20     def check_active(self, request, value):
21         try:
22             self.active = self.is_active(request, value)
23         except self.InvalidMenuItem, e:
24             pass
25
26     def get_url(self):
27         return self.url
28
29     def get_title(self):
30         return self.title
31
32
33 class ObjectMenuItem(MenuItem):
34     """Menu item corresponding to an object.
35
36     If no url or title is provided, get_absolute_url and __unicode__ are used.
37     You can also provide a reverse lookup dictionary, as in {model: field_name}.
38     """
39     def __init__(self,
40             obj=None, obj_get=None,
41             url=None, rev_lookups=None, title=None, html_id=None):
42         super(ObjectMenuItem, self).__init__(url=url, title=title, html_id=html_id)
43         self.obj = obj
44         self.obj_get = obj_get
45         self.rev_lookups = rev_lookups
46
47     def get_object(self):
48         try:
49             return self.obj or self.obj_get()
50         except BaseException, e:
51             raise self.InvalidMenuItem(e)
52
53     def get_title(self):
54         return self.title or unicode(self.get_object())
55
56     def get_url(self):
57         return self.url or self.get_object().get_absolute_url()
58
59     def is_valid(self):
60         try:
61             obj = self.get_object()
62         except self.InvalidMenuItem, e:
63             return False
64         return True
65
66     def is_active(self, request, value):
67         if value == self.get_object():
68             return True
69         if self.rev_lookups:
70             for model, manager in self.rev_lookups.items():
71                 if (isinstance(value, model) and 
72                         self.get_object() in getattr(value, manager).all()):
73                     return True
74         return False
75
76
77 class ModelMenuItem(MenuItem):
78     """Menu item corresponding to a model, optionally filtered by some fields."""
79
80     def __init__(self, model, url, field_lookups=None, title=None, html_id=None):
81         if title is None:
82             title = unicode(model)
83         super(ModelMenuItem, self).__init__(title=title, url=url, html_id=html_id)
84         self.model = model
85         self.field_lookups = field_lookups
86
87     def is_active(self, request, value):
88         if value == self.model and not self.field_lookups:
89             return True
90         if str(self.url) == request.get_full_path():
91             return True
92         if isinstance(value, self.model) and self.field_lookups:
93             lookups_ok = True
94             for field, lookup in self.field_lookups.items():
95                 if getattr(value, field) != lookup:
96                     lookups_ok = False
97             if lookups_ok:
98                 return True
99         return False
100
101     def get_title(self):
102         return self.title or unicode(self.model)