Skip to content

Commit 23e9fc8

Browse files
committed
Some followup main menu changes: harder check to not avoid access control, rename middleware
1 parent c77ee88 commit 23e9fc8

File tree

5 files changed

+18
-14
lines changed

5 files changed

+18
-14
lines changed

docs/test_doc_main_menu.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from iommi.experimental.main_menu import (
44
M,
55
MainMenu,
6-
menu_access_control_middleware,
6+
main_menu_middleware,
77
)
88
from tests.helpers import (
99
req,
@@ -21,7 +21,7 @@
2121
2222
The main menu component in iommi is used to create the main navigation for your app. This is primarily useful for SaaS or internal apps. It creates a sidebar menu with support for nested menu items, and centralized access control that automatically shows only menu items the user has access to.
2323
24-
To set up your main menu you declare it, register the `iommi.experimental.main_menu.menu_access_control_middleware` middleware, and define the `IOMMI_MAIN_MENU` setting to point to where you have defined it (like `IOMMI_MAIN_MENU = 'your_app.main_menu.main_menu'`).
24+
To set up your main menu you declare it, register the `iommi.experimental.main_menu.main_menu_middleware` middleware, and define the `IOMMI_MAIN_MENU` setting to point to where you have defined it (like `IOMMI_MAIN_MENU = 'your_app.main_menu.main_menu'`).
2525
2626
Access control is recursive, meaning that if a user does not have access to a menu item, it is automatically denied access to all subitems.
2727
"""
@@ -51,8 +51,8 @@ def test_base(settings, medium_discography):
5151
# @test
5252
settings.IOMMI_MAIN_MENU = 'docs.test_doc_main_menu.menu_declaration'
5353
settings.ROOT_URLCONF = 'docs.test_doc_main_menu'
54-
assert 'iommi.experimental.main_menu.menu_access_control_middleware' in settings.MIDDLEWARE
54+
assert 'iommi.experimental.main_menu.main_menu_middleware' in settings.MIDDLEWARE
5555

56-
response = menu_access_control_middleware(get_response=lambda request: Table(auto__model=Artist).bind(request=request).render_to_response())(req('get', url='/artists/'))
56+
response = main_menu_middleware(get_response=lambda request: Table(auto__model=Artist).bind(request=request).render_to_response())(req('get', url='/artists/'))
5757
show_output(response)
5858
# @end

examples/examples/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
'django.contrib.messages.middleware.MessageMiddleware',
8888
'django.middleware.clickjacking.XFrameOptionsMiddleware',
8989
'iommi.middleware',
90-
'iommi.experimental.main_menu.menu_access_control_middleware',
90+
'iommi.experimental.main_menu.main_menu_middleware',
9191
]
9292

9393

iommi/experimental/main_menu.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ def __init__(self, *, items=None, attrs, template=MISSING, paths=None):
7171
c._set_name(name)
7272

7373
def urlpatterns(self):
74+
if 'iommi.experimental.main_menu.main_menu_middleware' not in settings.MIDDLEWARE:
75+
# This is an explicit raise instead of an `assert` because I'm paranoid of people running Python in optimized mode with skipped asserts.
76+
raise AssertionError('To use the iommi main menu, you must add `iommi.experimental.main_menu.main_menu_middleware` to the MIDDLEWARE list.')
77+
7478
return [
7579
path(x.path, x.urlpatterns())
7680
for x in self.items.values()
@@ -380,8 +384,8 @@ def check_access(self):
380384
item.check_access()
381385

382386

383-
def menu_access_control_middleware(get_response):
384-
def menu_access_control_middleware_inner(request):
387+
def main_menu_middleware(get_response):
388+
def main_menu_middleware_inner(request):
385389
if request.resolver_match is None:
386390
request.resolver_match = get_resolver().resolve(request.path_info)
387391

@@ -395,7 +399,7 @@ def menu_access_control_middleware_inner(request):
395399
return handler403(request, exception=exception)
396400

397401
menu_fully_qualified_name = getattr(settings, 'IOMMI_MAIN_MENU', None)
398-
assert menu_fully_qualified_name is not None, "To use the menu_access_control_middleware, you must define settings.IOMMI_MAIN_MENU as a string to the full path to the main menu declaration"
402+
assert menu_fully_qualified_name is not None, "To use the main_menu_middleware, you must define settings.IOMMI_MAIN_MENU as a string to the full path to the main menu declaration"
399403
assert '.' in menu_fully_qualified_name, "IOMMI_MAIN_MENU must be in `your_module.symbol` format"
400404
menu_module_name, _, menu_symbol_name = menu_fully_qualified_name.rpartition('.')
401405

@@ -410,4 +414,4 @@ def menu_access_control_middleware_inner(request):
410414

411415
return get_response(request)
412416

413-
return menu_access_control_middleware_inner
417+
return main_menu_middleware_inner

iommi/experimental/main_menu__tests.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
EXTERNAL,
1515
M,
1616
MainMenu,
17-
menu_access_control_middleware,
17+
main_menu_middleware,
1818
path,
1919
)
2020
from iommi.path import (
@@ -186,7 +186,7 @@ def test_access(settings):
186186
settings.ROOT_URLCONF = 'iommi.experimental.main_menu__tests'
187187

188188
ok = object()
189-
inner = menu_access_control_middleware(lambda request: ok)
189+
inner = main_menu_middleware(lambda request: ok)
190190

191191
assert inner(staff_req('get', url='/foo/')) == ok
192192
assert inner(staff_req('get', url='/foo/bar/')) == ok
@@ -241,7 +241,7 @@ def decode_artist(string, **_):
241241

242242
with register_path_decoding(artist_pk=PathDecoder(decode=decode_artist, name='artist')):
243243
ok = object()
244-
inner = menu_access_control_middleware(lambda request: ok)
244+
inner = main_menu_middleware(lambda request: ok)
245245

246246
assert inner(staff_req('get', url=f'/{black_sabbath.pk}/')) == ok
247247

@@ -251,7 +251,7 @@ def decode_artist_permission_denied(**_):
251251

252252
with register_path_decoding(artist_pk=PathDecoder(decode=decode_artist_permission_denied, name='artist')):
253253
ok = object()
254-
inner = menu_access_control_middleware(lambda request: ok)
254+
inner = main_menu_middleware(lambda request: ok)
255255

256256
result = inner(staff_req('get', url=f'/{black_sabbath.pk}/'))
257257
assert isinstance(result, HttpResponseForbidden)

tests/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
IOMMI_MAIN_MENU = 'tests.main_menu.main_menu'
4545

4646
MIDDLEWARE = [
47-
'iommi.experimental.main_menu.menu_access_control_middleware',
47+
'iommi.experimental.main_menu.main_menu_middleware',
4848
'iommi.live_edit.Middleware',
4949
'iommi.sql_trace.Middleware',
5050
'django.middleware.security.SecurityMiddleware',

0 commit comments

Comments
 (0)