Separate out the short description and app name

Signed-off-by: Prachi <prachi@swecha.net>
Reviewed-by: Joseph Nuthalapati <njoseph@thoughtworks.com>
This commit is contained in:
Prachi 2017-08-10 17:30:37 +05:30 committed by Joseph Nuthalpati
parent f75f9dbab9
commit c8eb714562
No known key found for this signature in database
GPG Key ID: 5398F00A2FA43C35
60 changed files with 238 additions and 173 deletions

View File

@ -27,7 +27,7 @@ def get_shortcuts():
return sorted(shortcuts.values(), key=lambda item: item['label'])
def add_shortcut(shortcut_id, label, login_required=False,
def add_shortcut(shortcut_id, name, short_description="", login_required=False,
icon=None, url=None,
details=None, configure_url=None):
"""Add shortcut to front page."""
@ -38,6 +38,8 @@ def add_shortcut(shortcut_id, label, login_required=False,
if not icon:
icon = shortcut_id
label = '{0}\n({1})'.format(short_description, name)
shortcuts[shortcut_id] = {
'id': shortcut_id,
'label': label,

View File

@ -60,13 +60,17 @@ class Menu(object):
"""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,
def add_urlname(self, name, icon, urlname, short_description="", order=50, url_args=None,
url_kwargs=None):
"""Add a named URL to the menu (via add_item).
url_args and url_kwargs will be passed on to Django reverse().
"""
if short_description:
label = '{0} ({1})'.format(short_description, name)
else:
label = name
url = reverse_lazy(urlname, args=url_args, kwargs=url_kwargs)
return self.add_item(label, icon, url, order)

View File

@ -37,7 +37,7 @@ managed_services = ['avahi-daemon']
managed_packages = ['avahi-daemon']
title = _('Service Discovery')
name = _('Service Discovery')
description = [
format_lazy(
@ -56,11 +56,11 @@ service = None
def init():
"""Intialize the service discovery module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-lamp', 'avahi:index')
menu.add_urlname(name, 'glyphicon-lamp', 'avahi:index')
global service # pylint: disable=W0603
service = service_module.Service(
managed_services[0], title, ports=['mdns'], is_external=False)
managed_services[0], name, ports=['mdns'], is_external=False)
def setup(helper, old_version=False):

View File

@ -31,7 +31,9 @@ from plinth.menu import main_menu
version = 1
title = _('Domain Name Server \n (BIND)')
name = _('BIND')
short_description = _('Domain Name Server')
service = None
@ -56,13 +58,13 @@ CONFIG_FILE = '/etc/bind/named.conf.options'
def init():
"""Intialize the BIND module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-globe', 'bind:index')
menu.add_urlname(name, 'glyphicon-globe', 'bind:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['dns'],
managed_services[0], name, ports=['dns'],
is_external=False,
)
@ -73,7 +75,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['dns'],
managed_services[0], name, ports=['dns'],
is_external=True,
enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)

View File

@ -34,7 +34,7 @@ managed_services = ['ntp']
managed_packages = ['ntp']
title = _('Date & Time')
name = _('Date & Time')
description = [
_('Network time server is a program that maintains the system time '
@ -47,13 +47,13 @@ service = None
def init():
"""Intialize the date/time module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-time', 'datetime:index')
menu.add_urlname(name, 'glyphicon-time', 'datetime:index')
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['ntp'], is_external=False)
managed_services[0], name, ports=['ntp'], is_external=False)
def setup(helper, old_version=None):
@ -62,7 +62,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['ntp'], is_external=False)
managed_services[0], name, ports=['ntp'], is_external=False)
helper.call('post', service.notify_enabled, None, True)

View File

