diff --git a/allianceauth/menu/templatetags/menu_menu_items.py b/allianceauth/menu/templatetags/menu_menu_items.py index 8cc7af5d..fbbd22a1 100644 --- a/allianceauth/menu/templatetags/menu_menu_items.py +++ b/allianceauth/menu/templatetags/menu_menu_items.py @@ -98,6 +98,10 @@ def render_menu(request: HttpRequest) -> List[RenderedMenuItem]: if item.is_app_item: rendered_item = _render_app_item(request, hook_items, item, bs5_template) + if rendered_item.html == "": + # If there is no content dont render it. + # This item has probably been hidden by permissions + continue elif item.is_link_item: rendered_item = _render_link_item(request, item, bs5_template) elif item.is_folder: diff --git a/allianceauth/menu/tests/factories.py b/allianceauth/menu/tests/factories.py index 9e7351be..93a5ffe3 100644 --- a/allianceauth/menu/tests/factories.py +++ b/allianceauth/menu/tests/factories.py @@ -19,6 +19,11 @@ def create_user(permissions=None, **kwargs) -> User: return user +def create_menu_item_hook_class(**kwargs) -> MenuItemHook: + num = next(counter_menu_item_hook) + return type(f"GeneratedMenuItem{num}", (MenuItemHook,), {}) + + def create_menu_item_hook(**kwargs) -> MenuItemHook: num = next(counter_menu_item_hook) new_class = type(f"GeneratedMenuItem{num}", (MenuItemHook,), {}) diff --git a/allianceauth/menu/tests/templatetags/test_menu_menu_items.py b/allianceauth/menu/tests/templatetags/test_menu_menu_items.py index 99363211..3e3e829a 100644 --- a/allianceauth/menu/tests/templatetags/test_menu_menu_items.py +++ b/allianceauth/menu/tests/templatetags/test_menu_menu_items.py @@ -14,6 +14,7 @@ from allianceauth.menu.tests.factories import ( create_folder_menu_item, create_link_menu_item, create_menu_item_from_hook, + create_menu_item_hook_class, create_menu_item_hook_function, create_rendered_menu_item, ) @@ -177,6 +178,44 @@ class TestRenderDefaultMenu(TestCase): self.assertEqual(menu[0].menu_item.text, "Alpha") self.assertEqual(menu[1].menu_item.text, "Bravo") + def test_should_remove_empty_folders_with_items_hidden(self, mock_get_hooks): + # given + + class TestHook(create_menu_item_hook_class()): + text = "Dummy App No Data" + classes = "fa-solid fa-users-gear" + url_name = "groupmanagement:management" + + def render(Self, request): + # simulate no perms + return "" + + params = { + "text": "Alpha", + "classes": "fa-solid fa-users-gear", + "url_name": "groupmanagement:management", + } + + alpha = TestHook(**params) + + hooks = [lambda: alpha] + + mock_get_hooks.return_value = hooks + + folder = create_folder_menu_item(text="Folder", order=2) + create_menu_item_from_hook(hooks[0], parent=folder) + create_link_menu_item(text="Bravo", order=3) # this is all that should show + + request = self.factory.get("/") + + # when + result = render_menu(request) + + # then + menu = list(result) + self.assertEqual(len(menu), 1) + self.assertEqual(menu[0].menu_item.text, "Bravo") + def test_should_not_include_hidden_items(self, mock_get_hooks): # given mock_get_hooks.return_value = [] @@ -196,7 +235,6 @@ class TestRenderDefaultMenu(TestCase): self.assertEqual(menu[1].menu_item.text, "Charlie") def test_should_not_render_hidden_folders(self, mock_get_hooks): - # given # given menu = [ create_menu_item_hook_function(text="Charlie", count=42),