Skip to content

Commit 5d71abf

Browse files
committed
Merge pull request #43 from borgstrom/custom-checks
Allow custom complex checks to be implement via a subclass
2 parents ca3d93e + d7d2788 commit 5d71abf

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

menu/menu.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ def is_child_selected(item):
145145

146146
class MenuItem(object):
147147
"""
148-
MenuItem represents an item in a menu, possibly one that has a sub-
149-
menu (children).
148+
MenuItem represents an item in a menu, possibly one that has a sub-menu (children).
150149
"""
151150

152151
def __init__(self, title, url, children=[], weight=1, check=None,
@@ -176,7 +175,7 @@ def __init__(self, title, url, children=[], weight=1, check=None,
176175
self.visible = visible
177176
self.children = children
178177
self.weight = weight
179-
self.check = check
178+
self.check_func = check
180179
self.slug = slug
181180
self.exact_url = exact_url
182181
self.selected = False
@@ -186,15 +185,19 @@ def __init__(self, title, url, children=[], weight=1, check=None,
186185
for k in kwargs:
187186
setattr(self, k, kwargs[k])
188187

188+
def check(self, request):
189+
"""
190+
Evaluate if we should be visible for this request
191+
"""
192+
if callable(self.check_func):
193+
self.visible = self.check_func(request)
194+
189195
def process(self, request):
190196
"""
191197
process determines if this item should visible, if its selected, etc...
192198
"""
193-
# evaluate our check
194-
if callable(self.check):
195-
self.visible = self.check(request)
196-
197199
# if we're not visible we return since we don't need to do anymore processing
200+
self.check(request)
198201
if not self.visible:
199202
return
200203

menu/tests/test_menu.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@
1717

1818
# XXX TODO: test MENU_HIDE_EMPTY
1919

20+
21+
class CustomMenuItem(MenuItem):
22+
"""
23+
Custom MenuItem subclass with custom check logic
24+
"""
25+
def check(self, request):
26+
"""
27+
We should be visible unless the request path ends with "foo"
28+
"""
29+
self.visible = not request.path.endswith("foo")
30+
31+
2032
class MenuTests(TestCase):
2133
"""
2234
Tests for Menu
@@ -59,8 +71,8 @@ def kids3_1(request):
5971
]
6072

6173
kids3 = (
62-
MenuItem("kids3-1", "/parent3/kids3-1", children=kids3_1, slug="salty"),
63-
MenuItem(kids3_2_title, "/parent3/kids3-2")
74+
CustomMenuItem("kids3-1", "/parent3/kids3-1", children=kids3_1, slug="salty"),
75+
CustomMenuItem(kids3_2_title, "/parent3/kids3-2")
6476
)
6577

6678
Menu.items = {}
@@ -75,6 +87,18 @@ def kids3_1(request):
7587

7688
self.factory = RequestFactory()
7789

90+
def test_custom_menuitem(self):
91+
"""
92+
Ensure our custom check on our custom MenuItem works
93+
"""
94+
request = self.factory.get('/parent3/kids3-1')
95+
items = Menu.process(request, 'test')
96+
self.assertEqual(len(items[1].children), 2)
97+
98+
request = self.factory.get('/parent3/kids3-1/foo')
99+
items = Menu.process(request, 'test')
100+
self.assertEqual(len(items[1].children), 0)
101+
78102
def test_thread_safety_and_checks(self):
79103
"""
80104
Ensure our thread safety works, this also ensures our checks work

0 commit comments

Comments
 (0)