diff --git a/actions/radicale b/actions/radicale
index bebe730cf..a5f905a6b 100755
--- a/actions/radicale
+++ b/actions/radicale
@@ -38,6 +38,8 @@ def parse_arguments():
subparsers.add_parser('setup', help='Setup Radicale configuration')
subparsers.add_parser('enable', help='Enable Radicale service')
subparsers.add_parser('disable', help='Disable Radicale service')
+ configure = subparsers.add_parser('configure', help='configure various options')
+ configure.add_argument('--rights_type', help='Set the rights type for radicale')
return parser.parse_args()
@@ -64,6 +66,16 @@ def subcommand_setup(_):
action_utils.webserver_enable('radicale-plinth')
+def subcommand_configure(arguments):
+ """Sets the radicale rights type to a particular value"""
+ aug = load_augeas()
+ aug.set('/files' + CONFIG_FILE + '/rights/type', arguments.rights_type)
+ aug.save()
+
+ action_utils.service_restart('radicale')
+ action_utils.webserver_enable('radicale-plinth')
+
+
def subcommand_enable(_):
"""Start service."""
action_utils.service_enable('radicale')
diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py
index c3390890d..1b060b7a2 100644
--- a/plinth/modules/radicale/__init__.py
+++ b/plinth/modules/radicale/__init__.py
@@ -18,19 +18,12 @@
"""
Plinth module for radicale.
"""
-import augeas
-from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
-
-from plinth.forms import ServiceForm
-from django import forms
from plinth import actions
from plinth import action_utils
from plinth import cfg
from plinth import service as service_module
-from plinth.utils import format_lazy
-from plinth.views import ServiceView
version = 1
@@ -45,33 +38,6 @@ managed_packages = ['radicale']
title = _('Calendar and Addressbook (Radicale)')
-description = [
- format_lazy(
- _('Radicale is a CalDAV and CardDAV server. It allows synchronization '
- 'and sharing of scheduling and contact data. To use Radicale, a '
- ' supported client application '
- 'is needed. Radicale can be accessed by any user with a {box_name} '
- 'login.'), box_name=_(cfg.box_name)),
-]
-
-CONFIG_FILE = '/etc/radicale/config'
-DEFAULT_FILE = '/etc/default/radicale'
-
-
-def load_augeas():
- """Prepares the augeas"""
- aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
- augeas.Augeas.NO_MODL_AUTOLOAD)
- aug.set('/augeas/load/Shellvars/lens', 'Shellvars.lns')
- aug.set('/augeas/load/Shellvars/incl[last() + 1]', DEFAULT_FILE)
-
- # INI file lens
- aug.set('/augeas/load/Puppet/lens', 'Puppet.lns')
- aug.set('/augeas/load/Puppet/incl[last() + 1]', CONFIG_FILE)
- aug.load()
- return aug
-
def init():
"""Initialize the radicale module."""
@@ -84,53 +50,6 @@ def init():
enable=enable, disable=disable)
-def get_rights_value():
- """Returns the current Rights value"""
- aug = load_augeas()
- value = aug.get('/files' + CONFIG_FILE + '/rights/type')
- aug.close()
- return value
-
-
-def set_rights_value(rights_value):
- """Changes the rights in the config file"""
- aug = load_augeas()
- aug.set('/files' + CONFIG_FILE + '/rights/type', rights_value)
- aug.save()
- aug.close()
-
-
-class RadicaleForm(ServiceForm):
- """Specialized configuration form for radicale service."""
- CHOICES = [('authenticated', 'Authenticated'),
- ('owner_only', 'Owner Only'),
- ('owner_write', 'Owner Write'), ]
- rights = forms.ChoiceField(choices=CHOICES, required=True,
- widget=forms.RadioSelect())
-
-
-class RadicaleServiceView(ServiceView):
- """A specialized view for configuring radicale service."""
- service_id = managed_services[0]
- form_class = RadicaleForm
- diagnostics_module_name = 'radicale'
- description = description
-
- def get_initial(self):
- """Return the values to fill in the form"""
- initial = super().get_initial()
- initial['rights'] = get_rights_value()
- return initial
-
- def form_valid(self, form):
- """Change the access control of Radicale service."""
- data = form.cleaned_data
- if get_rights_value() != data['rights']:
- set_rights_value(data['rights'])
- messages.success(self.request, _('Status Changed'))
- return super().form_valid(form)
-
-
def setup(helper, old_version=None):
"""Install and configure the module."""
helper.install(managed_packages)
diff --git a/plinth/modules/radicale/forms.py b/plinth/modules/radicale/forms.py
new file mode 100644
index 000000000..a88324bcf
--- /dev/null
+++ b/plinth/modules/radicale/forms.py
@@ -0,0 +1,10 @@
+from plinth.forms import ServiceForm
+from django import forms
+
+class RadicaleForm(ServiceForm):
+ """Specialized configuration form for radicale service."""
+ CHOICES = [('authenticated', 'Authenticated'),
+ ('owner_only', 'Owner Only'),
+ ('owner_write', 'Owner Write'), ]
+ rights = forms.ChoiceField(choices=CHOICES, required=True,
+ widget=forms.RadioSelect())
diff --git a/plinth/modules/radicale/urls.py b/plinth/modules/radicale/urls.py
index 5a6c873fc..2616746bf 100644
--- a/plinth/modules/radicale/urls.py
+++ b/plinth/modules/radicale/urls.py
@@ -21,7 +21,7 @@ URLs for the radicale module.
from django.conf.urls import url
-from plinth.modules.radicale import RadicaleServiceView
+from .views import RadicaleServiceView
urlpatterns = [
diff --git a/plinth/modules/radicale/views.py b/plinth/modules/radicale/views.py
new file mode 100644
index 000000000..a387246b8
--- /dev/null
+++ b/plinth/modules/radicale/views.py
@@ -0,0 +1,84 @@
+#
+# This file is part of Plinth.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+
+import augeas
+
+from django.contrib import messages
+from django.utils.translation import ugettext_lazy as _
+
+from plinth.views import ServiceView
+from plinth import cfg
+from plinth.utils import format_lazy
+from plinth import actions
+
+from .forms import RadicaleForm
+
+CONFIG_FILE = '/etc/radicale/config'
+DEFAULT_FILE = '/etc/default/radicale'
+
+description = [
+ format_lazy(
+ _('Radicale is a CalDAV and CardDAV server. It allows synchronization '
+ 'and sharing of scheduling and contact data. To use Radicale, a '
+ ' supported client application '
+ 'is needed. Radicale can be accessed by any user with a {box_name} '
+ 'login.'), box_name=_(cfg.box_name)),
+]
+
+
+def load_augeas():
+ """Prepares the augeas"""
+ aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
+ augeas.Augeas.NO_MODL_AUTOLOAD)
+ aug.set('/augeas/load/Shellvars/lens', 'Shellvars.lns')
+ aug.set('/augeas/load/Shellvars/incl[last() + 1]', DEFAULT_FILE)
+
+ # INI file lens
+ aug.set('/augeas/load/Puppet/lens', 'Puppet.lns')
+ aug.set('/augeas/load/Puppet/incl[last() + 1]', CONFIG_FILE)
+ aug.load()
+ return aug
+
+
+def get_rights_value():
+ """Returns the current Rights value"""
+ aug = load_augeas()
+ value = aug.get('/files' + CONFIG_FILE + '/rights/type')
+ return value
+
+
+class RadicaleServiceView(ServiceView):
+ """A specialized view for configuring radicale service."""
+ service_id = 'radicale'
+ form_class = RadicaleForm
+ diagnostics_module_name = 'radicale'
+ description = description
+
+ def get_initial(self):
+ """Return the values to fill in the form"""
+ initial = super().get_initial()
+ initial['rights'] = get_rights_value()
+ return initial
+
+ def form_valid(self, form):
+ """Change the access control of Radicale service."""
+ data = form.cleaned_data
+ if get_rights_value() != data['rights']:
+ actions.superuser_run('radicale', ['configure', '--rights_type', data['rights']])
+ messages.success(self.request, _('Status Changed'))
+ return super().form_valid(form)