apps: Separate enabled and disabled apps

- Add 'secondary' flag to menu items.

- Mark apps as 'secondary' when disabled.

- Extend TemplateView for apps index.

- Add card-container for disabled apps.

Closes #1309

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
This commit is contained in:
James Valleroy 2019-03-29 07:54:28 -04:00 committed by Sunil Mohan Adapa
parent fe16bf4d26
commit 893bd2b4d6
No known key found for this signature in database
GPG Key ID: 43EA1CFF0AA7C5F2
27 changed files with 295 additions and 103 deletions

View File

@ -23,7 +23,8 @@ from plinth.utils import format_lazy
class Menu(object): class Menu(object):
"""One menu item.""" """One menu item."""
def __init__(self, name="",short_description="", label="", icon="", url="#", order=50): def __init__(self, name="", short_description="", label="", icon="",
url="#", order=50):
"""label is the text that is displayed on the menu. """label is the text that is displayed on the menu.
icon is the icon to be displayed next to the label. icon is the icon to be displayed next to the label.
@ -47,6 +48,7 @@ class Menu(object):
self.icon = icon self.icon = icon
self.url = url self.url = url
self.order = order self.order = order
self.secondary = True
# TODO: With an ordered dictionary for self.items we could access the # TODO: With an ordered dictionary for self.items we could access the
# items by their URL directly instead of searching for them each time, # items by their URL directly instead of searching for them each time,
# which we do currently with the 'get' method # which we do currently with the 'get' method
@ -84,8 +86,10 @@ class Menu(object):
return it. return it.
""" """
item = Menu(name=name, short_description=short_description, label=label, icon=icon, url=url, order=order) item = Menu(name=name, short_description=short_description,
label=label, icon=icon, url=url, order=order)
self.items.append(item) self.items.append(item)
return item return item
def active_item(self, request): def active_item(self, request):
@ -94,6 +98,32 @@ class Menu(object):
if request.path.startswith(str(item.url)): if request.path.startswith(str(item.url)):
return item return item
def promote_item(self, urlname, url_args=None, url_kwargs=None):
"""Promote a secondary item to an item."""
found_item = None
url = reverse(urlname, args=url_args, kwargs=url_kwargs)
for item in self.items:
if str(item.url) == url:
found_item = item
if found_item:
found_item.secondary = False
else:
raise KeyError('Menu item not found')
def demote_item(self, urlname, url_args=None, url_kwargs=None):
"""Demote an item to a secondary item."""
found_item = None
url = reverse(urlname, args=url_args, kwargs=url_kwargs)
for item in self.items:
if str(item.url) == url:
found_item = item
if found_item:
found_item.secondary = True
else:
raise KeyError('Menu item not found')
main_menu = Menu() main_menu = Menu()

View File

