hierarchy.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. class Node(object):
  2. def __init__(self, link=None, name=None, icon=None):
  3. self.link = link
  4. self.name = name
  5. self.icon = icon
  6. self._children = []
  7. self._children_dict = {}
  8. def children(self):
  9. return self._children
  10. def add_node(self, node, after=None, before=None):
  11. self._children.append(node)
  12. self._children_dict[node['link']] = node
  13. def child(self, node):
  14. try:
  15. return self._children_dict[node]
  16. except KeyError:
  17. raise ValueError(
  18. "Node %s is not a child of node %s" % (node, self.name))
  19. def is_root(self):
  20. return False
  21. class AdminHierarchyBuilder(object):
  22. def __init__(self):
  23. self.nodes_record = []
  24. self.nodes_dict = {}
  25. def build_nodes_dict(self):
  26. nodes_dict = {'misago:admin': Node()}
  27. iterations = 0
  28. while self.nodes_record:
  29. iterations += 1
  30. if iterations > 512:
  31. message = ("Misago Admin hierarchy is invalid or too complex "
  32. "to resolve. Nodes left: %s" % self.nodes_record)
  33. raise ValueError(message)
  34. node = self.nodes_record[0]
  35. if node['parent'] in nodes_dict:
  36. parent = nodes_dict[node['parent']]
  37. node_obj = Node(link=node['link'],
  38. name=node['name'],
  39. icon=node['icon'])
  40. if node['after']:
  41. parent.add_node(node, after=node['after'])
  42. elif node['before']:
  43. parent.add_node(node, before=node['before'])
  44. else:
  45. parent.add_node(node)
  46. namespace = ':'.join(node['link'].split(':')[:-1])
  47. if namespace not in nodes_dict:
  48. nodes_dict[namespace] = node
  49. self.nodes_record = self.nodes_record[1:]
  50. return nodes_dict
  51. def add_node(self, parent='misago:admin', after=None, before=None,
  52. link=None, name=None, icon=None):
  53. if self.nodes_dict:
  54. raise ValueError("Misago admin site has already been "
  55. "initialized. You can't add new nodes to it.")
  56. if after and before:
  57. raise ValueError("You cannot use both after and before kwargs.")
  58. self.nodes_record.append({
  59. 'parent': parent,
  60. 'after': after,
  61. 'before': before,
  62. 'link': link,
  63. 'name': name,
  64. 'icon': icon,
  65. })
  66. def is_root(self):
  67. return True
  68. def children(self, node='misago:admin'):
  69. if not self.nodes_dict:
  70. self.nodes_dict = self.build_nodes_dict()
  71. return self.nodes_dict[node].children()
  72. def parent(self):
  73. raise ValueError("Root node has no parent!")
  74. site = AdminHierarchyBuilder()