def test_ordering_unordered_sort_stable(self): group = menus.MenuGroup('menu', 'Menu') menus.MenuItem('a', 'A', group=group, can_view=can_view) menus.MenuItem('b', 'B', group=group, can_view=can_view) menus.MenuItem('c', 'C', group=group, can_view=can_view) menus.MenuItem('d', 'D', group=group, can_view=can_view) self._assert_name_order(group, ['a', 'b', 'c', 'd'])
def test_explicit_placements(self): group = menus.MenuGroup('menu', 'Menu') menus.MenuItem('a', 'A', group=group, can_view=can_view, placement=5000) menus.MenuItem('b', 'B', group=group, can_view=can_view, placement=3000) menus.MenuItem('c', 'C', group=group, can_view=can_view, placement=1000) menus.MenuItem('d', 'D', group=group, can_view=can_view, placement=4000) menus.MenuItem('e', 'E', group=group, can_view=can_view, placement=2000) self._assert_name_order(group, ['c', 'e', 'b', 'd', 'a'])
def test_force_multiple_first(self): group = menus.MenuGroup('menu', 'Menu') menus.MenuItem('a', 'A', group=group, can_view=can_view, placement=0) menus.MenuItem('b', 'B', group=group, can_view=can_view) menus.MenuItem('c', 'C', group=group, can_view=can_view) menus.MenuItem('d', 'D', group=group, can_view=can_view) menus.MenuItem('e', 'E', group=group, can_view=can_view, placement=0) self._assert_name_order(group, ['a', 'e', 'b', 'c', 'd'])
def test_force_last(self): group = menus.MenuGroup('menu', 'Menu') menus.MenuItem('e', 'E', group=group, can_view=can_view, placement=float('inf')) menus.MenuItem('a', 'A', group=group, can_view=can_view) menus.MenuItem('b', 'B', group=group, can_view=can_view) menus.MenuItem('c', 'C', group=group, can_view=can_view) menus.MenuItem('d', 'D', group=group, can_view=can_view) self._assert_name_order(group, ['a', 'b', 'c', 'd', 'e'])
def install_courses_menu_item(cls): menu_item = menus.MenuItem( 'courses', 'Courses', action='courses', can_view=admin_action_can_view('courses'), href="{}?action=courses".format(cls.LINK_URL)) dashboard.DashboardHandler.register_courses_menu_item(menu_item)
def add_sub_nav_mapping(cls, group_name, item_name, title, action=None, contents=None, can_view=None, href=None, **kwargs): """Create a second level nav item. Args: group_name: Name of an existing top level nav item to use as the parent item_name: A unique key for this item title: Human-readable label action: A unique operation ID for contents: A handler which will be added as a custom get-action on DashboardHandler """ group = cls.root_menu_group.get_child(group_name) if group is None: logging.critical('The group %s does not exist', group_name) return item = group.get_child(item_name) if item: logging.critical( 'There is already a sub-menu item named "%s" registered in ' 'group %s.', item_name, group_name) return if contents: action = action or group_name + '_' + item_name if action and not href: href = "dashboard?action={}".format(action) def combined_can_view(app_context): if action and not cls.has_action_permission(app_context, action): return False if can_view and not can_view(app_context): return False return True item = menus.MenuItem(item_name, title, action=action, group=group, can_view=combined_can_view, href=href, **kwargs) cls.actions_to_menu_items[action] = item if contents: cls.add_custom_get_action(action, handler=contents)
def make_help_menu(root_group): anyone_can_view = lambda x: True group = menus.MenuGroup('help', 'Help', group=root_group, placement=6000) menus.MenuItem( 'documentation', 'Documentation', href='https://www.google.com/edu/openonline/tech/index.html', can_view=anyone_can_view, group=group, placement=1000, target='_blank') menus.MenuItem( 'videos', 'Demo videos', href='https://www.youtube.com/playlist?list=PLFB_aGY5EfxeltJfJZwkjqDLAW' 'dMfSpES', can_view=anyone_can_view, group=group, placement=2000, target='_blank') menus.MenuItem('showcase', 'Showcase courses', href='https://www.google.com/edu/openonline/index.html', can_view=anyone_can_view, group=group, placement=3000, target='_blank') menus.MenuItem( 'forum', 'Support forum', href=('https://groups.google.com/forum/?fromgroups#!categories/' 'course-builder-forum/general-troubleshooting'), can_view=anyone_can_view, group=group, placement=4000, target='_blank')
def bind(key, label, handler, href=None): if href: target = '_blank' else: target = None href = "{}?action={}".format(cls.LINK_URL, key) def can_view(app_context): return can_view_admin_action(key) menu_item = menus.MenuItem( key, label, action=key, can_view=can_view, group=group, href=href, target=target) if handler: cls.get_actions.append(key) cls.actions_to_menu_items[key] = menu_item
def add_sub_nav_mapping( cls, group_name, item_name, title, action=None, contents=None, can_view=None, href=None, no_app_context=False, sub_group_name=None, **kwargs): """Create a second level nav item. Args: group_name: Name of an existing top level nav item to use as the parent item_name: A unique key for this item title: Human-readable label action: A unique operation ID for contents: A handler which will be added as a custom get-action on DashboardHandler can_view: Pass a boolean function here if your handler has additional permissions logic in it that the dashboard does not check for you. You must additionally check it in your handler. sub_group_name: The sub groups 'pinned', 'default', and 'advanced' exist in that order and 'default' is used by default. You can pass some other string to create a new group at the end. other arguments: see common/menus.py """ group = cls.root_menu_group.get_child(group_name) if group is None: logging.critical('The group %s does not exist', group_name) return if sub_group_name is None: sub_group_name = 'default' sub_group = group.get_child(sub_group_name) if not sub_group: sub_group = menus.MenuGroup( sub_group_name, None, group=group) item = sub_group.get_child(item_name) if item: logging.critical( 'There is already a sub-menu item named "%s" registered in ' 'group %s subgroup %s.', item_name, group_name, sub_group_name) return if contents: action = action or group_name + '_' + item_name if action and not href: href = "dashboard?action={}".format(action) def combined_can_view(app_context): if action: # Current design disallows actions at the global level. # This might change in the future. if not app_context and not no_app_context: return False # Check permissions in the dashboard if not cls.can_view(action): return False # Additional custom visibility check if can_view and not can_view(app_context): return False return True item = menus.MenuItem( item_name, title, action=action, group=sub_group, can_view=combined_can_view, href=href, **kwargs) cls.actions_to_menu_items[action] = item if contents: cls.add_custom_get_action(action, handler=contents)