Skip to content

Commit 871bde5

Browse files
committed
MainMenu: add extra+extra_evaluate
1 parent 3122b0b commit 871bde5

2 files changed

Lines changed: 70 additions & 1 deletion

File tree

iommi/experimental/main_menu.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,16 @@ class MainMenu:
6262
items=EMPTY,
6363
attrs__style=EMPTY,
6464
attrs__class=EMPTY,
65+
extra=EMPTY,
66+
extra_evaluated=EMPTY,
6567
)
66-
def __init__(self, *, items=None, attrs, template=MISSING, paths=None):
68+
def __init__(self, *, items=None, attrs, template=MISSING, paths=None, extra, extra_evaluated):
6769
self.items = items
6870
self.attrs = attrs
6971
self.template = template
7072
self.paths = paths or []
73+
self.extra = extra
74+
self.extra_evaluated = extra_evaluated
7175
for name, c in self.items.items():
7276
c.parent = self
7377
c._set_name(name)
@@ -178,6 +182,14 @@ def __html__(self):
178182
def render_items(self):
179183
return format_html('{}' * len(self.items), *[x.__html__() for x in self.items.values()])
180184

185+
@property
186+
def extra(self):
187+
return self.main_menu.extra
188+
189+
@cached_property
190+
def extra_evaluated(self):
191+
return Struct(evaluate_as_needed(self.main_menu.extra_evaluated or {}, self._own_evaluate_parameters))
192+
181193
def __repr__(self):
182194
return '<BoundMainMenu>'
183195

@@ -337,6 +349,7 @@ def own_evaluate_parameters(self):
337349
'request': request,
338350
'user': request.user if request else None,
339351
'item': self,
352+
'main_menu': self.root,
340353
**getattr(request, 'iommi_view_params', {}),
341354
}
342355

iommi/experimental/main_menu__tests.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,3 +301,59 @@ def test_m_url_error_case():
301301
).urlpatterns()
302302

303303
assert str(e.value) == "External links can't have subitems"
304+
305+
306+
def test_m_extra():
307+
menu = MainMenu(
308+
items=dict(
309+
foo=M(
310+
view=EXTERNAL,
311+
url=lambda item, **_: item.extra.url,
312+
extra__url='https://example.com',
313+
),
314+
),
315+
).bind(request=req('get'))
316+
317+
assert 'https://example.com' in str(menu)
318+
319+
320+
def test_m_extra_evaluated():
321+
menu = MainMenu(
322+
items=dict(
323+
foo=M(
324+
view=EXTERNAL,
325+
url=lambda item, **_: item.extra_evaluated.url,
326+
extra_evaluated__url=lambda **_: 'https://example.com',
327+
),
328+
),
329+
).bind(request=req('get'))
330+
331+
assert 'https://example.com' in str(menu)
332+
333+
334+
def test_main_menu_extra():
335+
menu = MainMenu(
336+
extra__url='https://example.com',
337+
items=dict(
338+
foo=M(
339+
view=EXTERNAL,
340+
url=lambda main_menu, **_: main_menu.extra.url,
341+
),
342+
),
343+
).bind(request=req('get'))
344+
345+
assert 'https://example.com' in str(menu)
346+
347+
348+
def test_main_menu_extra_evaluated():
349+
menu = MainMenu(
350+
extra_evaluated__url=lambda **_: 'https://example.com',
351+
items=dict(
352+
foo=M(
353+
view=EXTERNAL,
354+
url=lambda main_menu, **_: main_menu.extra_evaluated.url,
355+
),
356+
),
357+
).bind(request=req('get'))
358+
359+
assert 'https://example.com' in str(menu)

0 commit comments

Comments
 (0)