verdandi/mixins/menuitemmixin.py

71 lines
1.6 KiB
Python
Raw Normal View History

2015-02-26 20:26:39 +01:00
#!/usr/bin/env python2
from verdandi.mixins.messagemixin import MessageMixin
2015-02-26 20:26:39 +01:00
class MenuItemMixin(MessageMixin):
2015-02-26 20:26:39 +01:00
menu_title = "Menu title"
menu_label = None
menu_parent = None
url = "index.html"
2015-04-06 22:59:09 +02:00
menu_items = None
2015-02-26 20:26:39 +01:00
def process_message(self, message):
other_messages = super(MenuItemMixin, self).process_message(message)
2015-02-26 20:26:39 +01:00
if message == None:
self.menu_items = {}
return other_messages + [{'type': 'menu_add_item',
'title' : self.menu_title,
'parent' : self.menu_parent,
'label' : self.menu_label,
'url' : self.url}]
2015-04-06 22:59:09 +02:00
elif message['type'] == 'menu_add_item':
2015-04-06 22:59:09 +02:00
label = message['label']
if label in self.menu_items.keys():
print '[Warn] Depulicate menu item label: %s in %s' % (label, self.menu_label)
return other_messages
2015-04-06 22:59:09 +02:00
self.menu_items[label] = {}
2015-04-06 22:59:09 +02:00
for key in ['title', 'parent', 'label', 'url']:
self.menu_items[label][key] = message[key]
2015-02-26 20:26:39 +01:00
return other_messages
2015-04-06 22:59:09 +02:00
def get_menu_level(self, parent):
level = filter(lambda x: x['parent'] == parent, self.menu_items.values())
return sorted(level, key=lambda x: x['label'])
2015-04-06 22:59:09 +02:00
def generate_levels(self, parent):
level = self.get_menu_level(parent)
2015-04-06 22:59:09 +02:00
if len(level) == 0:
return ''
2015-04-06 22:59:09 +02:00
res = '<ul>\n'
for item in level:
res += '<li><a href="/%s">%s</a>\n' % (item['url'], item['title'])
res += self.generate_levels(item['label'])
res += '</li>\n'
res += '</ul>\n'
2015-04-06 22:59:09 +02:00
return res
def generate_menu(self):
return self.generate_levels(None)
2015-04-06 22:59:09 +02:00
def get_context(self):
context = super(MenuItemMixin, self).get_context()
context['menu'] = self.generate_menu()
return context