@ -59,8 +59,7 @@ manual_page = 'Deluge'
def init(): def init():
"""Initialize the Deluge module.""" """Initialize the Deluge module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'deluge', 'deluge:index', menu.add_urlname(name, 'deluge', 'deluge:index', short_description)
short_description)
register_group(group) register_group(group)
global service global service
@ -70,9 +69,9 @@ def init():
'http', 'https' 'http', 'https'
], is_external=True, is_enabled=is_enabled, enable=enable, ], is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable) disable=disable)
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('deluge:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -87,6 +86,8 @@ def setup(helper, old_version=None):
disable=disable) disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'deluge:index')
def add_shortcut(): def add_shortcut():
@ -104,12 +105,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('deluge', ['enable']) actions.superuser_run('deluge', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('deluge:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('deluge', ['disable']) actions.superuser_run('deluge', ['disable'])
frontpage.remove_shortcut('deluge') frontpage.remove_shortcut('deluge')
menu = main_menu.get('apps')
menu.demote_item('deluge:index')
def diagnose(): def diagnose():

View File

@ -50,9 +50,9 @@ description = [
_('To actually communicate, you can use the <a href="{jsxc_url}">' _('To actually communicate, you can use the <a href="{jsxc_url}">'
'web client</a> or any other <a href=\'https://xmpp.org/' 'web client</a> or any other <a href=\'https://xmpp.org/'
'software/clients\' target=\'_blank\'>XMPP client</a>. ' 'software/clients\' target=\'_blank\'>XMPP client</a>. '
'When enabled, ejabberd can be accessed by any <a href="{users_url}">' 'When enabled, ejabberd can be accessed by any '
'user with a {box_name} login</a>.'), box_name=_(cfg.box_name), '<a href="{users_url}"> user with a {box_name} login</a>.'),
users_url=reverse_lazy('users:index'), box_name=_(cfg.box_name), users_url=reverse_lazy('users:index'),
jsxc_url=reverse_lazy('jsxc:index')) jsxc_url=reverse_lazy('jsxc:index'))
] ]
@ -82,6 +82,8 @@ def init():
enable=enable, disable=disable) enable=enable, disable=disable)
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('ejabberd:index')
pre_hostname_change.connect(on_pre_hostname_change) pre_hostname_change.connect(on_pre_hostname_change)
post_hostname_change.connect(on_post_hostname_change) post_hostname_change.connect(on_post_hostname_change)
domainname_change.connect(on_domainname_change) domainname_change.connect(on_domainname_change)
@ -105,6 +107,8 @@ def setup(helper, old_version=None):
enable=enable, disable=disable) enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'ejabberd:index')
def add_shortcut(): def add_shortcut():
@ -123,12 +127,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('ejabberd', ['enable']) actions.superuser_run('ejabberd', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('ejabberd:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('ejabberd', ['disable']) actions.superuser_run('ejabberd', ['disable'])
frontpage.remove_shortcut('ejabberd') frontpage.remove_shortcut('ejabberd')
menu = main_menu.get('apps')
menu.demote_item('ejabberd:index')
def on_pre_hostname_change(sender, old_hostname, new_hostname, **kwargs): def on_pre_hostname_change(sender, old_hostname, new_hostname, **kwargs):

View File

@ -87,6 +87,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('i2p:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -133,6 +134,8 @@ def setup(helper, old_version=None):
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', proxies_service.notify_enabled, None, True) helper.call('post', proxies_service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'i2p:index')
def add_shortcut(): def add_shortcut():
@ -157,12 +160,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('i2p', ['enable']) actions.superuser_run('i2p', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('i2p:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('i2p', ['disable']) actions.superuser_run('i2p', ['disable'])
frontpage.remove_shortcut('i2p') frontpage.remove_shortcut('i2p')
menu = main_menu.get('apps')
menu.demote_item('i2p:index')
def diagnose(): def diagnose():

View File

@ -67,8 +67,7 @@ manual_page = 'Ikiwiki'
def init(): def init():
"""Initialize the ikiwiki module.""" """Initialize the ikiwiki module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'ikiwiki', 'ikiwiki:index', menu.add_urlname(name, 'ikiwiki', 'ikiwiki:index', short_description)
short_description)
register_group(group) register_group(group)
global service global service
@ -77,9 +76,9 @@ def init():
service = service_module.Service( service = service_module.Service(
'ikiwiki', name, ports=['http', 'https'], is_external=True, 'ikiwiki', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable) is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled(): if is_enabled():
add_shortcuts() add_shortcuts()
menu.promote_item('ikiwiki:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -93,6 +92,8 @@ def setup(helper, old_version=None):
is_enabled=is_enabled, enable=enable, disable=disable) is_enabled=is_enabled, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcuts) helper.call('post', add_shortcuts)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'ikiwiki:index')
def add_shortcuts(): def add_shortcuts():
@ -113,12 +114,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('ikiwiki', ['enable']) actions.superuser_run('ikiwiki', ['enable'])
add_shortcuts() add_shortcuts()
menu = main_menu.get('apps')
menu.promote_item('ikiwiki:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('ikiwiki', ['disable']) actions.superuser_run('ikiwiki', ['disable'])
frontpage.remove_shortcut('ikiwiki*') frontpage.remove_shortcut('ikiwiki*')
menu = main_menu.get('apps')
menu.demote_item('ikiwiki:index')
def diagnose(): def diagnose():

View File

@ -58,22 +58,17 @@ clients = clients
def init(): def init():
"""Initialize the infinoted module.""" """Initialize the infinoted module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'infinoted', 'infinoted:index', menu.add_urlname(name, 'infinoted', 'infinoted:index', short_description)
short_description)
global service global service
setup_helper = globals()['setup_helper'] setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup': if setup_helper.get_state() != 'needs-setup':
service = service_module.Service( service = service_module.Service(managed_services[0], name, ports=[
managed_services[0], 'infinoted-plinth'
name, ], is_external=True, enable=enable, disable=disable)
ports=['infinoted-plinth'],
is_external=True,
enable=enable,
disable=disable)
if service.is_enabled(): if service.is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('infinoted:index')
class InfinotedServiceView(ServiceView): class InfinotedServiceView(ServiceView):
@ -89,26 +84,20 @@ def setup(helper, old_version=None):
helper.call('post', actions.superuser_run, 'infinoted', ['setup']) helper.call('post', actions.superuser_run, 'infinoted', ['setup'])
global service global service
if service is None: if service is None:
service = service_module.Service( service = service_module.Service(managed_services[0], name, ports=[
managed_services[0], 'infinoted-plinth'
name, ], is_external=True, enable=enable, disable=disable)
ports=['infinoted-plinth'],
is_external=True,
enable=enable,
disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'infinoted:index')
def add_shortcut(): def add_shortcut():
frontpage.add_shortcut( frontpage.add_shortcut(
'infinoted', 'infinoted', name, short_description=short_description, url=None,
name, details=description, configure_url=reverse_lazy('infinoted:index'),
short_description=short_description,
url=None,
details=description,
configure_url=reverse_lazy('infinoted:index'),
login_required=False) login_required=False)
@ -116,12 +105,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('infinoted:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('infinoted') frontpage.remove_shortcut('infinoted')
menu = main_menu.get('apps')
menu.demote_item('infinoted:index')
def diagnose(): def diagnose():

View File

@ -62,6 +62,7 @@ def init():
is_enabled=is_enabled, enable=enable, disable=disable) is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('jsxc:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -75,6 +76,8 @@ def setup(helper, old_version=None):
is_enabled=is_enabled, enable=enable, disable=disable) is_enabled=is_enabled, enable=enable, disable=disable)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'jsxc:index')
def add_shortcut(): def add_shortcut():
@ -91,7 +94,11 @@ def is_enabled():
def enable(): def enable():
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('jsxc:index')
def disable(): def disable():
frontpage.remove_shortcut('jsxc') frontpage.remove_shortcut('jsxc')
menu = main_menu.get('apps')
menu.demote_item('jsxc:index')

View File

@ -18,7 +18,6 @@
FreedomBox app to configure matrix-synapse server. FreedomBox app to configure matrix-synapse server.
""" """
import json
import logging import logging
import os import os
@ -83,6 +82,7 @@ def init():
disable=disable) disable=disable)
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('matrixsynapse:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -99,6 +99,8 @@ def setup(helper, old_version=None):
['post-install']) ['post-install'])
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'matrixsynapse:index')
def add_shortcut(): def add_shortcut():
@ -123,12 +125,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('matrixsynapse', ['enable']) actions.superuser_run('matrixsynapse', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('matrixsynapse:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('matrixsynapse', ['disable']) actions.superuser_run('matrixsynapse', ['disable'])
frontpage.remove_shortcut('matrixsynapse') frontpage.remove_shortcut('matrixsynapse')
menu = main_menu.get('apps')
menu.demote_item('matrixsynapse:index')
def diagnose(): def diagnose():

View File

@ -67,9 +67,9 @@ def init():
service = service_module.Service( service = service_module.Service(
'mediawiki', name, ports=['http', 'https'], is_external=True, 'mediawiki', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable) is_enabled=is_enabled, enable=enable, disable=disable)
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('mediawiki:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -91,6 +91,8 @@ def setup(helper, old_version=None):
) )
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'mediawiki:index')
def add_shortcut(): def add_shortcut():
@ -109,12 +111,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('mediawiki', ['enable']) actions.superuser_run('mediawiki', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('mediawiki:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('mediawiki', ['disable']) actions.superuser_run('mediawiki', ['disable'])
frontpage.remove_shortcut('mediawiki') frontpage.remove_shortcut('mediawiki')
menu = main_menu.get('apps')
menu.demote_item('mediawiki:index')
def diagnose(): def diagnose():

View File

@ -83,9 +83,9 @@ def init():
service = service_module.Service(managed_services[0], name, ports=[ service = service_module.Service(managed_services[0], name, ports=[
'minetest-plinth' 'minetest-plinth'
], is_external=True, enable=enable, disable=disable) ], is_external=True, enable=enable, disable=disable)
if service.is_enabled(): if service.is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('minetest:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -98,6 +98,8 @@ def setup(helper, old_version=None):
], is_external=True, enable=enable, disable=disable) ], is_external=True, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'minetest:index')
def add_shortcut(): def add_shortcut():
@ -111,12 +113,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('minetest:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('minetest') frontpage.remove_shortcut('minetest')
menu = main_menu.get('apps')
menu.demote_item('minetest:index')
def diagnose(): def diagnose():
@ -130,8 +136,8 @@ def diagnose():
def load_augeas(): def load_augeas():
"""Initialize Augeas.""" """Initialize Augeas."""
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + aug = augeas.Augeas(
augeas.Augeas.NO_MODL_AUTOLOAD) flags=augeas.Augeas.NO_LOAD + augeas.Augeas.NO_MODL_AUTOLOAD)
aug.set('/augeas/load/Php/lens', 'Php.lns') aug.set('/augeas/load/Php/lens', 'Php.lns')
aug.set('/augeas/load/Php/incl[last() + 1]', CONFIG_FILE) aug.set('/augeas/load/Php/incl[last() + 1]', CONFIG_FILE)
aug.load() aug.load()

View File

@ -79,6 +79,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('mldonkey:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -95,6 +96,8 @@ def setup(helper, old_version=None):
is_running=is_running) is_running=is_running)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'mldonkey:index')
def add_shortcut(): def add_shortcut():
@ -119,12 +122,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('mldonkey', ['enable']) actions.superuser_run('mldonkey', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('mldonkey:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('mldonkey', ['disable']) actions.superuser_run('mldonkey', ['disable'])
frontpage.remove_shortcut('mldonkey') frontpage.remove_shortcut('mldonkey')
menu = main_menu.get('apps')
menu.demote_item('mldonkey:index')
def diagnose(): def diagnose():

View File

@ -58,8 +58,7 @@ manual_page = 'Mumble'
def init(): def init():
"""Intialize the Mumble module.""" """Intialize the Mumble module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'mumble', 'mumble:index', menu.add_urlname(name, 'mumble', 'mumble:index', short_description)
short_description)
global service global service
setup_helper = globals()['setup_helper'] setup_helper = globals()['setup_helper']
@ -70,6 +69,7 @@ def init():
if service.is_enabled(): if service.is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('mumble:index')
class MumbleServiceView(ServiceView): class MumbleServiceView(ServiceView):
@ -90,6 +90,8 @@ def setup(helper, old_version=None):
], is_external=True, enable=enable, disable=disable) ], is_external=True, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'mumble:index')
def add_shortcut(): def add_shortcut():
@ -103,12 +105,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('mumble:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('mumble') frontpage.remove_shortcut('mumble')
menu = main_menu.get('apps')
menu.demote_item('mumble:index')
def diagnose(): def diagnose():

View File

@ -67,6 +67,7 @@ def init():
if service.is_enabled() and is_setup(): if service.is_enabled() and is_setup():
add_shortcut() add_shortcut()
menu.promote_item('openvpn:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -81,6 +82,8 @@ def setup(helper, old_version=None):
if service.is_enabled() and is_setup(): if service.is_enabled() and is_setup():
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'openvpn:index')
def add_shortcut(): def add_shortcut():
@ -104,12 +107,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('openvpn:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('openvpn') frontpage.remove_shortcut('openvpn')
menu = main_menu.get('apps')
menu.demote_item('openvpn:index')
def diagnose(): def diagnose():

View File

@ -66,8 +66,7 @@ manual_page = 'Privoxy'
def init(): def init():
"""Intialize the module.""" """Intialize the module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'privoxy', 'privoxy:index', menu.add_urlname(name, 'privoxy', 'privoxy:index', short_description)
short_description)
global service global service
setup_helper = globals()['setup_helper'] setup_helper = globals()['setup_helper']
@ -78,6 +77,7 @@ def init():
if service.is_enabled(): if service.is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('privoxy:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -91,6 +91,8 @@ def setup(helper, old_version=None):
enable=enable, disable=disable) enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'privoxy:index')
def add_shortcut(): def add_shortcut():
@ -104,12 +106,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('privoxy:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('privoxy') frontpage.remove_shortcut('privoxy')
menu = main_menu.get('apps')
menu.demote_item('privoxy:index')
class PrivoxyServiceView(ServiceView): class PrivoxyServiceView(ServiceView):

View File

@ -67,8 +67,7 @@ manual_page = 'Quassel'
def init(): def init():
"""Initialize the quassel module.""" """Initialize the quassel module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'quassel', 'quassel:index', menu.add_urlname(name, 'quassel', 'quassel:index', short_description)
short_description)
global service global service
setup_helper = globals()['setup_helper'] setup_helper = globals()['setup_helper']
@ -79,6 +78,7 @@ def init():
if service.is_enabled(): if service.is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('quassel:index')
class QuasselServiceView(ServiceView): class QuasselServiceView(ServiceView):
@ -99,6 +99,8 @@ def setup(helper, old_version=None):
], is_external=True, enable=enable, disable=disable) ], is_external=True, enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'quassel:index')
def add_shortcut(): def add_shortcut():
@ -112,12 +114,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('quassel:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('quassel') frontpage.remove_shortcut('quassel')
menu = main_menu.get('apps')
menu.demote_item('quassel:index')
def diagnose(): def diagnose():

View File

@ -52,7 +52,6 @@ description = [
'<a href="http://radicale.org/clients/">supported client ' '<a href="http://radicale.org/clients/">supported client '
'application</a> is needed. Radicale can be accessed by any user ' 'application</a> is needed. Radicale can be accessed by any user '
'with a {box_name} login.'), box_name=_(cfg.box_name)), 'with a {box_name} login.'), box_name=_(cfg.box_name)),
_('Radicale provides a basic web interface, which only supports creating ' _('Radicale provides a basic web interface, which only supports creating '
'new calendars and addressbooks. It does not support adding events or ' 'new calendars and addressbooks. It does not support adding events or '
'contacts, which must be done using a separate client.'), 'contacts, which must be done using a separate client.'),
@ -87,6 +86,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('radicale:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -124,6 +124,8 @@ def setup(helper, old_version=None):
is_running=is_running) is_running=is_running)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'radicale:index')
def add_shortcut(): def add_shortcut():
@ -180,12 +182,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('radicale', ['enable']) actions.superuser_run('radicale', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('radicale:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('radicale', ['disable']) actions.superuser_run('radicale', ['disable'])
frontpage.remove_shortcut('radicale') frontpage.remove_shortcut('radicale')
menu = main_menu.get('apps')
menu.demote_item('radicale:index')
def load_augeas(): def load_augeas():

View File

@ -64,8 +64,7 @@ manual_page = 'Roundcube'
def init(): def init():
"""Intialize the module.""" """Intialize the module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'roundcube', 'roundcube:index', menu.add_urlname(name, 'roundcube', 'roundcube:index', short_description)
short_description)
global service global service
setup_helper = globals()['setup_helper'] setup_helper = globals()['setup_helper']
@ -76,6 +75,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('roundcube:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -89,6 +89,8 @@ def setup(helper, old_version=None):
service = service_module.Service( service = service_module.Service(
'roundcube', name, ports=['http', 'https'], is_external=True, 'roundcube', name, ports=['http', 'https'], is_external=True,
is_enabled=is_enabled, enable=enable, disable=disable) is_enabled=is_enabled, enable=enable, disable=disable)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'roundcube:index')
def add_shortcut(): def add_shortcut():
@ -106,12 +108,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('roundcube', ['enable']) actions.superuser_run('roundcube', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('roundcube:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('roundcube', ['disable']) actions.superuser_run('roundcube', ['disable'])
frontpage.remove_shortcut('roundcube') frontpage.remove_shortcut('roundcube')
menu = main_menu.get('apps')
menu.demote_item('roundcube:index')
def diagnose(): def diagnose():

View File

@ -56,8 +56,7 @@ manual_page = 'Searx'
def init(): def init():
"""Intialize the module.""" """Intialize the module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'searx', 'searx:index', menu.add_urlname(name, 'searx', 'searx:index', short_description)
short_description)
register_group(group) register_group(group)
global service global service
@ -70,6 +69,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('searx:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -86,12 +86,15 @@ def setup(helper, old_version=None):
], is_external=True, is_enabled=is_enabled, enable=enable, ], is_external=True, is_enabled=is_enabled, enable=enable,
disable=disable) disable=disable)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'searx:index')
def add_shortcut(): def add_shortcut():
"""Helper method to add a shortcut to the frontpage.""" """Helper method to add a shortcut to the frontpage."""
frontpage.add_shortcut('searx', name, short_description=short_description, frontpage.add_shortcut('searx', name, short_description=short_description,
url='/searx/', login_required=True, allowed_groups=[group[0]]) url='/searx/', login_required=True,
allowed_groups=[group[0]])
def get_safe_search_setting(): def get_safe_search_setting():
@ -110,12 +113,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('searx', ['enable']) actions.superuser_run('searx', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('searx:index')
def disable(): def disable():
"""Disable the module.""" """Disable the module."""
actions.superuser_run('searx', ['disable']) actions.superuser_run('searx', ['disable'])
frontpage.remove_shortcut('searx') frontpage.remove_shortcut('searx')
menu = main_menu.get('apps')
menu.demote_item('searx:index')
def diagnose(): def diagnose():

View File

@ -48,8 +48,8 @@ description = [
_('Your {box_name} can run a Shadowsocks client, that can connect to ' _('Your {box_name} can run a Shadowsocks client, that can connect to '
'a Shadowsocks server. It will also run a SOCKS5 proxy. Local ' 'a Shadowsocks server. It will also run a SOCKS5 proxy. Local '
'devices can connect to this proxy, and their data will be ' 'devices can connect to this proxy, and their data will be '
'encrypted and proxied through the Shadowsocks server.'), box_name=_( 'encrypted and proxied through the Shadowsocks server.'),
cfg.box_name)), box_name=_(cfg.box_name)),
_('To use Shadowsocks after setup, set the SOCKS5 proxy URL in your ' _('To use Shadowsocks after setup, set the SOCKS5 proxy URL in your '
'device, browser or application to http://freedombox_address:1080/') 'device, browser or application to http://freedombox_address:1080/')
] ]
@ -73,6 +73,7 @@ def init():
if service.is_enabled(): if service.is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('shadowsocks:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -86,6 +87,9 @@ def setup(helper, old_version=None):
], is_external=False, is_enabled=is_enabled, is_running=is_running, ], is_external=False, is_enabled=is_enabled, is_running=is_running,
enable=enable, disable=disable) enable=enable, disable=disable)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'shadowsocks:index')
def add_shortcut(): def add_shortcut():
"""Helper method to add a shortcut to the frontpage.""" """Helper method to add a shortcut to the frontpage."""
@ -109,12 +113,16 @@ def enable():
"""Enable service.""" """Enable service."""
actions.superuser_run('service', ['enable', managed_services[0]]) actions.superuser_run('service', ['enable', managed_services[0]])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('shadowsocks:index')
def disable(): def disable():
"""Disable service.""" """Disable service."""
actions.superuser_run('service', ['disable', managed_services[0]]) actions.superuser_run('service', ['disable', managed_services[0]])
frontpage.remove_shortcut('shadowsocks') frontpage.remove_shortcut('shadowsocks')
menu = main_menu.get('apps')
menu.demote_item('shadowsocks:index')
def diagnose(): def diagnose():

