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)