Rafał Pitoń 8 years ago
parent
commit
704cb89649

+ 40 - 29
misago/admin/hierarchy.py

@@ -26,13 +26,12 @@ class Node(object):
     def children_as_dicts(self):
     def children_as_dicts(self):
         childrens = []
         childrens = []
         for children in self._children:
         for children in self._children:
-            childrens.append(
-                {
-                    'name': children.name,
-                    'icon': children.icon,
-                    'link': reverse(children.link),
-                    'namespace': children.namespace,
-                })
+            childrens.append({
+                'name': children.name,
+                'icon': children.icon,
+                'link': reverse(children.link),
+                'namespace': children.namespace,
+            })
         return childrens
         return childrens
 
 
     def add_node(self, node, after=None, before=None):
     def add_node(self, node, after=None, before=None):
@@ -107,17 +106,19 @@ class AdminHierarchyBuilder(object):
 
 
             for index, node in enumerate(self.nodes_record):
             for index, node in enumerate(self.nodes_record):
                 if node['parent'] in nodes_dict:
                 if node['parent'] in nodes_dict:
-                    node_obj = Node(name=node['name'],
-                                    icon=node['icon'],
-                                    link=node['link'])
+                    node_obj = Node(
+                        name=node['name'],
+                        icon=node['icon'],
+                        link=node['link']
+                    )
 
 
                     parent = nodes_dict[node['parent']]
                     parent = nodes_dict[node['parent']]
                     if node['after']:
                     if node['after']:
-                        node_added = parent.add_node(node_obj,
-                                                     after=node['after'])
+                        node_added = parent.add_node(
+                            node_obj, after=node['after'])
                     elif node['before']:
                     elif node['before']:
-                        node_added = parent.add_node(node_obj,
-                                                     before=node['before'])
+                        node_added = parent.add_node(
+                            node_obj, before=node['before'])
                     else:
                     else:
                         node_added = parent.add_node(node_obj)
                         node_added = parent.add_node(node_obj)
 
 
@@ -141,16 +142,15 @@ class AdminHierarchyBuilder(object):
         if after and before:
         if after and before:
             raise ValueError("after and before arguments are exclusive")
             raise ValueError("after and before arguments are exclusive")
 
 
-        self.nodes_record.append(
-            {
-                'name': name,
-                'icon': icon,
-                'parent': parent,
-                'namespace': namespace,
-                'after': after,
-                'before': before,
-                'link': link,
-            })
+        self.nodes_record.append({
+            'name': name,
+            'icon': icon,
+            'parent': parent,
+            'namespace': namespace,
+            'after': after,
+            'before': before,
+            'link': link,
+        })
 
 
     def visible_branches(self, request):
     def visible_branches(self, request):
         if not self.nodes_dict:
         if not self.nodes_dict:
@@ -158,22 +158,33 @@ class AdminHierarchyBuilder(object):
 
 
         branches = []
         branches = []
 
 
-        if request.resolver_match.namespace in self.nodes_dict:
-            node = self.nodes_dict[request.resolver_match.namespace]
+        try:
+            namespace = request.resolver_match.namespace
+        except AttributeError:
+            namespace = 'misago:admin'
+
+        if namespace in self.nodes_dict:
+            node = self.nodes_dict[namespace]
             while node:
             while node:
                 children = node.children_as_dicts()
                 children = node.children_as_dicts()
                 if children:
                 if children:
                     branches.append(children)
                     branches.append(children)
                 node = node.parent
                 node = node.parent
 
 
-        namespace = request.resolver_match.namespaces
+        try:
+            namespaces = request.resolver_match.namespaces
+        except AttributeError:
+            namespaces = ['misago', 'admin']
 
 
         branches.reverse()
         branches.reverse()
         for depth, branch in enumerate(branches):
         for depth, branch in enumerate(branches):
-            depth_namespace = namespace[2:3 + depth]
+            depth_namespace = namespaces[2:3 + depth]
             for node in branch:
             for node in branch:
                 node_namespace = node['namespace'].split(':')[2:3 + depth]
                 node_namespace = node['namespace'].split(':')[2:3 + depth]
-                node['is_active'] = depth_namespace == node_namespace
+                if request.resolver_match:
+                    node['is_active'] = depth_namespace == node_namespace
+                else:
+                    node['is_active'] = False
 
 
         return branches
         return branches
 
 

+ 12 - 0
misago/admin/tests/test_admin_views.py

@@ -184,6 +184,7 @@ class AdminViewAccessTests(AdminTestCase):
         response = self.client.get(reverse('misago:admin:index'))
         response = self.client.get(reverse('misago:admin:index'))
         self.assertContains(response, self.user.username)
         self.assertContains(response, self.user.username)
 
 
+
 class AdminIndexViewTests(AdminTestCase):
 class AdminIndexViewTests(AdminTestCase):
     def test_view_returns_200(self):
     def test_view_returns_200(self):
         """admin index view returns 200"""
         """admin index view returns 200"""
@@ -192,6 +193,17 @@ class AdminIndexViewTests(AdminTestCase):
         self.assertContains(response, self.user.username)
         self.assertContains(response, self.user.username)
 
 
 
 
+class Admin404ErrorTests(AdminTestCase):
+    def test_list_search_unicode_handling(self):
+        """querystring creation handles unicode strings"""
+        test_link = '%stotally-errored/' % reverse('misago:admin:index')
+
+        response = self.client.get(test_link)
+
+        self.assertContains(
+            response, "Requested page could not be found.", status_code=404)
+
+
 class AdminGenericViewsTests(AdminTestCase):
 class AdminGenericViewsTests(AdminTestCase):
     def test_view_redirected_queryvar(self):
     def test_view_redirected_queryvar(self):
         """querystring redirected value is handled"""
         """querystring redirected value is handled"""

+ 3 - 4
misago/admin/views/errorpages.py

@@ -10,10 +10,9 @@ def _error_page(request, code, message=None):
     if is_admin_session(request):
     if is_admin_session(request):
         template_pattern = 'misago/admin/errorpages/%s.html' % code
         template_pattern = 'misago/admin/errorpages/%s.html' % code
 
 
-        response = render(request,
-                          template_pattern,
-                          {'message': message},
-                          error_page=True)
+        response = render(request, template_pattern, {
+            'message': message
+        }, error_page=True)
         response.status_code = code
         response.status_code = code
         return response
         return response
     else:
     else: