您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

nav.py 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from django.core.urlresolvers import reverse
  2. from django.core.exceptions import ImproperlyConfigured
  3. from django.conf import settings
  4. class Node(object):
  5. def __init__(self, label, url_name=None, url_args=None, url_kwargs=None,
  6. access_fn=None, icon=None):
  7. self.label = label
  8. self.icon = icon
  9. self.url_name = url_name
  10. self.url_args = url_args
  11. self.url_kwargs = url_kwargs
  12. self.access_fn = access_fn
  13. self.children = []
  14. @property
  15. def is_heading(self):
  16. return self.url_name is None
  17. @property
  18. def url(self):
  19. return reverse(self.url_name, args=self.url_args,
  20. kwargs=self.url_kwargs)
  21. def add_child(self, node):
  22. self.children.append(node)
  23. def is_visible(self, user):
  24. if not self.access_fn:
  25. return True
  26. return self.access_fn(user)
  27. def filter(self, user):
  28. if not self.is_visible(user):
  29. return None
  30. node = Node(self.label, self.url_name, self.access_fn)
  31. for child in self.children:
  32. if child.is_visible(user):
  33. node.add_child(child)
  34. return node
  35. def has_children(self):
  36. return len(self.children) > 0
  37. def get_nodes(user):
  38. """
  39. Return the visible navigation nodes for the passed user
  40. """
  41. all_nodes = create_menu(settings.OSCAR_DASHBOARD_NAVIGATION)
  42. visible_nodes = []
  43. for node in all_nodes:
  44. filtered_node = node.filter(user)
  45. if filtered_node:
  46. visible_nodes.append(node)
  47. return visible_nodes
  48. def create_menu(menu_items, parent=None):
  49. """
  50. Create the navigation nodes based on a passed list of dicts
  51. """
  52. nodes = []
  53. for menu_dict in menu_items:
  54. try:
  55. label = menu_dict['label']
  56. except KeyError:
  57. raise ImproperlyConfigured(
  58. "No label specified for menu item in dashboard")
  59. children = menu_dict.get('children', [])
  60. if children:
  61. node = Node(label=label, icon=menu_dict.get('icon', None),
  62. access_fn=menu_dict.get('access_fn', None))
  63. create_menu(children, parent=node)
  64. else:
  65. node = Node(label=label, icon=menu_dict.get('icon', None),
  66. url_name=menu_dict.get('url_name', None),
  67. url_kwargs=menu_dict.get('url_kwargs', None),
  68. url_args=menu_dict.get('url_args', None),
  69. access_fn=menu_dict.get('access_fn', None))
  70. if parent is None:
  71. nodes.append(node)
  72. else:
  73. parent.add_child(node)
  74. return nodes