backoffice: refactor display of menu items (#6726)

This commit is contained in:
Frédéric Péters 2015-05-05 11:21:26 +02:00
parent d2fe05be5a
commit 18bb6483e2
1 changed files with 34 additions and 61 deletions

View File

@ -297,30 +297,14 @@ class RootDirectory(BackofficeRootDirectory):
def generate_header_menu(self, selected=None):
s = ['<ul id="menu">\n']
base_url = get_publisher().get_root_url() + 'backoffice'
for item in self.get_menu_items():
if len(item) == 2:
k, v = item
display_function = None
elif len(item) == 3:
k, v, display_function = item
if k is None: # heading
s.append('<li><strong>%s</strong></li>' % v)
for menu_item in self.get_menu_items():
if not 'icon' in menu_item:
continue
if k.strip('/') not in ('home', 'forms', 'workflows', 'users', 'roles',
'categories', 'settings', 'management'):
# skip items that do not have icons, they will have to be
# accessed via the backoffice main page
continue
if k == '/':
continue # skip root
if display_function and not display_function(k):
continue
if k.rstrip('/') == selected:
if menu_item.get('slug') == selected:
s.append('<li class="active">')
else:
s.append('<li>')
s.append('<a href="%s/%s">%s</a></li>\n' % (base_url, k, _(v)))
s.append('<a href="%(url)s">%(label)s</a></li>\n' % menu_item)
s.append('</ul>\n')
return ''.join(s)
@ -329,38 +313,16 @@ class RootDirectory(BackofficeRootDirectory):
r = TemplateIO(html=True)
r += htmltext('<div class="bo-block"><p>%s</p></div>') % self.get_intro_text()
main_items = []
more_items = []
for item in self.get_menu_items():
if len(item) == 2:
item = list(item) + [None]
k, v, display_function = item
if not k.strip('/'):
continue
if display_function and not display_function(k):
continue
if k.strip('/') in ('home', 'forms', 'workflows', 'users', 'roles',
'categories', 'settings', 'management'):
# menu entries that have icons.
main_items.append((k, v))
else:
more_items.append((k, v))
menu_items = self.get_menu_items()
r += htmltext('<ul class="apps">')
for k, v in main_items:
r += htmltext('<li class="zone-%s"><a href="%s">') % (k.strip('/'), k)
if callable(v):
r += v()
else:
r += _(v)
r += htmltext('</a></li>')
for k, v in more_items:
r += htmltext('<li class="zone-no-icon"><a href="%s">') % k
if callable(v):
r += v()
else:
r += _(v)
r += htmltext('</a></li>')
for menu_item in menu_items:
if not 'icon' in menu_item:
continue
r += htmltext('<li class="zone-%(icon)s"><a href="%(url)s">%(label)s</a></li>') % menu_item
for menu_item in menu_items:
if 'icon' in menu_item:
continue
r += htmltext('<li class="zone-no-icon"><a href="%(url)s">%(label)s</a></li>') % menu_item
r += htmltext('</ul>')
r += htmltext('<br class="clear">')
@ -598,23 +560,34 @@ class RootDirectory(BackofficeRootDirectory):
def get_menu_items(self):
if not get_request().user:
return self.menu_items
return []
user_roles = set(get_request().user.roles or [])
if not get_cfg('admin-permissions', {}):
return self.menu_items
menu_items = self.menu_items[:]
for item in menu_items:
menu_items = []
backoffice_url = get_publisher().get_backoffice_url()
if not backoffice_url.endswith('/'):
backoffice_url += '/'
for item in self.menu_items:
if len(item) == 2:
item = list(item) + [None]
k, v, display_function = item
k = k.strip(str('/'))
if not k:
slug = k.strip(str('/'))
if not slug:
continue
if display_function and not display_function(k):
if display_function and not display_function(slug):
continue
if is_accessible(k):
if not is_accessible(slug):
continue
menu_items.remove((k+'/', v))
if callable(v):
label = v()
else:
label = _(v)
menu_items.append({
'label': label,
'slug': slug,
'url': backoffice_url + k})
if slug in ('home', 'forms', 'workflows', 'users', 'roles',
'categories', 'settings', 'management'):
menu_items[-1]['icon'] = k.strip('/')
return menu_items
class FakeField(object):