diff --git a/mayan/apps/authentication/apps.py b/mayan/apps/authentication/apps.py index 6ab845be61..0253005507 100644 --- a/mayan/apps/authentication/apps.py +++ b/mayan/apps/authentication/apps.py @@ -21,8 +21,7 @@ class AuthenticationApp(MayanAppConfig): menu_secondary.bind_links( links=( link_password_change, link_logout - ), - sources=( + ), position=99, sources=( 'common:current_user_details', 'common:current_user_edit', 'common:current_user_locale_profile_details', 'common:current_user_locale_profile_edit', diff --git a/mayan/apps/common/apps.py b/mayan/apps/common/apps.py index 9a1f26f491..12c9d72506 100644 --- a/mayan/apps/common/apps.py +++ b/mayan/apps/common/apps.py @@ -1051,7 +1051,6 @@ THE SOFTWARE. 'common:tools_list' ) ) - menu_main.bind_links(links=(link_about,), position=-1) menu_facet.bind_links( links=(link_about, link_license, link_packages_licenses), sources=( @@ -1059,6 +1058,7 @@ THE SOFTWARE. 'common:packages_licenses_view' ) ) + menu_main.bind_links(links=(link_about,), position=99) menu_secondary.bind_links( links=( link_current_user_edit, link_current_user_locale_profile_edit diff --git a/mayan/apps/navigation/classes.py b/mayan/apps/navigation/classes.py index d299414f46..5fca46d15f 100644 --- a/mayan/apps/navigation/classes.py +++ b/mayan/apps/navigation/classes.py @@ -64,6 +64,7 @@ class Menu(object): self.name = name self.bound_links = {} self.unbound_links = {} + self.link_positions = {} self.__class__._registry[name] = self def _map_links_to_source(self, links, source, map_variable='bound_links', position=None): @@ -71,18 +72,23 @@ class Menu(object): for link in links: source_links.append(link) + self.link_positions[link] = position def bind_links(self, links, sources=None, position=None): """ Associate a link to a model, a view inside this menu """ - if sources: + try: for source in sources: - self._map_links_to_source(links=links, source=source) - else: + self._map_links_to_source( + links=links, position=position, source=source + ) + except TypeError: # Unsourced links display always - self._map_links_to_source(links=links, source=None) + self._map_links_to_source( + links=links, position=position, source=sources + ) def resolve(self, context, source=None): request = Variable('request').resolve(context) @@ -162,6 +168,11 @@ class Menu(object): if resolved_link.link in unbound_links: result[0].remove(resolved_link) + # Sort links by position value passed during bind + result[0] = sorted( + result[0], key=lambda item: self.link_positions[item.link] + ) + return result def unbind_links(self, links, sources=None): @@ -170,15 +181,15 @@ class Menu(object): change the link binding of core apps """ - if sources: + try: for source in sources: self._map_links_to_source( links=links, source=source, map_variable='unbound_links' ) - else: + except TypeError: # Unsourced links display always self._map_links_to_source( - links=links, source=None, map_variable='unbound_links' + links=links, source=sources, map_variable='unbound_links' )