Skip to content

Commit

Permalink
menu: new custom url parameter
Browse files Browse the repository at this point in the history
* NEW Adds the `external_url` parameter to MenuEntryMixin's `register`
  function, allowing menu items with external urls not tied to
  an endpoint.

Reviewed-by: Jiri Kuncar <jiri.kuncar@cern.ch>
Signed-off-by: Øystein Blixhavn <oystein@blixhavn.no>
  • Loading branch information
blixhavn authored and jirikuncar committed Dec 2, 2016
1 parent 82a65e8 commit ed7a6d8
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 4 deletions.
17 changes: 13 additions & 4 deletions flask_menu/__init__.py
Expand Up @@ -80,6 +80,7 @@ def __init__(self, name, parent):
self._endpoint = None
self._text = None
self._order = 0
self._external_url = None
self._endpoint_arguments_constructor = None
self._dynamic_list_constructor = None
self._visible_when = CONDITION_TRUE
Expand All @@ -93,17 +94,25 @@ def _active_when(self):
matching_completpath = request.path == self.url
return matching_endpoint or matching_subpath or matching_completpath

def register(self, endpoint, text, order=0,
def register(self, endpoint=None, text=None, order=0, external_url=None,
endpoint_arguments_constructor=None,
dynamic_list_constructor=None,
active_when=None,
visible_when=None,
expected_args=None,
**kwargs):
"""Assign endpoint and display values."""
"""Assign endpoint and display values.
.. versionadded:: 0.6.0
The *external_url* parameter is mutually exclusive with *endpoint*.
"""
if endpoint is not None and external_url is not None:
raise TypeError('Exclusive arguments endpoint and external_url.')

self._endpoint = endpoint
self._text = text
self._text = text or self.name
self._order = order
self._external_url = external_url
self._expected_args = expected_args or []
self._endpoint_arguments_constructor = endpoint_arguments_constructor
self._dynamic_list_constructor = dynamic_list_constructor
Expand Down Expand Up @@ -237,7 +246,7 @@ def text(self):
def url(self):
"""Generate url from given endpoint and optional dynamic arguments."""
if not self._endpoint:
return '#'
return self._external_url or '#'

if self._endpoint_arguments_constructor:
return url_for(self._endpoint,
Expand Down
16 changes: 16 additions & 0 deletions tests/test_core.py
Expand Up @@ -394,6 +394,22 @@ def test():
with self.app.test_client() as c:
self.assertRaises(RuntimeError, c.get, '/test')

def test_external_url(self):
"""Test that external_url works, and is not overriding endpoint."""
Menu(self.app)
menu = self.app.extensions['menu']

url = 'https://python.org'

item1 = menu.submenu('menuitem1')

# Do not allow endpoint and external_url at the same time.
self.assertRaises(TypeError, item1.register, endpoint='test',
text='Test', external_url=url)

item1.register(text='Test', external_url=url)
assert menu.submenu('menuitem1').url == url

def test_double_instantiation(self):
Menu(self.app)
self.assertRaises(RuntimeError, Menu, self.app)
Expand Down

0 comments on commit ed7a6d8

Please sign in to comment.