View File

@ -68,8 +68,7 @@ manual_page = 'Syncthing'
def init(): def init():
"""Intialize the module.""" """Intialize the module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'syncthing', 'syncthing:index', menu.add_urlname(name, 'syncthing', 'syncthing:index', short_description)
short_description)
register_group(group) register_group(group)
global service global service
@ -83,6 +82,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('syncthing:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -98,14 +98,15 @@ def setup(helper, old_version=None):
is_running=is_running) is_running=is_running)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'syncthing:index')
def add_shortcut(): def add_shortcut():
"""Helper method to add a shortcut to the frontpage.""" """Helper method to add a shortcut to the frontpage."""
frontpage.add_shortcut('syncthing', name, frontpage.add_shortcut(
short_description=short_description, 'syncthing', name, short_description=short_description,
url='/syncthing/', login_required=True, url='/syncthing/', login_required=True, allowed_groups=[group[0]])
allowed_groups=[group[0]])
def is_running(): def is_running():
@ -123,12 +124,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('syncthing', ['enable']) actions.superuser_run('syncthing', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('syncthing:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('syncthing', ['disable']) actions.superuser_run('syncthing', ['disable'])
frontpage.remove_shortcut('syncthing') frontpage.remove_shortcut('syncthing')
menu = main_menu.get('apps')
menu.demote_item('syncthing:index')
def diagnose(): def diagnose():

View File

@ -97,6 +97,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('tahoe:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -124,6 +125,8 @@ def post_setup(configured_domain_name):
is_running=is_running) is_running=is_running)
service.notify_enabled(None, True) service.notify_enabled(None, True)
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('tahoe:index')
def add_shortcut(): def add_shortcut():
@ -150,12 +153,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('tahoe-lafs', ['enable']) actions.superuser_run('tahoe-lafs', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('tahoe:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('tahoe-lafs', ['disable']) actions.superuser_run('tahoe-lafs', ['disable'])
frontpage.remove_shortcut('tahoe-lafs') frontpage.remove_shortcut('tahoe-lafs')
menu = main_menu.get('apps')
menu.demote_item('tahoe:index')
def diagnose(): def diagnose():

View File

@ -71,6 +71,9 @@ def init():
needs_setup = setup_helper.get_state() == 'needs-setup' needs_setup = setup_helper.get_state() == 'needs-setup'
if not needs_setup: if not needs_setup:
if utils.is_enabled():
menu.promote_item('tor:index')
global socks_service global socks_service
socks_service = service_module.Service( socks_service = service_module.Service(
'tor-socks', _('Tor Socks Proxy'), ports=['tor-socks'], 'tor-socks', _('Tor Socks Proxy'), ports=['tor-socks'],
@ -167,8 +170,8 @@ def diagnose():
ports = json.loads(output)['ports'] ports = json.loads(output)['ports']
results.append([ results.append([
_('Tor relay port available'), 'passed' _('Tor relay port available'),
if 'orport' in ports else 'failed' 'passed' if 'orport' in ports else 'failed'
]) ])
if 'orport' in ports: if 'orport' in ports:
results.append( results.append(
@ -177,16 +180,16 @@ def diagnose():
action_utils.diagnose_port_listening(ports['orport'], 'tcp6')) action_utils.diagnose_port_listening(ports['orport'], 'tcp6'))
results.append([ results.append([
_('Obfs3 transport registered'), 'passed' _('Obfs3 transport registered'),
if 'obfs3' in ports else 'failed' 'passed' if 'obfs3' in ports else 'failed'
]) ])
if 'obfs3' in ports: if 'obfs3' in ports:
results.append( results.append(
action_utils.diagnose_port_listening(ports['obfs3'], 'tcp4')) action_utils.diagnose_port_listening(ports['obfs3'], 'tcp4'))
results.append([ results.append([
_('Obfs4 transport registered'), 'passed' _('Obfs4 transport registered'),
if 'obfs4' in ports else 'failed' 'passed' if 'obfs4' in ports else 'failed'
]) ])
if 'obfs4' in ports: if 'obfs4' in ports:
results.append( results.append(

View File

@ -74,6 +74,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote('transmission:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -97,13 +98,14 @@ def setup(helper, old_version=None):
disable=disable) disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'transmission:index')
def add_shortcut(): def add_shortcut():
frontpage.add_shortcut('transmission', name, frontpage.add_shortcut(
short_description=short_description, 'transmission', name, short_description=short_description,
url='/transmission', login_required=True, url='/transmission', login_required=True, allowed_groups=[group[0]])
allowed_groups=[group[0]])
def is_enabled(): def is_enabled():
@ -116,12 +118,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('transmission', ['enable']) actions.superuser_run('transmission', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('transmission:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('transmission', ['disable']) actions.superuser_run('transmission', ['disable'])
frontpage.remove_shortcut('transmission') frontpage.remove_shortcut('transmission')
menu = main_menu.get('apps')
menu.demote_item('transmission:index')
def diagnose(): def diagnose():

View File

@ -67,8 +67,7 @@ manual_page = 'TinyTinyRSS'
def init(): def init():
"""Intialize the module.""" """Intialize the module."""
menu = main_menu.get('apps') menu = main_menu.get('apps')
menu.add_urlname(name, 'ttrss', 'ttrss:index', menu.add_urlname(name, 'ttrss', 'ttrss:index', short_description)
short_description)
register_group(group) register_group(group)
global service global service
@ -81,6 +80,7 @@ def init():
if is_enabled(): if is_enabled():
add_shortcut() add_shortcut()
menu.promote_item('ttrss:index')
def setup(helper, old_version=None): def setup(helper, old_version=None):
@ -97,6 +97,8 @@ def setup(helper, old_version=None):
disable=disable) disable=disable)
helper.call('post', service.notify_enabled, None, True) helper.call('post', service.notify_enabled, None, True)
helper.call('post', add_shortcut) helper.call('post', add_shortcut)
menu = main_menu.get('apps')
helper.call('post', menu.promote_item, 'ttrss:index')
def force_upgrade(helper, packages): def force_upgrade(helper, packages):
@ -131,12 +133,16 @@ def enable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('ttrss', ['enable']) actions.superuser_run('ttrss', ['enable'])
add_shortcut() add_shortcut()
menu = main_menu.get('apps')
menu.promote_item('ttrss:index')
def disable(): def disable():
"""Enable the module.""" """Enable the module."""
actions.superuser_run('ttrss', ['disable']) actions.superuser_run('ttrss', ['disable'])
frontpage.remove_shortcut('ttrss') frontpage.remove_shortcut('ttrss')
menu = main_menu.get('apps')
menu.demote_item('ttrss:index')
def diagnose(): def diagnose():

View File

@ -33,27 +33,54 @@
<div class="container card-container"> <div class="container card-container">
<div class="row"> <div class="row">
<div class="card-list"> <div class="card-list">
{% for item in submenu.sorted_items %} {% for item in submenu.sorted_items %}
<div class="card thumbnail"> {% if not show_secondary or not item.secondary %}
<a href="{{ item.url }}" class="nav-link"> <div class="card thumbnail">
<div class="card-title">{{ item.name }}</div> <a href="{{ item.url }}" class="nav-link">
<div class="card-icon"> <div class="card-title">{{ item.name }}</div>
{% if 'fa-' in item.icon %} <div class="card-icon">
<span class="fa {{ item.icon }}"></span> {% if 'fa-' in item.icon %}
{% else %} <span class="fa {{ item.icon }}"></span>
<img src="{% static 'theme/icons/' %}{{ item.icon }}.png"/> {% else %}
{% endif %} <img src="{% static 'theme/icons/' %}{{ item.icon }}.png"/>
</div> {% endif %}
<div class="card-description">{{ item.short_description}}</div> </div>
</a> <div class="card-description">{{ item.short_description}}</div>
</div> </a>
</div>
{% endif %}
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
</div> </div>
{% if show_secondary %}
<div class="container card-container">
<div class="card-title text-center">{% trans "Disabled" %}</div>
<div class="row">
<div class="card-list">
{% for item in submenu.sorted_items %}
{% if item.secondary %}
<div class="card thumbnail">
<a href="{{ item.url }}" class="nav-link">
<div class="card-title">{{ item.name }}</div>
<div class="card-icon">
{% if 'fa-' in item.icon %}
<span class="fa {{ item.icon }}"></span>
{% else %}
<img src="{% static 'theme/icons/' %}{{ item.icon }}.png"/>
{% endif %}
</div>
<div class="card-description">{{ item.short_description}}</div>
</a>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
{% endif %}
{% block content-container %} {% block content-container %}
{% endblock %} {% endblock %}

View File

@ -18,7 +18,6 @@
Django URLconf file containing all urls Django URLconf file containing all urls
""" """
from django.conf.urls import url from django.conf.urls import url
from django.views.generic import TemplateView
from captcha import views as cviews from captcha import views as cviews
from plinth.modules.sso.views import CaptchaLoginView from plinth.modules.sso.views import CaptchaLoginView
@ -28,24 +27,20 @@ from . import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.index, name='index'), url(r'^$', views.index, name='index'),
url(r'^language-selection/$', url(r'^language-selection/$', public(
public(views.LanguageSelectionView.as_view()), views.LanguageSelectionView.as_view()), name='language-selection'),
name='language-selection'), url(r'^apps/$', views.AppsIndexView.as_view(), name='apps'),
url(r'^apps/$',
TemplateView.as_view(template_name='apps.html'), name='apps'),
url(r'^sys/$', views.system_index, name='system'), url(r'^sys/$', views.system_index, name='system'),
# captcha urls are public # captcha urls are public
url(r'^captcha/image/(?P<key>\w+)/$', url(r'^captcha/image/(?P<key>\w+)/$', public(cviews.captcha_image),
public(cviews.captcha_image), name='captcha-image', name='captcha-image', kwargs={'scale': 1}),
kwargs={'scale': 1}), url(r'^captcha/image/(?P<key>\w+)@2/$', public(cviews.captcha_image),
url(r'^captcha/image/(?P<key>\w+)@2/$', name='captcha-image-2x', kwargs={'scale': 2}),
public(cviews.captcha_image), name='captcha-image-2x', url(r'^captcha/audio/(?P<key>\w+)/$', public(cviews.captcha_audio),
kwargs={'scale': 2}), name='captcha-audio'),
url(r'^captcha/audio/(?P<key>\w+)/$', url(r'^captcha/refresh/$', public(cviews.captcha_refresh),
public(cviews.captcha_audio), name='captcha-audio'), name='captcha-refresh'),
url(r'^captcha/refresh/$',
public(cviews.captcha_refresh), name='captcha-refresh'),
# locked url from django-axes # locked url from django-axes
url(r'locked/$', public(CaptchaLoginView.as_view()), name='locked_out'), url(r'locked/$', public(CaptchaLoginView.as_view()), name='locked_out'),

View File

@ -66,6 +66,16 @@ def index(request):
}) })
class AppsIndexView(TemplateView):
"""View for apps index"""
template_name = 'apps.html'
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
context['show_secondary'] = True
return context
def system_index(request): def system_index(request):
"""Serve the system index page.""" """Serve the system index page."""
disk_views.warn_about_low_disk_space(request) disk_views.warn_about_low_disk_space(request)
@ -186,7 +196,8 @@ class SetupView(TemplateView):
# Perform expensive operation only if needed # Perform expensive operation only if needed
if not context['setup_current_operation']: if not context['setup_current_operation']:
context['package_manager_is_busy'] = package.is_package_manager_busy() context[
'package_manager_is_busy'] = package.is_package_manager_busy()
return context return context