From 0efbf79fa18bb35407b0c71013810489c2f44b04 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 9 Aug 2017 01:36:43 -0400 Subject: [PATCH] Add support for unbinding sub-menus. Signed-off-by: Roberto Rosario --- HISTORY.rst | 1 + mayan/apps/navigation/classes.py | 7 ++- mayan/apps/navigation/tests/literals.py | 9 ++++ mayan/apps/navigation/tests/test_classes.py | 59 ++++++++++++++++++--- 4 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 mayan/apps/navigation/tests/literals.py diff --git a/HISTORY.rst b/HISTORY.rst index 701b5eb336..e352abf33c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -14,6 +14,7 @@ - Allow changing the output format, DPI of the pdftoppm command, and the output format of the converter via the CONVERTER_GRAPHICS_BACKEND_CONFIG setting. GitHub issues #256 #257 GitLab issue #416. +- Add support for unbinding sub menus. 2.6.4 (2017-07-26) ================== diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index 7d444937b8..5d52fcbd8a 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -61,6 +61,10 @@ class Menu(object): def get(cls, name): return cls._registry[name] + @classmethod + def reset(cls): + cls._registry={} + def __init__(self, name, icon=None, label=None): if name in self.__class__._registry: raise Exception('A menu with this name already exists') @@ -196,7 +200,8 @@ class Menu(object): for link in self.bound_links.get(None, []): if isinstance(link, Menu): resolved_link = link - resolved_links.append(resolved_link) + if resolved_link not in self.unbound_links.get(None, ()): + resolved_links.append(resolved_link) else: # "Always show" links resolved_link = link.resolve(context=context) diff --git a/mayan/apps/navigation/tests/literals.py b/mayan/apps/navigation/tests/literals.py new file mode 100644 index 0000000000..8c4594aadc --- /dev/null +++ b/mayan/apps/navigation/tests/literals.py @@ -0,0 +1,9 @@ +from __future__ import unicode_literals + +TEST_PERMISSION_NAMESPACE_NAME = 'test namespace name' +TEST_PERMISSION_NAMESPACE_TEXT = 'test namespace text' +TEST_PERMISSION_NAME = 'test permission name' +TEST_PERMISSION_LABEL = 'test permission label' +TEST_LINK_TEXT = 'test link text' +TEST_MENU_NAME = 'menu test' +TEST_SUBMENU_NAME = 'submenu test' diff --git a/mayan/apps/navigation/tests/test_classes.py b/mayan/apps/navigation/tests/test_classes.py index 7a0932b093..cc6eee5586 100644 --- a/mayan/apps/navigation/tests/test_classes.py +++ b/mayan/apps/navigation/tests/test_classes.py @@ -9,13 +9,13 @@ from common.tests.test_views import GenericViewTestCase from permissions import Permission, PermissionNamespace from user_management.tests import TEST_USER_PASSWORD, TEST_USER_USERNAME -from ..classes import Link +from ..classes import Link, Menu -TEST_PERMISSION_NAMESPACE_NAME = 'test namespace name' -TEST_PERMISSION_NAMESPACE_TEXT = 'test namespace text' -TEST_PERMISSION_NAME = 'test permission name' -TEST_PERMISSION_LABEL = 'test permission label' -TEST_LINK_TEXT = 'test link text' +from .literals import ( + TEST_PERMISSION_NAMESPACE_NAME, TEST_PERMISSION_NAMESPACE_TEXT, + TEST_PERMISSION_NAME, TEST_PERMISSION_LABEL, TEST_LINK_TEXT, + TEST_MENU_NAME, TEST_SUBMENU_NAME +) class LinkClassTestCase(GenericViewTestCase): @@ -105,3 +105,50 @@ class LinkClassTestCase(GenericViewTestCase): self.assertNotEqual(resolved_link, None) self.assertEqual(resolved_link.url, reverse(TEST_VIEW_NAME)) + + +class MenuClassTestCase(GenericViewTestCase): + def setUp(self): + super(MenuClassTestCase, self).setUp() + + self.add_test_view(test_object=self.group) + + self.namespace = PermissionNamespace( + TEST_PERMISSION_NAMESPACE_NAME, TEST_PERMISSION_NAMESPACE_TEXT + ) + + self.permission = self.namespace.add_permission( + name=TEST_PERMISSION_NAME, label=TEST_PERMISSION_LABEL + ) + + Menu.reset() + self.menu = Menu(name=TEST_MENU_NAME) + self.sub_menu = Menu(name=TEST_SUBMENU_NAME) + self.link = Link(text=TEST_LINK_TEXT, view=TEST_VIEW_NAME) + Permission.invalidate_cache() + + def test_null_source_link_unbinding(self): + self.menu.bind_links(links=(self.link,)) + + response = self.get(TEST_VIEW_NAME) + context = Context({'request': response.wsgi_request}) + + self.assertEqual( + self.menu.resolve(context=context)[0][0].link, self.link + ) + + self.menu.unbind_links(links=(self.link,)) + + self.assertEqual(self.menu.resolve(context=context), []) + + def test_null_source_submenu_unbinding(self): + self.menu.bind_links(links=(self.sub_menu,)) + + response = self.get(TEST_VIEW_NAME) + context = Context({'request': response.wsgi_request}) + + self.assertEqual(self.menu.resolve(context=context), [[self.sub_menu]]) + + self.menu.unbind_links(links=(self.sub_menu,)) + + self.assertEqual(self.menu.resolve(context=context), [])