Browse Source

Starting with Misago Admin hierarchy

Rafał Pitoń 11 years ago
parent
commit
bf4ee53589

+ 1 - 0
misago/admin/__init__.py

@@ -0,0 +1 @@
+from misago.admin.hierarchy import site # noqa

+ 94 - 0
misago/admin/hierarchy.py

@@ -0,0 +1,94 @@
+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()

+ 5 - 0
misago/admin/views/__init__.py

@@ -1,5 +1,6 @@
 from django.conf import settings
 from django.conf import settings
 from django.shortcuts import render as dj_render
 from django.shortcuts import render as dj_render
+from misago.admin import site
 
 
 
 
 def get_admin_namespace(requested_namespace):
 def get_admin_namespace(requested_namespace):
@@ -13,4 +14,8 @@ def get_admin_namespace(requested_namespace):
 def render(request, template, context=None):
 def render(request, template, context=None):
     context = context or {}
     context = context or {}
 
 
+    context.update({
+            'admin_sections': site.children('misago:admin'),
+        })
+
     return dj_render(request, template, context)
     return dj_render(request, template, context)

+ 11 - 0
misago/conf/models.py

@@ -1,5 +1,6 @@
 import base64
 import base64
 from django.db import models
 from django.db import models
+from misago.admin import site as admin_site
 from misago.conf import hydrators
 from misago.conf import hydrators
 try:
 try:
     import cPickle as pickle
     import cPickle as pickle
@@ -61,3 +62,13 @@ class Setting(models.Model):
         if new_extra:
         if new_extra:
             pickled_extra = pickle.dumps(new_extra, pickle.HIGHEST_PROTOCOL)
             pickled_extra = pickle.dumps(new_extra, pickle.HIGHEST_PROTOCOL)
             self.pickled_field_extra = base64.encodestring(pickled_extra)
             self.pickled_field_extra = base64.encodestring(pickled_extra)
+
+
+from django.utils.translation import ugettext_lazy as _
+
+admin_site.add_node(
+    parent='misago:admin',
+    link='misago:admin:index',
+    icon='fa fa-gears',
+    name=_("Settings"),
+    )

+ 13 - 0
misago/templates/misago/admin/base.html

@@ -3,6 +3,19 @@
 
 
 
 
 {% block body %}
 {% block body %}
+<h1>Sections:</h1>
+<ul>
+  {% for node in admin_sections %}
+  <li>
+    <a href="{% url node.link %}">
+      <span class="{{ node.icon }}"></span>
+      {{ node.name }}
+    </a>
+  </li>
+  {% endfor %}
+</ul>
+
+
 {% block content %}{% endblock %}
 {% block content %}{% endblock %}
 
 
 {# We include JavaScript at the end of page body so it loads faster #}
 {# We include JavaScript at the end of page body so it loads faster #}

+ 1 - 1
misago/templates/misago/admin/index.html

@@ -2,7 +2,7 @@
 {% load i18n %}
 {% load i18n %}
 
 
 
 
-{% block title %}{% trans "Log in" %} | {{ super }}{% endblock %}
+{% block title %}{% trans "Home" %} | {{ block.super }}{% endblock %}
 
 
 
 
 {% block content %}
 {% block content %}