12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- class Node(object):
- def __init__(self, link=None, name=None, icon=None):
- self.link = link
- self.name = name
- self.icon = icon
- self._children = []
- self._children_dict = {}
- def children(self):
- return self._children
- def add_node(self, node, after=None, before=None):
- self._children.append(node)
- self._children_dict[node['link']] = node
- def child(self, node):
- try:
- return self._children_dict[node]
- except KeyError:
- raise ValueError(
- "Node %s is not a child of node %s" % (node, self.name))
- def is_root(self):
- return False
- class AdminHierarchyBuilder(object):
- def __init__(self):
- self.nodes_record = []
- self.nodes_dict = {}
- def build_nodes_dict(self):
- nodes_dict = {'misago:admin': Node()}
- iterations = 0
- while self.nodes_record:
- iterations += 1
- if iterations > 512:
- message = ("Misago Admin hierarchy is invalid or too complex "
- "to resolve. Nodes left: %s" % self.nodes_record)
- raise ValueError(message)
- node = self.nodes_record[0]
- if node['parent'] in nodes_dict:
- parent = nodes_dict[node['parent']]
- node_obj = Node(link=node['link'],
- name=node['name'],
- icon=node['icon'])
- if node['after']:
- parent.add_node(node, after=node['after'])
- elif node['before']:
- parent.add_node(node, before=node['before'])
- else:
- parent.add_node(node)
- namespace = ':'.join(node['link'].split(':')[:-1])
- if namespace not in nodes_dict:
- nodes_dict[namespace] = node
- self.nodes_record = self.nodes_record[1:]
- return nodes_dict
- def add_node(self, parent='misago:admin', after=None, before=None,
- link=None, name=None, icon=None):
- if self.nodes_dict:
- raise ValueError("Misago admin site has already been "
- "initialized. You can't add new nodes to it.")
- if after and before:
- raise ValueError("You cannot use both after and before kwargs.")
- self.nodes_record.append({
- 'parent': parent,
- 'after': after,
- 'before': before,
- 'link': link,
- 'name': name,
- 'icon': icon,
- })
- def is_root(self):
- return True
- def children(self, node='misago:admin'):
- if not self.nodes_dict:
- self.nodes_dict = self.build_nodes_dict()
- return self.nodes_dict[node].children()
- def parent(self):
- raise ValueError("Root node has no parent!")
- site = AdminHierarchyBuilder()
|