Skip to content

Commit 025837b

Browse files
author
Evan Borgstrom
committed
Implement child sorting. Improve tests. Fixes #34
1 parent fe7335c commit 025837b

File tree

3 files changed

+35
-23
lines changed

3 files changed

+35
-23
lines changed

menu/menu.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,10 @@ def load_menus(c):
5555
# Fetch all installed app names
5656
app_names = settings.INSTALLED_APPS
5757
if apps:
58-
app_names = [app_config.name for app_config in apps.get_app_configs()]
58+
app_names = [
59+
app_config.name
60+
for app_config in apps.get_app_configs()
61+
]
5962

6063
# loop through our INSTALLED_APPS
6164
for app in app_names:
@@ -115,7 +118,11 @@ def process(c, request, name=None):
115118
curitem.selected = True
116119

117120
def filter_visible(items):
118-
return [filter_visible_children(item) for item in items if item.visible]
121+
return [
122+
filter_visible_children(item)
123+
for item in items
124+
if item.visible
125+
]
119126

120127
def filter_visible_children(item):
121128
item.children = filter_visible(item.children)
@@ -172,7 +179,6 @@ def __init__(self, title, url, children=[], weight=1, check=None,
172179
self._title = None
173180
self.visible = visible
174181
self.children = children
175-
self.children_sorted = False
176182
self.weight = weight
177183
self.check = check
178184
self.slug = slug
@@ -204,6 +210,7 @@ def process(self, request):
204210
# evaluate children
205211
visible_children = []
206212
self.check_children(request)
213+
self.children.sort(key=lambda child: child.weight)
207214
for child in self.children:
208215
child.process(request)
209216
if child.visible:

menu/templatetags/menu.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def render(self, context):
1111
# if a 500 error happens we get an empty context, in which case
1212
# we should just return to let the 500.html template render
1313
if 'request' not in context:
14-
return ''
14+
return '<!-- menu failed to render due to missing request in the context -->'
1515

1616
menus = Menu.process(context['request'])
1717

menu/tests/test_menu.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@
1010
class MenuTests(TestCase):
1111
def setUp(self):
1212
kids2 = [
13-
MenuItem("kids2-1", "/parent2/kids2-1"),
13+
MenuItem("kids2-1", "/parent2/kids2-1", weight=999),
1414
MenuItem("kids2-2", "/kids2-2")
1515
]
1616
kids3 = [
1717
MenuItem("kids3-1", "/parent3/kids3-1", children=[
1818
MenuItem("kids3-1-1", "/parent3/kids3-1/kid1")
19-
])
19+
]),
20+
MenuItem("kids3-2", "/parent3/kids3-2")
2021
]
2122

2223
Menu.items = {}
2324
Menu.sorted = {}
2425
Menu.loaded = False
25-
Menu.add_item("test", MenuItem("Parent 1", "/parent1"))
26+
Menu.add_item("test", MenuItem("Parent 1", "/parent1", weight=999))
2627
Menu.add_item("test", MenuItem("Parent 2", "/parent2", children=kids2))
2728
Menu.add_item("test", MenuItem("Parent 3", "/parent3", children=kids3))
2829

@@ -32,54 +33,58 @@ def test_select_parents(self):
3233
"""
3334
Ensure the MENU_SELECT_PARENTS setting works
3435
"""
36+
settings.MENU_SELECT_PARENTS = False
3537
request = self.factory.get('/parent2/kids2-1')
3638
Menu.process(request, 'test')
37-
self.assertEqual(Menu.items['test'][1].selected, True)
38-
self.assertEqual(Menu.items['test'][2].selected, False)
39-
self.assertEqual(Menu.items['test'][1].children[0].selected, True)
39+
self.assertEqual(Menu.items['test'][0].selected, True)
40+
self.assertEqual(Menu.items['test'][1].selected, False)
41+
self.assertEqual(Menu.items['test'][0].children[1].selected, True)
4042

4143
request = self.factory.get('/kids2-2')
4244
Menu.process(request, 'test')
45+
self.assertEqual(Menu.items['test'][0].selected, False)
4346
self.assertEqual(Menu.items['test'][1].selected, False)
44-
self.assertEqual(Menu.items['test'][2].selected, False)
45-
self.assertEqual(Menu.items['test'][1].children[1].selected, True)
47+
self.assertEqual(Menu.items['test'][0].children[0].selected, True)
4648

4749
settings.MENU_SELECT_PARENTS = True
4850
request = self.factory.get('/kids2-2')
4951
Menu.process(request, 'test')
50-
self.assertEqual(Menu.items['test'][1].selected, True)
51-
self.assertEqual(Menu.items['test'][2].selected, False)
52-
self.assertEqual(Menu.items['test'][1].children[1].selected, True)
52+
self.assertEqual(Menu.items['test'][0].selected, True)
53+
self.assertEqual(Menu.items['test'][1].selected, False)
54+
self.assertEqual(Menu.items['test'][0].children[0].selected, True)
5355

54-
settings.MENU_SELECT_PARENTS = True
5556
request = self.factory.get('/parent3/kids3-1/kid1')
5657
Menu.process(request, 'test')
5758
self.assertEqual(Menu.items['test'][0].selected, False)
58-
self.assertEqual(Menu.items['test'][1].selected, False)
59+
self.assertEqual(Menu.items['test'][0].children[1].selected, False)
60+
self.assertEqual(Menu.items['test'][1].selected, True)
61+
self.assertEqual(Menu.items['test'][1].children[0].selected, True)
62+
self.assertEqual(Menu.items['test'][1].children[0].children[0].selected, True)
5963
self.assertEqual(Menu.items['test'][1].children[1].selected, False)
60-
self.assertEqual(Menu.items['test'][2].selected, True)
61-
self.assertEqual(Menu.items['test'][2].children[0].selected, True)
62-
self.assertEqual(Menu.items['test'][2].children[0].children[0].selected, True)
64+
self.assertEqual(Menu.items['test'][2].selected, False)
6365

6466
def test_template_tag(self):
6567
"""
6668
Ensure the templating works
6769
"""
68-
request = self.factory.get('/parent2/kids2-1')
70+
request = self.factory.get('/parent3/kids3-1')
6971
out = Template(
7072
"{% load menu %}"
7173
"{% generate_menu %}"
7274
"{% for item in menus.test %}"
7375
"{{ item.title }},"
7476
"{% for child in item.children %}"
7577
"{{ child.title }},"
78+
"{% for grandchild in child.children %}"
79+
"{{ grandchild.title }},"
80+
"{% endfor %}"
7681
"{% endfor %}"
7782
"{% endfor %}"
7883
).render(Context({
7984
'request': request,
8085
}))
8186

82-
self.assertEqual(out, "Parent 1,Parent 2,kids2-1,kids2-2,Parent 3,kids3-1,")
87+
self.assertEqual(out, "Parent 2,kids2-2,kids2-1,Parent 3,kids3-1,kids3-1-1,kids3-2,Parent 1,")
8388

8489
def test_template_tag_missing_attribute(self):
8590
"""
@@ -96,7 +101,7 @@ def test_template_tag_missing_attribute(self):
96101
'request': request,
97102
}))
98103

99-
self.assertEqual(out, "Parent 1,Parent 2,Parent 3,")
104+
self.assertEqual(out, "Parent 2,Parent 3,Parent 1,")
100105

101106
class MenuItemTests(TestCase):
102107
def test_kwargs(self):

0 commit comments

Comments
 (0)