@ -36,7 +36,9 @@ managed_services = ['deluge-web']
managed_packages = ['deluged', 'deluge-web']
title = _('BitTorrent Web Client \n (Deluge)')
name = _('Deluge')
short_description = _('BitTorrent Web Client')
description = [
_('Deluge is a BitTorrent client that features a Web UI.'),
@ -52,13 +54,13 @@ reserved_usernames = ['debian-deluged']
def init():
"""Initialize the Deluge module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-magnet', 'deluge:index')
menu.add_urlname(name, 'glyphicon-magnet', 'deluge:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable)
@ -73,7 +75,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -81,7 +83,7 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('deluge', title, url='/deluge',
frontpage.add_shortcut('deluge', name, short_description, url='/deluge',
login_required=True)

View File

@ -29,7 +29,7 @@ version = 1
is_essential = True
title = _('Diagnostics')
name = _('Diagnostics')
description = [
_('The system diagnostic test will run a number of checks on your '
@ -41,7 +41,7 @@ description = [
def init():
"""Initialize the module"""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-screenshot', 'diagnostics:index')
menu.add_urlname(name, 'glyphicon-screenshot', 'diagnostics:index')
def diagnose():

View File

@ -44,7 +44,7 @@ def index(request):
_start_task()
return TemplateResponse(request, 'diagnostics.html',
{'title': diagnostics.title,
{'title': diagnostics.name,
'description': diagnostics.description,
'is_running': _running_task is not None,
'results': current_results})

View File

@ -48,9 +48,9 @@ def get_configured_domain_name():
version = 1
title_en = 'Federated Social Network \n (diaspora*)'
name = _('diaspora*')
title = _(title_en)
short_description = _('Federated Social Network')
service = None
@ -73,14 +73,14 @@ description = [
def init():
"""Initialize the Diaspora module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-thumbs-up', 'diaspora:index')
menu.add_urlname(name, 'glyphicon-thumbs-up', 'diaspora:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0],
title,
name,
ports=['http', 'https'],
is_external=True,
is_enabled=is_enabled,
@ -106,7 +106,7 @@ def setup_domain_name(domain_name):
if service is None:
service = service_module.Service(
managed_services[0],
title,
name,
ports=['http', 'https'],
is_external=True,
is_enabled=is_enabled,
@ -121,7 +121,8 @@ def add_shortcut():
if is_setup():
frontpage.add_shortcut(
'diaspora',
title,
name,
short_description,
url='https://diaspora.{}'.format(get_configured_domain_name()),
login_required=True)

View File

@ -37,7 +37,7 @@ class DiasporaSetupView(FormView):
template_name = 'diaspora-pre-setup.html'
form_class = DomainSelectionForm
description = diaspora.description
title = diaspora.title
title = diaspora.name
success_url = reverse_lazy('diaspora:index')
def form_valid(self, form):

View File

@ -30,7 +30,7 @@ from plinth.menu import main_menu
version = 1
title = _('Disks')
name = _('Disks')
description = []
@ -42,7 +42,7 @@ logger = logging.getLogger(__name__)
def init():
"""Intialize the module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-hdd', 'disks:index')
menu.add_urlname(name, 'glyphicon-hdd', 'disks:index')
def get_disks():

View File

@ -32,7 +32,7 @@ version = 1
managed_packages = ['ez-ipupdate']
title = _('Dynamic DNS Client')
name = _('Dynamic DNS Client')
description = [
format_lazy(
@ -57,7 +57,7 @@ reserved_usernames = ['ez-ipupd']
def init():
"""Initialize the module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-refresh', 'dynamicdns:index')
menu.add_urlname(name, 'glyphicon-refresh', 'dynamicdns:index')
current_status = dynamicdns.get_status()
if current_status['enabled']:
services = dynamicdns.get_enabled_services(current_status['dynamicdns_domain'])

View File

@ -50,7 +50,7 @@ subsubmenu = [{'url': reverse_lazy('dynamicdns:index'),
def index(request):
"""Serve Dynamic DNS page."""
return TemplateResponse(request, 'dynamicdns.html',
{'title': dynamicdns.title,
{'title': dynamicdns.name,
'description': dynamicdns.description,
'subsubmenu': subsubmenu})

View File

@ -42,7 +42,9 @@ managed_services = ['ejabberd']
managed_packages = ['ejabberd']
title = _('Chat Server \n (ejabberd)')
name = _('ejabberd')
short_description = _('Chat Server')
description = [
_('XMPP is an open and standardized communication protocol. Here '
@ -67,13 +69,13 @@ logger = logging.getLogger(__name__)
def init():
"""Initialize the ejabberd module"""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-comment', 'ejabberd:index')
menu.add_urlname(name, 'glyphicon-comment', 'ejabberd:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
'ejabberd', title,
'ejabberd', name,
ports=['xmpp-client', 'xmpp-server', 'xmpp-bosh'],
is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable)
@ -96,7 +98,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
'ejabberd', title,
'ejabberd', name,
ports=['xmpp-client', 'xmpp-server', 'xmpp-bosh'],
is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable)
@ -105,7 +107,8 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('ejabberd', title,
frontpage.add_shortcut('ejabberd', name=name,
short_description=short_description,
details=description,
configure_url=reverse_lazy('ejabberd:index'),
login_required=True)

View File

@ -36,7 +36,7 @@ is_essential = True
managed_packages = ['firewalld']
title = _('Firewall')
name = _('Firewall')
description = [
format_lazy(
@ -52,7 +52,7 @@ LOGGER = logging.getLogger(__name__)
def init():
"""Initailze firewall module"""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-fire', 'firewall:index')
menu.add_urlname(name, 'glyphicon-fire', 'firewall:index')
service_enabled.connect(on_service_enabled)

View File

@ -29,7 +29,7 @@ def index(request):
"""Serve introduction page"""
if not firewall.get_enabled_status():
return TemplateResponse(request, 'firewall.html',
{'title': firewall.title,
{'title': firewall.name,
'description': firewall.description,
'firewall_status': 'not_running'})
@ -38,7 +38,7 @@ def index(request):
return TemplateResponse(
request, 'firewall.html',
{'title': firewall.title,
{'title': firewall.name,
'description': firewall.description,
'services': list(service_module.services.values()),
'internal_enabled_services': internal_enabled_services,

View File

@ -34,11 +34,11 @@ def init():
menu = main_menu.add_urlname(ugettext_lazy('Documentation'),
'glyphicon-book', 'help:index')
menu.add_urlname(ugettext_lazy('Where to Get Help'), 'glyphicon-search',
'help:index_explicit', 5)
'help:index_explicit', order=5)
menu.add_urlname(ugettext_lazy('Manual'), 'glyphicon-info-sign',
'help:manual', 10)
'help:manual', order=10)
menu.add_urlname(ugettext_lazy('About'), 'glyphicon-star', 'help:about',
100)
order=100)
def index(request):

View File

@ -38,7 +38,9 @@ managed_packages = ['ikiwiki', 'libdigest-sha-perl', 'libxml-writer-perl',
service = None
title = _('Wiki and Blog (ikiwiki)')
name = _('ikiwiki')
short_description = _('Wiki and Blog')
description = [
_('ikiwiki is a simple wiki and blog application. It supports '
@ -59,13 +61,13 @@ description = [
def init():
"""Initialize the ikiwiki module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-edit', 'ikiwiki:index')
menu.add_urlname(name, 'glyphicon-edit', 'ikiwiki:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
'ikiwiki', title, ports=['http', 'https'], is_external=True,
'ikiwiki', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled():
@ -79,7 +81,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
'ikiwiki', title, ports=['http', 'https'], is_external=True,
'ikiwiki', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcuts)

View File

@ -40,7 +40,9 @@ managed_services = ['infinoted']
managed_packages = ['infinoted']
title = _('Gobby Server \n (infinoted)')
name = _('infinoted')
short_description = _('Gobby Server')
description = [
_('infinoted is a server for Gobby, a collaborative text editor.'),
@ -56,13 +58,13 @@ description = [
def init():
"""Initialize the infinoted module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-pencil', 'infinoted:index')
menu.add_urlname(name, 'glyphicon-pencil', 'infinoted:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['infinoted-plinth'],
managed_services[0], name, ports=['infinoted-plinth'],
is_external=True, enable=enable, disable=disable)
if service.is_enabled():
@ -82,7 +84,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['infinoted-plinth'],
managed_services[0], name, ports=['infinoted-plinth'],
is_external=True, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -90,7 +92,7 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('infinoted', title, url=None,
frontpage.add_shortcut('infinoted', name, url=None,
details=description,
configure_url=reverse_lazy('infinoted:index'),
login_required=False)

View File

@ -33,7 +33,9 @@ version = 1
managed_packages = ['libjs-jsxc']
title = _('Chat Client \n (JSXC)')
name = _('JSXC')
short_description = _('Chat Client')
description = [
@ -49,13 +51,13 @@ logger = logging.getLogger(__name__)
def init():
"""Initialize the JSXC module"""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-comment', 'jsxc:index')
menu.add_urlname(name, 'glyphicon-comment', 'jsxc:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
'jsxc', title, ports=['http', 'https'], is_external=True,
'jsxc', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled():
add_shortcut()
@ -68,7 +70,7 @@ def setup(helper, old_version=None):
global service
if not service:
service = service_module.Service(
'jsxc', title, ports=['http', 'https'], is_external=True,
'jsxc', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
helper.call('post', add_shortcut)

View File

@ -37,7 +37,9 @@ depends = ['names']
managed_packages = ['certbot']
title = _('Certificates (Let\'s Encrypt)')
name = _('Let\'s Encrypt')
short_description = _('Certificates')
description = [
format_lazy(
@ -62,8 +64,8 @@ service = None
def init():
"""Intialize the module."""
menu = main_menu.get('system')
menu.add_urlname(_('Certificates (Let\'s Encrypt)'),
'glyphicon-lock', 'letsencrypt:index')
menu.add_urlname(name,
'glyphicon-lock', 'letsencrypt:index', short_description)
domainname_change.connect(on_domainname_change)

View File

@ -43,7 +43,7 @@ def index(request):
status = get_status()
return TemplateResponse(request, 'letsencrypt.html',
{'title': letsencrypt.title,
{'title': letsencrypt.name,
'description': letsencrypt.description,
'status': status})

View File

@ -38,7 +38,9 @@ managed_services = ['matrix-synapse']
managed_packages = ['matrix-synapse']
title = _('Chat Server \n (Matrix Synapse)')
name = _('Matrix Synapse')
short_description = _('Chat Server')
description = [
_('<a href="https://matrix.org/docs/guides/faq.html">Matrix</a> is an new '
@ -65,13 +67,13 @@ SERVER_NAME_PATH = "/etc/matrix-synapse/conf.d/server_name.yaml"
def init():
"""Initialize the matrix-synapse module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-comment', 'matrixsynapse:index')
menu.add_urlname(name, 'glyphicon-comment', 'matrixsynapse:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
'matrix-synapse', title,
'matrix-synapse', name,
ports=['matrix-synapse-plinth'],
is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable)
@ -85,7 +87,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
'matrix-synapse', title,
'matrix-synapse', name,
ports=['matrix-synapse-plinth'],
is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable)
@ -98,7 +100,8 @@ def setup(helper, old_version=None):
def add_shortcut():
"""Add a shortcut to the frontpage."""
frontpage.add_shortcut('matrixsynapse', title, details=description,
frontpage.add_shortcut('matrixsynapse', name, details=description,
short_description=short_description,
configure_url=reverse_lazy('matrixsynapse:index'),
login_required=True)

View File

@ -48,7 +48,7 @@ class SetupView(FormView):
"""Provide context data to the template."""
context = super().get_context_data(**kwargs)
context['title'] = matrixsynapse.title
context['title'] = matrixsynapse.name
context['description'] = matrixsynapse.description
context['domain_names'] = get_domain_names()

View File

@ -45,7 +45,9 @@ managed_packages = ['minetest-server', 'minetest-mod-advspawning',
'minetest-mod-mobf-trap', 'minetest-mod-moreblocks',
'minetest-mod-nether', 'minetest-mod-torches']
title = _('Block Sandbox \n (Minetest)')
name = _('Minetest')
short_description = _('Block Sandbox')
description = [
format_lazy(
@ -65,13 +67,13 @@ AUG_PATH = '/files' + CONFIG_FILE + '/.anon'
def init():
"""Initialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-th-large', 'minetest:index')
menu.add_urlname(name, 'glyphicon-th-large', 'minetest:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title,
managed_services[0], name,
ports=['minetest-plinth'], is_external=True, enable=enable,
disable=disable)
@ -85,7 +87,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title,
managed_services[0], name,
ports=['minetest-plinth'], is_external=True, enable=enable,
disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -93,7 +95,8 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('minetest', title, url=None,
frontpage.add_shortcut('minetest', name, url=None,
short_description=short_description,
details=description,
configure_url=reverse_lazy('minetest:index'),
login_required=False)

View File

@ -28,7 +28,7 @@ version = 1
managed_packages = ['monkeysphere']
title = _('Monkeysphere')
name = _('Monkeysphere')
description = [
_('With Monkeysphere, an OpenPGP key can be generated for each configured '

View File

@ -40,7 +40,7 @@ def index(request):
status = get_status()
return TemplateResponse(
request, 'monkeysphere.html',
{'title': monkeysphere.title,
{'title': monkeysphere.name,
'description': monkeysphere.description,
'status': status,
'running': bool(publish_process)})
@ -66,7 +66,7 @@ def import_key(request, ssh_fingerprint):
def details(request, fingerprint):
"""Get details for an OpenPGP key."""
return TemplateResponse(request, 'monkeysphere_details.html',
{'title': monkeysphere.title,
{'title': monkeysphere.name,
'key': get_key(fingerprint)})

View File

@ -32,7 +32,9 @@ from plinth.views import ServiceView
version = 1
title = _('Voice Chat \n (Mumble)')
name = _('Mumble')
short_description = _('Voice Chat')
service = None
@ -55,13 +57,13 @@ reserved_usernames = ['mumble-server']
def init():
"""Intialize the Mumble module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-headphones', 'mumble:index')
menu.add_urlname(name, 'glyphicon-headphones', 'mumble:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['mumble-plinth'],
managed_services[0], name, ports=['mumble-plinth'],
is_external=True,
enable=enable, disable=disable)
@ -81,7 +83,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['mumble-plinth'],
managed_services[0], name, ports=['mumble-plinth'],
is_external=True,
enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -89,7 +91,8 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('mumble', title,
frontpage.add_shortcut('mumble', name,
short_description=short_description,
details=description,
configure_url=reverse_lazy('mumble:index'),
login_required=False)

View File

@ -36,7 +36,7 @@ version = 1
is_essential = True
title = _('Name Services')
name = _('Name Services')
domain_types = {}
domains = {}
@ -47,7 +47,7 @@ logger = logging.getLogger(__name__)
def init():
"""Initialize the names module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-tag', 'names:index')
menu.add_urlname(name, 'glyphicon-tag', 'names:index')
domain_added.connect(on_domain_added)
domain_removed.connect(on_domain_removed)

View File

@ -32,7 +32,7 @@ def index(request):
status = get_status()
return TemplateResponse(request, 'names.html',
{'title': names.title,
{'title': names.name,
'status': status})

View File

@ -34,7 +34,7 @@ is_essential = True
managed_packages = ['network-manager', 'batctl']
title = _('Networks')
name = _('Networks')
logger = Logger(__name__)
@ -42,7 +42,7 @@ logger = Logger(__name__)
def init():
"""Initialize the Networks module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-signal', 'networks:index')
menu.add_urlname(name, 'glyphicon-signal', 'networks:index')
def setup(helper, old_version=None):

View File

@ -39,7 +39,9 @@ managed_services = ['openvpn@freedombox']
managed_packages = ['openvpn', 'easy-rsa']
title = _('Virtual Private Network \n (OpenVPN)')
name = _('OpenVPN')
short_description = _('Virtual Private Network')
description = [
format_lazy(
@ -56,13 +58,13 @@ description = [
def init():
"""Initialize the OpenVPN module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-lock', 'openvpn:index')
menu.add_urlname(name, 'glyphicon-lock', 'openvpn:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['openvpn'], is_external=True)
managed_services[0], name, ports=['openvpn'], is_external=True)
if service.is_enabled() and is_setup():
add_shortcut()
@ -74,7 +76,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['openvpn'], is_external=True,
managed_services[0], name, ports=['openvpn'], is_external=True,
enable=enable, disable=disable)
@ -84,7 +86,8 @@ def add_shortcut():
format_lazy(_('<a class="btn btn-primary btn-sm" href="{link}">'
'Download Profile</a>'),
link=reverse_lazy('openvpn:profile'))
frontpage.add_shortcut('openvpn', title,
frontpage.add_shortcut('openvpn', name,
short_description=short_description,
details=description + [download_profile],
configure_url=reverse_lazy('openvpn:index'),
login_required=True)

View File

@ -57,7 +57,7 @@ def index(request):
form = OpenVpnForm(initial=status, prefix='openvpn')
return TemplateResponse(request, 'openvpn.html',
{'title': openvpn.title,
{'title': openvpn.name,
'description': openvpn.description,
'status': status,
'form': form})

View File

@ -41,7 +41,9 @@ first_boot_steps = [
},
]
title = _('Public Visibility (PageKite)')
name = _('PageKite')
short_description = _('Public Visibility')
description = [
format_lazy(
@ -80,7 +82,7 @@ description = [
def init():
"""Intialize the PageKite module"""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-flag', 'pagekite:index')
menu.add_urlname(name, 'glyphicon-flag', 'pagekite:index', short_description)
# Register kite name with Name Services module.
utils.update_names_module(initial_registration=True)

View File

@ -44,7 +44,7 @@ subsubmenu = [{'url': reverse_lazy('pagekite:index'),
def index(request):
"""Serve introduction page"""
return TemplateResponse(request, 'pagekite_introduction.html',
{'title': pagekite.title,
{'title': pagekite.name,
'description': pagekite.description,
'subsubmenu': subsubmenu})

View File

@ -25,7 +25,7 @@ version = 1
is_essential = True
title = _('Power')
name = _('Power')
description = [
_('Restart or shut down the system.')

View File

@ -32,7 +32,7 @@ from plinth.modules import power
def index(request):
"""Serve power controls page."""
return TemplateResponse(request, 'power.html',
{'title': power.title,
{'title': power.name,
'description': power.description,
'pkg_manager_is_busy': _is_pkg_manager_busy()})

View File

@ -40,7 +40,9 @@ managed_services = ['privoxy']
managed_packages = ['privoxy']
title = _('Web Proxy \n (Privoxy)')
name = _('Privoxy')
short_description = _('Web Proxy')
description = [
_('Privoxy is a non-caching web proxy with advanced filtering '
@ -66,13 +68,13 @@ service = None
def init():
"""Intialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-cloud-upload', 'privoxy:index')
menu.add_urlname(name, 'glyphicon-cloud-upload', 'privoxy:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['privoxy'],
managed_services[0], name, ports=['privoxy'],
is_external=False,
enable=enable, disable=disable)
@ -87,7 +89,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['privoxy'],
managed_services[0], name, ports=['privoxy'],
is_external=False,
enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -95,7 +97,8 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('privoxy', title,
frontpage.add_shortcut('privoxy', name,
short_description=short_description,
details=description,
configure_url=reverse_lazy('privoxy:index'),
login_required=True)

View File

@ -39,7 +39,9 @@ managed_services = ['quasselcore']
managed_packages = ['quassel-core']
title = _('IRC Client \n (Quassel)')
name = _('Quassel')
short_description = _('IRC Client')
description = [
format_lazy(
@ -64,13 +66,13 @@ reserved_usernames = ['quasselcore']
def init():
"""Initialize the quassel module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-retweet', 'quassel:index')
menu.add_urlname(name, 'glyphicon-retweet', 'quassel:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['quassel-plinth'],
managed_services[0], name, ports=['quassel-plinth'],
is_external=True, enable=enable, disable=disable)
if service.is_enabled():
@ -89,14 +91,15 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['quassel-plinth'],
managed_services[0], name, ports=['quassel-plinth'],
is_external=True, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut)
def add_shortcut():
frontpage.add_shortcut('quassel', title,
frontpage.add_shortcut('quassel', name,
short_description=short_description,
details=description,
configure_url=reverse_lazy('quassel:index'),
login_required=True)

View File

@ -40,7 +40,9 @@ managed_services = ['radicale']
managed_packages = ['radicale']
title = _('Calendar and Addressbook \n (Radicale)')
name = _('Radicale')
short_description = _('Calendar and Addressbook')
description = [
format_lazy(
@ -59,13 +61,13 @@ CONFIG_FILE = '/etc/radicale/config'
def init():
"""Initialize the radicale module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-calendar', 'radicale:index')
menu.add_urlname(name, 'glyphicon-calendar', 'radicale:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True,
enable=enable, disable=disable)
@ -80,7 +82,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True,
enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -88,7 +90,8 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('radicale', title,
frontpage.add_shortcut('radicale', name,
short_description=short_description,
details=description,
configure_url=reverse_lazy('radicale:index'),
login_required=True)

View File

@ -35,7 +35,9 @@ managed_services = ['repro']
managed_packages = ['repro']
title = _('SIP Server \n (repro)')
name = _('repro')
short_description = _('SIP Server')
description = [
_('repro provides various SIP services that a SIP softphone can utilize '
@ -66,13 +68,13 @@ service = None
def init():
"""Initialize the repro module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-phone-alt', 'repro:index')
menu.add_urlname(name, 'glyphicon-phone-alt', 'repro:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title,
managed_services[0], name,
ports=['sip', 'sips', 'rtp-plinth'],
is_external=True, enable=enable, disable=disable)
@ -93,7 +95,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title,
managed_services[0], name,
ports=['sip', 'sips', 'rtp-plinth'],
is_external=True, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -101,7 +103,8 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('repro', title,
frontpage.add_shortcut('repro', name,
short_description=short_description,
details=description,
configure_url=reverse_lazy('repro:index'),
login_required=True)

View File

@ -33,7 +33,9 @@ managed_services = ['node-restore']
managed_packages = ['node-restore']
title = _('Unhosted Storage \n (reStore)')
name = _('reStore')
short_description = _('Unhosted Storage')
description = [
format_lazy(
@ -56,13 +58,13 @@ service = None
def init():
"""Initialize the reStore module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-hdd', 'restore:index')
menu.add_urlname(name, 'glyphicon-hdd', 'restore:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=False)
@ -72,5 +74,5 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=False)

View File

@ -32,7 +32,9 @@ version = 1
managed_packages = ['sqlite3', 'roundcube', 'roundcube-sqlite3']
title = _('Email Client \n (Roundcube)')
name = _('Roundcube')
short_description = _('Email Client')
description = [
_('Roundcube webmail is a browser-based multilingual IMAP '
@ -62,13 +64,13 @@ service = None
def init():
"""Intialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-envelope', 'roundcube:index')
menu.add_urlname(name, 'glyphicon-envelope', 'roundcube:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
'roundcube', title, ports=['http', 'https'], is_external=True,
'roundcube', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled():
@ -84,13 +86,13 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
'roundcube', title, ports=['http', 'https'], is_external=True,
'roundcube', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
def add_shortcut():
frontpage.add_shortcut(
'roundcube', title, url='/roundcube',
'roundcube', name, short_description=short_description, url='/roundcube',
login_required=True)

View File

@ -29,7 +29,7 @@ version = 2
is_essential = True
title = _('Security')
name = _('Security')
managed_packages = ['fail2ban']
@ -42,7 +42,7 @@ ACCESS_CONF_SNIPPET = '-:ALL EXCEPT root fbx (admin) (sudo):ALL'
def init():
"""Initialize the module"""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-lock', 'security:index')
menu.add_urlname(name, 'glyphicon-lock', 'security:index')
def setup(helper, old_version=None):

View File

@ -32,7 +32,9 @@ version = 1
managed_packages = ['shaarli']
title = _('Bookmarks \n (Shaarli)')
name = _('Shaarli')
short_description = _('Bookmarks')
description = [
_('Shaarli allows you to save and share bookmarks.'),
@ -49,13 +51,13 @@ service = None
def init():
"""Initialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-bookmark', 'shaarli:index')
menu.add_urlname(name, 'glyphicon-bookmark', 'shaarli:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
'shaarli', title, ports=['http', 'https'], is_external=True,
'shaarli', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled():
@ -68,14 +70,14 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
'shaarli', title, ports=['http', 'https'], is_external=True,
'shaarli', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut)
def add_shortcut():
frontpage.add_shortcut('shaarli', title, url='/shaarli',
frontpage.add_shortcut('shaarli', name, short_description=short_description, url='/shaarli',
login_required=True)

View File

@ -29,7 +29,7 @@ version = 1
managed_packages = ['snapper']
title = _('Snapshots')
name = _('Snapshots')
description = [
_('Snapshots allows creating and managing filesystem snapshots. These can '
@ -51,7 +51,7 @@ service = None
def init():
"""Initialize the module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-film', 'snapshot:index')
menu.add_urlname(name, 'glyphicon-film', 'snapshot:index')
def setup(helper, old_version=None):

View File

@ -40,7 +40,7 @@ def index(request):
snapshots = json.loads(output)
return TemplateResponse(request, 'snapshot.html',
{'title': snapshot_module.title,
{'title': snapshot_module.name,
'description': snapshot_module.description,
'snapshots': snapshots})

View File

@ -27,7 +27,7 @@ is_essential = True
depends = ['security']
title = _('Single Sign On')
name = _('Single Sign On')
managed_packages = ['libapache2-mod-auth-pubtkt', 'openssl', 'python3-openssl']

View File

@ -36,7 +36,9 @@ managed_services = ['syncthing']
managed_packages = ['syncthing']
title = _('File Synchronization \n (Syncthing)')
name = _('Syncthing')
short_description = _('File Synchronization')
description = [
_('Syncthing is an application to synchronize files across multiple '
@ -62,14 +64,14 @@ service = None
def init():
"""Intialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-refresh', 'syncthing:index')
menu.add_urlname(name, 'glyphicon-refresh', 'syncthing:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0],
title,
name,
ports=['http', 'https'],
is_external=True,
is_enabled=is_enabled,
@ -89,7 +91,7 @@ def setup(helper, old_version=None):
if service is None:
service = service_module.Service(
managed_services[0],
title,
name,
ports=['http', 'https'],
is_external=True,
is_enabled=is_enabled,
@ -103,7 +105,7 @@ def setup(helper, old_version=None):
def add_shortcut():
"""Helper method to add a shortcut to the frontpage."""
frontpage.add_shortcut(
'syncthing', title, url='/syncthing/', login_required=True)
'syncthing', name, short_description=short_description, url='/syncthing/', login_required=True)
def is_running():

View File

@ -39,7 +39,9 @@ managed_services = ['tahoe-lafs']
managed_packages = ['tahoe-lafs']
title = _('Distributed File Storage (Tahoe-LAFS)')
name = _('LAFS')
short_description = _('Distributed File Storage')
service = None
@ -85,14 +87,14 @@ description = [
def init():
"""Intialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-hdd', 'tahoe:index')
menu.add_urlname(name, 'glyphicon-hdd', 'tahoe:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup' and is_setup():
service = service_module.Service(
managed_services[0],
title,
name,
ports=['tahoe-plinth'],
is_external=True,
is_enabled=is_enabled,
@ -124,7 +126,7 @@ def post_setup(configured_domain_name):
if service is None:
service = service_module.Service(
managed_services[0],
title,
name,
ports=['tahoe-plinth'],
is_external=True,
is_enabled=is_enabled,
@ -139,7 +141,7 @@ def add_shortcut():
"""Helper method to add a shortcut to the front page."""
# BUG: Current logo appears squashed on front page.
frontpage.add_shortcut(
'tahoe-lafs', title,
'tahoe-lafs', name, short_description=short_description,
url='https://{}:5678'.format(get_configured_domain_name()),
login_required=True)

View File

@ -32,7 +32,7 @@ class TahoeSetupView(FormView):
template_name = 'tahoe-pre-setup.html'
form_class = DomainSelectionForm
description = tahoe.description
title = tahoe.title
title = tahoe.name
success_url = reverse_lazy('tahoe:index')
def form_valid(self, form):

View File

@ -39,7 +39,9 @@ depends = ['names']
managed_packages = ['tor', 'tor-geoipdb', 'torsocks', 'obfs4proxy',
'apt-transport-tor']
title = ('Anonymity Network \n (Tor)')
name = _('Tor')
short_description = _('Anonymity Network')
description = [
_('Tor is an anonymous communication system. You can learn more '
@ -59,7 +61,7 @@ bridge_service = None
def init():
"""Initialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-eye-close', 'tor:index')
menu.add_urlname(name, 'glyphicon-eye-close', 'tor:index', short_description)
setup_helper = globals()['setup_helper']
needs_setup = setup_helper.get_state() == 'needs-setup'

View File

@ -51,7 +51,7 @@ def index(request):
form = TorForm(initial=status, prefix='tor')
return TemplateResponse(request, 'tor.html',
{'title': tor.title,
{'title': tor.name,
'description': tor.description,
'status': status,
'config_running': bool(config_process),

View File

@ -35,7 +35,9 @@ managed_services = ['transmission-daemon']
managed_packages = ['transmission-daemon']
title = _('BitTorrent \n (Transmission)')
name = _('Transmission')
short_description = _('BitTorrent')
description = [
_('BitTorrent is a peer-to-peer file sharing protocol. '
@ -52,13 +54,13 @@ service = None
def init():
"""Intialize the Transmission module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-save', 'transmission:index')
menu.add_urlname(name, 'glyphicon-save', 'transmission:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True, is_enabled=is_enabled,
enable=enable, disable=disable)
@ -79,7 +81,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True, is_enabled=is_enabled,
enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -88,7 +90,7 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut(
'transmission', title, url='/transmission',
'transmission', name, short_description=short_description, url='/transmission',
login_required=True)

View File

@ -36,7 +36,9 @@ managed_services = ['tt-rss']
managed_packages = ['tt-rss', 'postgresql', 'dbconfig-pgsql', 'php-pgsql']
title = _('News Feed Reader \n (Tiny Tiny RSS)')
name = _('Tiny Tiny RSS')
short_description = _('News Feed Reader')
description = [
_('Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, '
@ -56,13 +58,13 @@ service = None
def init():
"""Intialize the module."""
menu = main_menu.get('apps')
menu.add_urlname(title, 'glyphicon-envelope', 'ttrss:index')
menu.add_urlname(name, 'glyphicon-envelope', 'ttrss:index', short_description)
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
@ -78,7 +80,7 @@ def setup(helper, old_version=None):
global service
if service is None:
service = service_module.Service(
managed_services[0], title, ports=['http', 'https'],
managed_services[0], name, ports=['http', 'https'],
is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
@ -86,7 +88,7 @@ def setup(helper, old_version=None):
def add_shortcut():
frontpage.add_shortcut('ttrss', title, url='/tt-rss',
frontpage.add_shortcut('ttrss', name, short_description=short_description, url='/tt-rss',
login_required=True)

View File

@ -32,7 +32,7 @@ is_essential = True
managed_packages = ['unattended-upgrades']
title = _('Software Upgrades')
name = _('Software Upgrades')
description = [
_('Upgrades install the latest software and security updates. When '
@ -46,10 +46,10 @@ service = None
def init():
"""Initialize the module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-refresh', 'upgrades:index')
menu.add_urlname(name, 'glyphicon-refresh', 'upgrades:index')
global service
service = service_module.Service(
'auto-upgrades', title, is_external=False, is_enabled=is_enabled,
'auto-upgrades', name, is_external=False, is_enabled=is_enabled,
enable=enable, disable=disable)

View File

@ -47,7 +47,7 @@ class UpgradesConfigurationView(FormView):
"""Return the context data for rendering the template view."""
context = super().get_context_data(*args, **kwargs)
context['subsubmenu'] = subsubmenu
context['title'] = upgrades.title
context['title'] = upgrades.name
context['description'] = upgrades.description
return context
@ -111,7 +111,7 @@ def upgrade(request):
messages.error(request, _('Starting upgrade failed.'))
return TemplateResponse(request, 'upgrades.html',
{'title': upgrades.title,
{'title': upgrades.name,
'description': upgrades.description,
'subsubmenu': subsubmenu,
'is_busy': is_busy,

View File

@ -42,13 +42,13 @@ first_boot_steps = [
},
]
title = _('Users and Groups')
name = _('Users and Groups')
def init():
"""Intialize the user module."""
menu = main_menu.get('system')
menu.add_urlname(title, 'glyphicon-user', 'users:index')
menu.add_urlname(name, 'glyphicon-user', 'users:index')
def setup(helper, old_version=None):

View File

@ -32,7 +32,7 @@
{% block content %}
<h2>{% trans "Installation" %}: {{ setup_helper.module.title }}</h2>
<h2>{% trans "Installation" %}: {{ setup_helper.module.short_description }} ({{ setup_helper.module.name }})</h2>
{% for paragraph in setup_helper.module.description %}
<p>{{ paragraph|safe }}</p>

View File

@ -154,19 +154,20 @@ class MenuTestCase(TestCase):
def test_add_urlname(self):
"""Verify that a named URL can be added to a menu correctly."""
expected_label = 'Label4'
expected_title = 'Label4'
expected_short_description = 'Description4'
expected_icon = 'Icon4'
expected_url = 'index'
reversed_url = reverse(expected_url)
expected_order = 4
menu = Menu()
actual_item = menu.add_urlname(expected_label, expected_icon,
expected_url, expected_order)
actual_item = menu.add_urlname(expected_title, expected_icon,
expected_url, expected_short_description, expected_order)
self.assertEqual(1, len(menu.items))
self.assertIsNotNone(actual_item)
self.assertEqual(actual_item, menu.items[0])
self.assertEqual(expected_label, actual_item.label)
self.assertEqual('Description4 (Label4)', actual_item.label)
self.assertEqual(expected_icon, actual_item.icon)
self.assertEqual(reversed_url, actual_item.url)
self.assertEqual(expected_order, actual_item.order)