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