From 6cd6742d8fbd9e9e24e8fe057aa1854e5dcad845 Mon Sep 17 00:00:00 2001 From: Veiko Aasa Date: Thu, 3 Oct 2019 15:17:05 +0000 Subject: [PATCH] ikiwiki: Allow full Unicode text in wiki/blog title names Closes: #1523 Signed-off-by: Veiko Aasa [sunil@medhas.org Fix issue with enabling shortcuts on daemon start] [sunil@medhas.org Run isort and yapf] [sunil@medhas.org Prevent change in i18n string] [sunil@medhas.org Fix flake8 warning about uniform return values] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- actions/ikiwiki | 30 +++++++++++++++---- plinth/modules/ikiwiki/__init__.py | 22 +++++++++----- .../data/etc/ikiwiki/plinth-blog.setup | 3 +- .../data/etc/ikiwiki/plinth-wiki.setup | 3 +- plinth/modules/ikiwiki/forms.py | 6 +--- .../ikiwiki/templates/ikiwiki_configure.html | 10 +++---- plinth/modules/ikiwiki/urls.py | 3 +- plinth/modules/ikiwiki/views.py | 18 ++++++----- 8 files changed, 60 insertions(+), 35 deletions(-) diff --git a/actions/ikiwiki b/actions/ikiwiki index e753a684f..cc7408bd9 100755 --- a/actions/ikiwiki +++ b/actions/ikiwiki @@ -21,6 +21,7 @@ Configuration helper for ikiwiki import argparse import os +import re import shutil import subprocess import sys @@ -65,14 +66,29 @@ def subcommand_setup(_): setup() -def subcommand_get_sites(_): - """Get wikis and blogs.""" +def get_title(site): + """Get blog or wiki title""" try: - sites = os.listdir(SITE_PATH) - print('\n'.join(sites)) + with open(os.path.join(SITE_PATH, site, 'index.html')) as index_file: + match = re.search(r'(.*)', index_file.read()) + if match: + return match[1] except FileNotFoundError: pass + return site + + +def subcommand_get_sites(_): + """Get wikis and blogs.""" + if os.path.exists(SITE_PATH): + for site in os.listdir(SITE_PATH): + if not os.path.isdir(os.path.join(SITE_PATH, site)): + continue + + title = get_title(site) + print(site, title) + def subcommand_create_wiki(arguments): """Create a wiki.""" @@ -80,7 +96,8 @@ def subcommand_create_wiki(arguments): proc = subprocess.Popen([ 'ikiwiki', '-setup', SETUP_WIKI, arguments.wiki_name, arguments.admin_name - ], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) + ], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, + env=dict(os.environ, PERL_UNICODE='AS')) outs, errs = proc.communicate(input=pw_bytes + b'\n' + pw_bytes) print(outs) print(errs) @@ -92,7 +109,8 @@ def subcommand_create_blog(arguments): proc = subprocess.Popen([ 'ikiwiki', '-setup', SETUP_BLOG, arguments.blog_name, arguments.admin_name - ], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) + ], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, + env=dict(os.environ, PERL_UNICODE='AS')) outs, errs = proc.communicate(input=pw_bytes + b'\n' + pw_bytes) print(outs) print(errs) diff --git a/plinth/modules/ikiwiki/__init__.py b/plinth/modules/ikiwiki/__init__.py index 657b39e99..64e0a1a8a 100644 --- a/plinth/modules/ikiwiki/__init__.py +++ b/plinth/modules/ikiwiki/__init__.py @@ -29,7 +29,7 @@ from plinth.modules.firewall.components import Firewall from plinth.modules.users import register_group from plinth.utils import format_lazy -from .manifest import backup, clients # noqa, pylint: disable=unused-import +from .manifest import backup, clients # noqa, pylint: disable=unused-import version = 1 @@ -79,10 +79,7 @@ class IkiwikiApp(app_module.App): parent_url_name='apps') self.add(menu_item) - sites = actions.run('ikiwiki', ['get-sites']).split('\n') - sites = [name for name in sites if name != ''] - for site in sites: - self.add_shortcut(site) + self.refresh_sites() firewall = Firewall('firewall-ikiwiki', name, ports=['http', 'https'], is_external=True) @@ -91,9 +88,9 @@ class IkiwikiApp(app_module.App): webserver = Webserver('webserver-ikiwiki', 'ikiwiki-plinth') self.add(webserver) - def add_shortcut(self, site): + def add_shortcut(self, site, title): """Add an ikiwiki shortcut to frontpage.""" - shortcut = frontpage.Shortcut('shortcut-ikiwiki-' + site, site, + shortcut = frontpage.Shortcut('shortcut-ikiwiki-' + site, title, icon='ikiwiki', url='/ikiwiki/' + site, clients=clients) self.add(shortcut) @@ -104,6 +101,17 @@ class IkiwikiApp(app_module.App): component = self.remove('shortcut-ikiwiki-' + site) component.remove() # Remove from global list. + def refresh_sites(self): + """Refresh blog and wiki list""" + sites = actions.run('ikiwiki', ['get-sites']).split('\n') + sites = [name.split(' ', 1) for name in sites if name != ''] + + for site in sites: + if not 'shortcut-ikiwiki-' + site[0] in self.components: + self.add_shortcut(site[0], site[1]) + + return sites + def init(): """Initialize the ikiwiki module.""" diff --git a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup index cde81794d..b7a83a418 100644 --- a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup +++ b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup @@ -10,7 +10,8 @@ if (($wikiname eq "") || ($admin eq "")) { exit; } -our $wikiname_short=IkiWiki::Setup::Automator::sanitize_wikiname($wikiname); +our $wikiname_short=IkiWiki::Setup::Automator::sanitize_wikiname($wikiname . "_"); +if (length($wikiname_short)>1) { chop($wikiname_short) }; IkiWiki::Setup::Automator->import( wikiname => $wikiname, diff --git a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup index 9b7b51998..1abc066ec 100644 --- a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup +++ b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup @@ -10,7 +10,8 @@ if (($wikiname eq "") || ($admin eq "")) { exit; } -our $wikiname_short=IkiWiki::Setup::Automator::sanitize_wikiname($wikiname); +our $wikiname_short=IkiWiki::Setup::Automator::sanitize_wikiname($wikiname . "_"); +if (length($wikiname_short)>1) { chop($wikiname_short) }; IkiWiki::Setup::Automator->import( wikiname => $wikiname, diff --git a/plinth/modules/ikiwiki/forms.py b/plinth/modules/ikiwiki/forms.py index a6f6faed1..433d9f0b7 100644 --- a/plinth/modules/ikiwiki/forms.py +++ b/plinth/modules/ikiwiki/forms.py @@ -21,7 +21,6 @@ Forms for configuring ikiwiki from django import forms from django.utils.translation import ugettext_lazy as _ -from django.core.validators import RegexValidator class IkiwikiCreateForm(forms.Form): @@ -30,10 +29,7 @@ class IkiwikiCreateForm(forms.Form): label=_('Type'), choices=[('wiki', 'Wiki'), ('blog', 'Blog')]) - name = forms.CharField( - label=_('Name'), - help_text=_('Only alphanumeric characters are allowed.'), - validators=[RegexValidator(regex='^[a-zA-Z0-9]+$')]) + name = forms.CharField(label=_('Name')) admin_name = forms.CharField(label=_('Admin Account Name')) diff --git a/plinth/modules/ikiwiki/templates/ikiwiki_configure.html b/plinth/modules/ikiwiki/templates/ikiwiki_configure.html index fa822d24f..36bce33d2 100644 --- a/plinth/modules/ikiwiki/templates/ikiwiki_configure.html +++ b/plinth/modules/ikiwiki/templates/ikiwiki_configure.html @@ -48,17 +48,17 @@
{% for site in sites %} {% endfor %} diff --git a/plinth/modules/ikiwiki/urls.py b/plinth/modules/ikiwiki/urls.py index cd66d97f5..bb1215f11 100644 --- a/plinth/modules/ikiwiki/urls.py +++ b/plinth/modules/ikiwiki/urls.py @@ -24,7 +24,6 @@ from . import views urlpatterns = [ url(r'^apps/ikiwiki/$', views.IkiwikiAppView.as_view(), name='index'), - url(r'^apps/ikiwiki/(?P[\w.@+-]+)/delete/$', views.delete, - name='delete'), + url(r'^apps/ikiwiki/(?P.+)/delete/$', views.delete, name='delete'), url(r'^apps/ikiwiki/create/$', views.create, name='create'), ] diff --git a/plinth/modules/ikiwiki/views.py b/plinth/modules/ikiwiki/views.py index bddc53a41..4db5a0ae4 100644 --- a/plinth/modules/ikiwiki/views.py +++ b/plinth/modules/ikiwiki/views.py @@ -43,7 +43,7 @@ class IkiwikiAppView(views.AppView): def get_context_data(self, **kwargs): """Return the context data for rendering the template view.""" - sites = actions.run('ikiwiki', ['get-sites']).split('\n') + sites = ikiwiki.app.refresh_sites() sites = [name for name in sites if name != ''] context = super().get_context_data(**kwargs) @@ -67,9 +67,9 @@ def create(request): form.cleaned_data['admin_name'], form.cleaned_data['admin_password']) - site = form.cleaned_data['name'].replace(' ', '') - shortcut = ikiwiki.app.add_shortcut(site) - shortcut.enable() + ikiwiki.app.refresh_sites() + if ikiwiki.app.is_enabled(): + ikiwiki.app.set_enabled(True) return redirect(reverse_lazy('ikiwiki:index')) else: @@ -118,20 +118,22 @@ def delete(request, name): On GET, display a confirmation page. On POST, delete the wiki/blog. """ + title = ikiwiki.app.components['shortcut-ikiwiki-' + name].name if request.method == 'POST': try: actions.superuser_run('ikiwiki', ['delete', '--name', name]) ikiwiki.app.remove_shortcut(name) - messages.success(request, _('{name} deleted.').format(name=name)) + messages.success(request, + _('{title} deleted.').format(title=title)) except actions.ActionError as error: messages.error( request, - _('Could not delete {name}: {error}').format( - name=name, error=error)) + _('Could not delete {title}: {error}').format( + title=title, error=error)) return redirect(reverse_lazy('ikiwiki:index')) return TemplateResponse(request, 'ikiwiki_delete.html', { 'title': ikiwiki.name, - 'name': name + 'name': title })