You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

menu.py 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from django.conf import settings
  2. from django.core.exceptions import ImproperlyConfigured
  3. from oscar.core.loading import get_class, import_string
  4. Node = get_class('dashboard.nav', 'Node')
  5. def get_nodes(user):
  6. """
  7. Return the visible navigation nodes for the passed user
  8. """
  9. all_nodes = create_menu(settings.OSCAR_DASHBOARD_NAVIGATION)
  10. visible_nodes = []
  11. for node in all_nodes:
  12. filtered_node = node.filter(user)
  13. # don't append headings without children
  14. if filtered_node and (filtered_node.has_children() or
  15. not filtered_node.is_heading):
  16. visible_nodes.append(filtered_node)
  17. return visible_nodes
  18. def create_menu(menu_items, parent=None):
  19. """
  20. Create the navigation nodes based on a passed list of dicts
  21. """
  22. nodes = []
  23. default_fn = import_string(
  24. settings.OSCAR_DASHBOARD_DEFAULT_ACCESS_FUNCTION)
  25. for menu_dict in menu_items:
  26. try:
  27. label = menu_dict['label']
  28. except KeyError:
  29. raise ImproperlyConfigured(
  30. "No label specified for menu item in dashboard")
  31. children = menu_dict.get('children', [])
  32. if children:
  33. node = Node(label=label, icon=menu_dict.get('icon', None),
  34. access_fn=menu_dict.get('access_fn', default_fn))
  35. create_menu(children, parent=node)
  36. else:
  37. node = Node(label=label, icon=menu_dict.get('icon', None),
  38. url_name=menu_dict.get('url_name', None),
  39. url_kwargs=menu_dict.get('url_kwargs', None),
  40. url_args=menu_dict.get('url_args', None),
  41. access_fn=menu_dict.get('access_fn', default_fn))
  42. if parent is None:
  43. nodes.append(node)
  44. else:
  45. parent.add_child(node)
  46. return nodes