From ad61028a3a9a2daff3363e43ff870723782374d2 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 4 Jun 2016 12:19:42 +0530 Subject: [PATCH] menu: Sort menu items for all locales Currently menu items are shown in alphabetical order in applications and no clear order in system configuration. This is done using static weights for menu items based on English names that does not work for other locales. Sorting can't be done at the time of adding menu items as users of multiple locales may use the interface at the same time. Implement a sorting mechanism based on existing order as well as labels of menu item. This allows the flexiblity of grouping menu items in future as it may be need for system configuration. In case of help menu Remove sort order for all modules except for help menu as here we want that specific order. --- plinth/menu.py | 7 +++---- plinth/modules/apps/apps.py | 2 +- plinth/modules/avahi/__init__.py | 2 +- plinth/modules/config/config.py | 2 +- plinth/modules/datetime/__init__.py | 2 +- plinth/modules/deluge/__init__.py | 2 +- plinth/modules/diagnostics/__init__.py | 2 +- plinth/modules/dynamicdns/__init__.py | 2 +- plinth/modules/firewall/__init__.py | 2 +- plinth/modules/help/help.py | 2 +- plinth/modules/ikiwiki/__init__.py | 2 +- plinth/modules/letsencrypt/__init__.py | 2 +- plinth/modules/minetest/__init__.py | 2 +- plinth/modules/monkeysphere/__init__.py | 2 +- plinth/modules/mumble/__init__.py | 2 +- plinth/modules/names/__init__.py | 2 +- plinth/modules/networks/__init__.py | 2 +- plinth/modules/openvpn/__init__.py | 2 +- plinth/modules/owncloud/__init__.py | 2 +- plinth/modules/pagekite/__init__.py | 2 +- plinth/modules/power/__init__.py | 2 +- plinth/modules/privoxy/__init__.py | 2 +- plinth/modules/quassel/__init__.py | 2 +- plinth/modules/radicale/__init__.py | 2 +- plinth/modules/repro/__init__.py | 2 +- plinth/modules/restore/__init__.py | 2 +- plinth/modules/roundcube/__init__.py | 2 +- plinth/modules/shaarli/__init__.py | 2 +- plinth/modules/system/__init__.py | 2 +- plinth/modules/tor/__init__.py | 2 +- plinth/modules/transmission/__init__.py | 2 +- plinth/modules/ttrss/__init__.py | 2 +- plinth/modules/upgrades/__init__.py | 2 +- plinth/modules/users/__init__.py | 2 +- plinth/modules/xmpp/__init__.py | 2 +- plinth/templates/submenu.html | 5 ++--- plinth/tests/test_menu.py | 18 +++++++++++++----- 37 files changed, 52 insertions(+), 46 deletions(-) diff --git a/plinth/menu.py b/plinth/menu.py index a31b588e5..efbca2a09 100644 --- a/plinth/menu.py +++ b/plinth/menu.py @@ -56,9 +56,9 @@ class Menu(object): raise KeyError('Menu item not found') - def sort_items(self): - """Sort the items in self.items by order.""" - self.items = sorted(self.items, key=lambda x: x.order, reverse=False) + def sorted_items(self): + """Return menu items in sorted order according to current locale.""" + return sorted(self.items, key=lambda x: (x.order, x.label)) def add_urlname(self, label, icon, urlname, order=50, url_args=None, url_kwargs=None): @@ -77,7 +77,6 @@ class Menu(object): """ item = Menu(label=label, icon=icon, url=url, order=order) self.items.append(item) - self.sort_items() return item def active_item(self, request): diff --git a/plinth/modules/apps/apps.py b/plinth/modules/apps/apps.py index 9d90af549..4450fb2be 100644 --- a/plinth/modules/apps/apps.py +++ b/plinth/modules/apps/apps.py @@ -24,7 +24,7 @@ from plinth import cfg def init(): """Initailize the apps module""" cfg.main_menu.add_urlname(_('Apps'), 'glyphicon-download-alt', - 'apps:index', 80) + 'apps:index') def index(request): diff --git a/plinth/modules/avahi/__init__.py b/plinth/modules/avahi/__init__.py index 1954106fc..a3b019521 100644 --- a/plinth/modules/avahi/__init__.py +++ b/plinth/modules/avahi/__init__.py @@ -55,7 +55,7 @@ service = None def init(): """Intialize the service discovery module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-lamp', 'avahi:index', 950) + menu.add_urlname(title, 'glyphicon-lamp', 'avahi:index') global service # pylint: disable=W0603 service = service_module.Service( diff --git a/plinth/modules/config/config.py b/plinth/modules/config/config.py index 8f75bca2a..94d9b17f8 100644 --- a/plinth/modules/config/config.py +++ b/plinth/modules/config/config.py @@ -148,7 +148,7 @@ def init(): """Initialize the module""" menu = cfg.main_menu.get('system:index') menu.add_urlname(ugettext_lazy('Configure'), 'glyphicon-cog', - 'config:index', 10) + 'config:index') # Register domain with Name Services module. domainname = get_domainname() diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py index a3d0eb585..363d00fd1 100644 --- a/plinth/modules/datetime/__init__.py +++ b/plinth/modules/datetime/__init__.py @@ -47,7 +47,7 @@ service = None def init(): """Intialize the date/time module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-time', 'datetime:index', 900) + menu.add_urlname(title, 'glyphicon-time', 'datetime:index') global service service = service_module.Service( diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index a26533060..ff1c20c43 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -50,7 +50,7 @@ description = [ def init(): """Initialize the Deluge module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-magnet', 'deluge:index', 200) + menu.add_urlname(title, 'glyphicon-magnet', 'deluge:index') global service service = service_module.Service( diff --git a/plinth/modules/diagnostics/__init__.py b/plinth/modules/diagnostics/__init__.py index 3fe0023be..7970b6218 100644 --- a/plinth/modules/diagnostics/__init__.py +++ b/plinth/modules/diagnostics/__init__.py @@ -42,7 +42,7 @@ depends = ['system'] def init(): """Initialize the module""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-screenshot', 'diagnostics:index', 30) + menu.add_urlname(title, 'glyphicon-screenshot', 'diagnostics:index') def diagnose(): diff --git a/plinth/modules/dynamicdns/__init__.py b/plinth/modules/dynamicdns/__init__.py index 8c8a11572..3a0b59c3e 100644 --- a/plinth/modules/dynamicdns/__init__.py +++ b/plinth/modules/dynamicdns/__init__.py @@ -52,7 +52,7 @@ description = [ def init(): """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-refresh', 'dynamicdns:index', 500) + menu.add_urlname(title, 'glyphicon-refresh', 'dynamicdns:index') def setup(helper, old_version=None): diff --git a/plinth/modules/firewall/__init__.py b/plinth/modules/firewall/__init__.py index 96cb449a1..acdc18ee2 100644 --- a/plinth/modules/firewall/__init__.py +++ b/plinth/modules/firewall/__init__.py @@ -50,7 +50,7 @@ LOGGER = logging.getLogger(__name__) def init(): """Initailze firewall module""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-fire', 'firewall:index', 50) + menu.add_urlname(title, 'glyphicon-fire', 'firewall:index') service_enabled.connect(on_service_enabled) diff --git a/plinth/modules/help/help.py b/plinth/modules/help/help.py index 1db714089..98f711925 100644 --- a/plinth/modules/help/help.py +++ b/plinth/modules/help/help.py @@ -31,7 +31,7 @@ from plinth import cfg, __version__ def init(): """Initialize the Help module""" menu = cfg.main_menu.add_urlname(ugettext_lazy('Documentation'), - 'glyphicon-book', 'help:index', 101) + 'glyphicon-book', 'help:index') menu.add_urlname(ugettext_lazy('Where to Get Help'), 'glyphicon-search', 'help:index_explicit', 5) menu.add_urlname(ugettext_lazy('Manual'), 'glyphicon-info-sign', diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 2fc83a577..62319e650 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -44,7 +44,7 @@ description = [ def init(): """Initialize the ikiwiki module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-edit', 'ikiwiki:index', 1100) + menu.add_urlname(title, 'glyphicon-edit', 'ikiwiki:index') global service service = service_module.Service( diff --git a/plinth/modules/letsencrypt/__init__.py b/plinth/modules/letsencrypt/__init__.py index bfd630c16..0bc71ac82 100644 --- a/plinth/modules/letsencrypt/__init__.py +++ b/plinth/modules/letsencrypt/__init__.py @@ -59,7 +59,7 @@ def init(): """Intialize the module.""" menu = cfg.main_menu.get('system:index') menu.add_urlname(_('Certificates (Let\'s Encrypt)'), - 'glyphicon-lock', 'letsencrypt:index', 20) + 'glyphicon-lock', 'letsencrypt:index') def setup(helper, old_version=None): diff --git a/plinth/modules/minetest/__init__.py b/plinth/modules/minetest/__init__.py index 9c90416e2..1a7e1a66b 100644 --- a/plinth/modules/minetest/__init__.py +++ b/plinth/modules/minetest/__init__.py @@ -51,7 +51,7 @@ description = [ def init(): """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-th-large', 'minetest:index', 325) + menu.add_urlname(title, 'glyphicon-th-large', 'minetest:index') global service service = service_module.Service( diff --git a/plinth/modules/monkeysphere/__init__.py b/plinth/modules/monkeysphere/__init__.py index b3ccb5eb6..40d63c81d 100644 --- a/plinth/modules/monkeysphere/__init__.py +++ b/plinth/modules/monkeysphere/__init__.py @@ -54,7 +54,7 @@ def init(): """Initialize the monkeysphere module.""" menu = cfg.main_menu.get('system:index') menu.add_urlname(_('Monkeysphere'), 'glyphicon-certificate', - 'monkeysphere:index', 970) + 'monkeysphere:index') def setup(helper, old_version=None): diff --git a/plinth/modules/mumble/__init__.py b/plinth/modules/mumble/__init__.py index a54bd72bd..3b3a43528 100644 --- a/plinth/modules/mumble/__init__.py +++ b/plinth/modules/mumble/__init__.py @@ -50,7 +50,7 @@ description = [ def init(): """Intialize the Mumble module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-headphones', 'mumble:index', 900) + menu.add_urlname(title, 'glyphicon-headphones', 'mumble:index') global service service = service_module.Service( diff --git a/plinth/modules/names/__init__.py b/plinth/modules/names/__init__.py index d2c5e9565..e5f7d1f7d 100644 --- a/plinth/modules/names/__init__.py +++ b/plinth/modules/names/__init__.py @@ -48,7 +48,7 @@ logger = logging.getLogger(__name__) def init(): """Initialize the names module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-tag', 'names:index', 19) + menu.add_urlname(title, 'glyphicon-tag', 'names:index') domain_added.connect(on_domain_added) domain_removed.connect(on_domain_removed) diff --git a/plinth/modules/networks/__init__.py b/plinth/modules/networks/__init__.py index d72425a19..edcf47087 100644 --- a/plinth/modules/networks/__init__.py +++ b/plinth/modules/networks/__init__.py @@ -42,7 +42,7 @@ logger = Logger(__name__) def init(): """Initialize the Networks module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-signal', 'networks:index', 18) + menu.add_urlname(title, 'glyphicon-signal', 'networks:index') def setup(helper, old_version=None): diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index fc1a16f6d..3c87263ec 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -53,7 +53,7 @@ description = [ def init(): """Intialize the OpenVPN module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-lock', 'openvpn:index', 850) + menu.add_urlname(title, 'glyphicon-lock', 'openvpn:index') global service service = service_module.Service( diff --git a/plinth/modules/owncloud/__init__.py b/plinth/modules/owncloud/__init__.py index 2a6ac6eb3..1c3b9483f 100644 --- a/plinth/modules/owncloud/__init__.py +++ b/plinth/modules/owncloud/__init__.py @@ -60,7 +60,7 @@ def init(): return menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-picture', 'owncloud:index', 700) + menu.add_urlname(title, 'glyphicon-picture', 'owncloud:index') global service service = service_module.Service( diff --git a/plinth/modules/pagekite/__init__.py b/plinth/modules/pagekite/__init__.py index c08ce4f44..145a9da90 100644 --- a/plinth/modules/pagekite/__init__.py +++ b/plinth/modules/pagekite/__init__.py @@ -34,7 +34,7 @@ title = _('Public Visibility (PageKite)') def init(): """Intialize the PageKite module""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-flag', 'pagekite:index', 800) + menu.add_urlname(title, 'glyphicon-flag', 'pagekite:index') # Register kite name with Name Services module. utils.update_names_module(initial_registration=True) diff --git a/plinth/modules/power/__init__.py b/plinth/modules/power/__init__.py index 9cf5d0aef..82dd14937 100644 --- a/plinth/modules/power/__init__.py +++ b/plinth/modules/power/__init__.py @@ -39,4 +39,4 @@ description = [ def init(): """Initialize the power module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-off', 'power:index', 1000) + menu.add_urlname(title, 'glyphicon-off', 'power:index') diff --git a/plinth/modules/privoxy/__init__.py b/plinth/modules/privoxy/__init__.py index 8108c4306..ae7a545b8 100644 --- a/plinth/modules/privoxy/__init__.py +++ b/plinth/modules/privoxy/__init__.py @@ -60,7 +60,7 @@ managed_services = ['privoxy'] def init(): """Intialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-cloud-upload', 'privoxy:index', 1000) + menu.add_urlname(title, 'glyphicon-cloud-upload', 'privoxy:index') global service service = service_module.Service( diff --git a/plinth/modules/quassel/__init__.py b/plinth/modules/quassel/__init__.py index a9f737dfe..dfb8c1afe 100644 --- a/plinth/modules/quassel/__init__.py +++ b/plinth/modules/quassel/__init__.py @@ -58,7 +58,7 @@ description = [ def init(): """Initialize the quassel module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-retweet', 'quassel:index', 730) + menu.add_urlname(title, 'glyphicon-retweet', 'quassel:index') global service service = service_module.Service( diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index 5e0c1a301..a682dea8d 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -53,7 +53,7 @@ description = [ def init(): """Initialize the radicale module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-calendar', 'radicale:index', 375) + menu.add_urlname(title, 'glyphicon-calendar', 'radicale:index') global service service = service_module.Service( diff --git a/plinth/modules/repro/__init__.py b/plinth/modules/repro/__init__.py index 85a25b99f..99d8936ba 100644 --- a/plinth/modules/repro/__init__.py +++ b/plinth/modules/repro/__init__.py @@ -62,7 +62,7 @@ managed_services = ['repro'] def init(): """Initialize the repro module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-phone-alt', 'repro:index', 825) + menu.add_urlname(title, 'glyphicon-phone-alt', 'repro:index') global service service = service_module.Service( diff --git a/plinth/modules/restore/__init__.py b/plinth/modules/restore/__init__.py index 0ce855940..a8a8a1408 100644 --- a/plinth/modules/restore/__init__.py +++ b/plinth/modules/restore/__init__.py @@ -53,7 +53,7 @@ managed_services = ['node-restore'] def init(): """Initialize the reStore module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-hdd', 'restore:index', 750) + menu.add_urlname(title, 'glyphicon-hdd', 'restore:index') global service service = service_module.Service( diff --git a/plinth/modules/roundcube/__init__.py b/plinth/modules/roundcube/__init__.py index 6df6c03fb..30ab0a72c 100644 --- a/plinth/modules/roundcube/__init__.py +++ b/plinth/modules/roundcube/__init__.py @@ -61,7 +61,7 @@ service = None def init(): """Intialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-envelope', 'roundcube:index', 600) + menu.add_urlname(title, 'glyphicon-envelope', 'roundcube:index') global service service = service_module.Service( diff --git a/plinth/modules/shaarli/__init__.py b/plinth/modules/shaarli/__init__.py index 6e696bfe8..84d60f89c 100644 --- a/plinth/modules/shaarli/__init__.py +++ b/plinth/modules/shaarli/__init__.py @@ -48,7 +48,7 @@ service = None def init(): """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-bookmark', 'shaarli:index', 350) + menu.add_urlname(title, 'glyphicon-bookmark', 'shaarli:index') global service service = service_module.Service( diff --git a/plinth/modules/system/__init__.py b/plinth/modules/system/__init__.py index da66fe783..9a5d9479a 100644 --- a/plinth/modules/system/__init__.py +++ b/plinth/modules/system/__init__.py @@ -44,4 +44,4 @@ description = [ def init(): """Initialize the system module""" - cfg.main_menu.add_urlname(title, 'glyphicon-cog', 'system:index', 100) + cfg.main_menu.add_urlname(title, 'glyphicon-cog', 'system:index') diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index 08d2e13a2..e94b6deaa 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -54,7 +54,7 @@ bridge_service = None def init(): """Initialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-eye-close', 'tor:index', 100) + menu.add_urlname(title, 'glyphicon-eye-close', 'tor:index') global socks_service socks_service = service_module.Service( diff --git a/plinth/modules/transmission/__init__.py b/plinth/modules/transmission/__init__.py index 92f8ecf0b..8ec19d19d 100644 --- a/plinth/modules/transmission/__init__.py +++ b/plinth/modules/transmission/__init__.py @@ -51,7 +51,7 @@ TRANSMISSION_CONFIG = '/etc/transmission-daemon/settings.json' def init(): """Intialize the Transmission module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-save', 'transmission:index', 300) + menu.add_urlname(title, 'glyphicon-save', 'transmission:index') global service service = service_module.Service( diff --git a/plinth/modules/ttrss/__init__.py b/plinth/modules/ttrss/__init__.py index a0f5b992c..92db1ce5f 100644 --- a/plinth/modules/ttrss/__init__.py +++ b/plinth/modules/ttrss/__init__.py @@ -50,7 +50,7 @@ managed_services = ['tt-rss'] def init(): """Intialize the module.""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-envelope', 'ttrss:index', 780) + menu.add_urlname(title, 'glyphicon-envelope', 'ttrss:index') global service service = service_module.Service( diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index afecac836..c9e6ba601 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -46,7 +46,7 @@ service = None def init(): """Initialize the module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-refresh', 'upgrades:index', 21) + menu.add_urlname(title, 'glyphicon-refresh', 'upgrades:index') global service service = service_module.Service( 'auto-upgrades', title, is_external=False, is_enabled=is_enabled, diff --git a/plinth/modules/users/__init__.py b/plinth/modules/users/__init__.py index 36dede523..8d4bf759a 100644 --- a/plinth/modules/users/__init__.py +++ b/plinth/modules/users/__init__.py @@ -38,7 +38,7 @@ title = _('Users and Groups') def init(): """Intialize the user module.""" menu = cfg.main_menu.get('system:index') - menu.add_urlname(title, 'glyphicon-user', 'users:index', 15) + menu.add_urlname(title, 'glyphicon-user', 'users:index') def setup(helper, old_version=None): diff --git a/plinth/modules/xmpp/__init__.py b/plinth/modules/xmpp/__init__.py index 2503a9a6f..793410ad7 100644 --- a/plinth/modules/xmpp/__init__.py +++ b/plinth/modules/xmpp/__init__.py @@ -58,7 +58,7 @@ managed_services = ['ejabberd'] def init(): """Initialize the XMPP module""" menu = cfg.main_menu.get('apps:index') - menu.add_urlname(title, 'glyphicon-comment', 'xmpp:index', 400) + menu.add_urlname(title, 'glyphicon-comment', 'xmpp:index') global service service = service_module.Service( diff --git a/plinth/templates/submenu.html b/plinth/templates/submenu.html index 67bc37742..edf7368cc 100644 --- a/plinth/templates/submenu.html +++ b/plinth/templates/submenu.html @@ -20,17 +20,16 @@ {% load i18n %}