1 class MenuItem(object):
4 def __init__(self, url, title, html_id=None):
9 def is_active(self, request, value):
10 return request.get_full_path() == str(self.url)
12 def check_active(self, request, value):
13 self.active = self.is_active(request, value)
22 class ObjectMenuItem(MenuItem):
23 """Menu item corresponding to an object.
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}.
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
35 from migdal.models import Entry
37 entry = Entry.objects.get(**self.obj_lookup)
38 except Entry.DoesNotExist:
40 if not entry.published:
45 return self.title or unicode(self.obj)
49 return self.url or self.obj.get_absolute_url()
51 def is_active(self, request, value):
55 for model, manager in self.rev_lookups.items():
56 if (isinstance(value, model) and
57 self.obj in getattr(value, manager).all()):
62 class ModelMenuItem(MenuItem):
63 """Menu item corresponding to a model, optionally filtered by some fields."""
65 def __init__(self, model, url, field_lookups=None, title=None, html_id=None):
67 title = unicode(model)
68 super(ModelMenuItem, self).__init__(title=title, url=url, html_id=html_id)
70 self.field_lookups = field_lookups
72 def is_active(self, request, value):
73 if value == self.model and not self.field_lookups:
75 if isinstance(value, self.model) and self.field_lookups:
77 for field, lookup in self.field_lookups.items():
78 if getattr(value, field) != lookup:
85 return self.title or unicode(self.model)