Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from django.core.urlresolvers import reverse
  2. _nodes = []
  3. class Node(object):
  4. def __init__(self, label, url_name=None, url_args=None, url_kwargs=None, access_fn=None):
  5. self.label = label
  6. self.url_name = url_name
  7. self.url_args = url_args
  8. self.url_kwargs = url_kwargs
  9. self.access_fn = access_fn
  10. self.children = []
  11. @property
  12. def is_heading(self):
  13. return self.url_name is None
  14. @property
  15. def url(self):
  16. return reverse(self.url_name, args=self.url_args, kwargs=self.url_kwargs)
  17. def add_child(self, node):
  18. self.children.append(node)
  19. def is_visible(self, user):
  20. if not self.access_fn:
  21. return True
  22. return self.access_fn(user)
  23. def filter(self, user):
  24. if not self.is_visible(user):
  25. return None
  26. node = Node(self.label, self.url_name, self.access_fn)
  27. for child in self.children:
  28. if child.is_visible(node):
  29. node.add_child(child)
  30. return node
  31. def has_children(self):
  32. return len(self.children) > 0
  33. def register(node, display_order=5):
  34. # We use tuples so we can sort later on. The lower the display order, the
  35. # closer to the left the node appears.
  36. _nodes.append((display_order, node))
  37. def flush():
  38. _nodes = []
  39. def get_nodes(user):
  40. nodes = []
  41. for _, node in sorted(_nodes):
  42. filtered_node = node.filter(user)
  43. if filtered_node:
  44. nodes.append(node)
  45. return nodes