Skip to content

Commit

Permalink
Merge 6c1b36d into fd1feb9
Browse files Browse the repository at this point in the history
  • Loading branch information
fredkingham committed Jul 18, 2018
2 parents fd1feb9 + 6c1b36d commit 780f03f
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 5 deletions.
4 changes: 4 additions & 0 deletions changelog.md
Expand Up @@ -4,6 +4,10 @@

* Adds a method `.demographics()` to `opal.models.Patient` which returns the relevant demographics instance.

* Adds a `for_user` method on to the menu item. This method
takes a user and by default returns True. Override this
to decide if a menu item should be shown in the nav bar.

### 0.11.2 (Bugfix Release)

Includes referencedata JSON files in Manifest.
Expand Down
9 changes: 7 additions & 2 deletions doc/docs/reference/core_menus.md
Expand Up @@ -2,7 +2,7 @@

Opal provides classes and methods to define application menus programatically.

## opal.core.MenuItem
### opal.core.MenuItem

An item in an application menu.

Expand All @@ -15,7 +15,12 @@ An item in an application menu.
* display - the text to display in this menu item
* index - a number to use as the primary sort order for your menu items

## opal.core.Menu
**Methods**

#### for_user
A method that takes a user and returns True by default. Override this if you want menu items hidden for certain users.

### opal.core.Menu

The menu for an Opal application. On initialization it will construct a menu
for the current user, pulling items from the current app, and any plugins.
9 changes: 7 additions & 2 deletions opal/core/menus.py
Expand Up @@ -33,6 +33,9 @@ def __ne__(self, other):

return not self == other

def for_user(self, user):
return True


class Menu(object):

Expand All @@ -48,11 +51,13 @@ def __init__(self, user=None):
# Which is suboptimal.
app_items = app.get_menu_items(user=self.user)
for item in app_items:
self.items.append(item)
if item.for_user(user):
self.items.append(item)

for plugin in plugins.OpalPlugin.list():
for item in plugin.menuitems:
self.items.append(item)
if item.for_user(user):
self.items.append(item)

def __iter__(self):

Expand Down
32 changes: 31 additions & 1 deletion opal/tests/test_core_menus.py
Expand Up @@ -42,6 +42,10 @@ def test_repr(self):
item = menus.MenuItem(href="/wat/")
self.assertEqual("<Opal MenuItem href: '/wat/'>", item.__repr__())

def test_for_user(self):
item = menus.MenuItem(href="/wat/")
self.assertTrue(item.for_user(self.user))

def test_equality(self):
item1 = menus.MenuItem(
template_name='menu.html',
Expand Down Expand Up @@ -88,7 +92,6 @@ def test_equality(self):
@patch('opal.core.plugins.OpalPlugin.list')
@patch('opal.core.application.get_app')
class MenuTestCase(OpalTestCase):

def setUp(self):
self.app = MagicMock(name='App')
self.app.get_menu_items.return_value = []
Expand All @@ -107,6 +110,19 @@ def test_sets_items_from_app(self, get_app, plugin_list):
menu = menus.Menu(user=self.user)
self.assertEqual(menu_items, menu.items)

def test_excludes_items_from_app_if_for_user_is_false(
self, get_app, plugin_list
):
get_app.return_value = self.app
plugin_list.return_value = []
menu_item = menus.MenuItem()
menu_items = [menu_item]
self.app.get_menu_items.return_value = menu_items
with patch.object(menu_item, "for_user") as for_user:
for_user.return_value = False
menu = menus.Menu(user=self.user)
self.assertEqual([], menu.items)

def test_sets_items_from_plugin(self, get_app, plugin_list):
get_app.return_value = self.app
menu_items = [menus.MenuItem()]
Expand All @@ -116,6 +132,20 @@ def test_sets_items_from_plugin(self, get_app, plugin_list):
menu = menus.Menu(user=self.user)
self.assertEqual(menu_items, menu.items)

def test_excludes_items_from_plugin_if_for_user_is_false(
self, get_app, plugin_list
):
get_app.return_value = self.app
menu_item = menus.MenuItem()
menu_items = [menu_item]
mock_plugin = MagicMock(name='Plugin')
mock_plugin.menuitems = menu_items
plugin_list.return_value = [mock_plugin]
with patch.object(menu_item, "for_user") as for_user:
for_user.return_value = False
menu = menus.Menu(user=self.user)
self.assertEqual([], menu.items)

def test_iter_sorts(self, get_app, plugin_list):
get_app.return_value = self.app
plugin_list.return_value = []
Expand Down

0 comments on commit 780f03f

Please sign in to comment.