Add support to conditionally disable menus.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2018-08-22 02:23:11 -04:00
parent dfd2d3dc78
commit 66cf86e816
2 changed files with 26 additions and 11 deletions

View File

@@ -75,6 +75,7 @@
user to view an index instance as opposed to the current
permission which allows viewing an index definiton on the
setup menu.
- Add support to conditionally disable menus.
3.0.1 (2018-07-08)
=================

View File

@@ -77,10 +77,11 @@ class Menu(object):
def remove(cls, name):
del cls._registry[name]
def __init__(self, name, icon=None, icon_class=None, label=None):
def __init__(self, name, condition=None, icon=None, icon_class=None, label=None):
if name in self.__class__._registry:
raise Exception('A menu with this name already exists')
self.condition = condition
self.icon = icon
self.icon_class = icon_class
self.name = name
@@ -97,6 +98,16 @@ class Menu(object):
source_links.append(link)
self.link_positions[link] = position
def check_condition(self, context):
"""
Check to see if menu has a conditional display function and return
the result of the condition function against the context.
"""
if self.condition:
return self.condition(context=context)
else:
return True
def bind_links(self, links, sources=None, position=None):
"""
Associate a link to a model, a view inside this menu
@@ -140,6 +151,9 @@ class Menu(object):
return resolved_navigation_object_list
def resolve(self, context, source=None):
if not self.check_condition(context=context):
return []
result = []
try:
@@ -217,9 +231,9 @@ class Menu(object):
# Main menu links
for link in self.bound_links.get(None, []):
if isinstance(link, Menu):
resolved_link = link
if resolved_link not in self.unbound_links.get(None, ()):
resolved_links.append(resolved_link)
condition = link.check_condition(context=context)
if condition and link not in self.unbound_links.get(None, ()):
resolved_links.append(link)
else:
# "Always show" links
resolved_link = link.resolve(context=context)
@@ -282,6 +296,13 @@ class Link(object):
self.url = url
def resolve(self, context, resolved_object=None):
# Check to see if link has conditional display function and only
# display it if the result of the conditional display function is
# True
if self.condition:
if not self.condition(context):
return None
AccessControlList = apps.get_model(
app_label='acls', model_name='AccessControlList'
)
@@ -320,13 +341,6 @@ class Link(object):
except PermissionDenied:
return None
# Check to see if link has conditional display function and only
# display it if the result of the conditional display function is
# True
if self.condition:
if not self.condition(context):
return None
resolved_link = ResolvedLink(current_view=current_view, link=self)
if self.view: