From aef0dcd381aa64d45c9d7f8347c58e2181938577 Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Mon, 18 Jan 2021 00:53:32 +0100 Subject: [PATCH 01/58] test: help: Add help view tests Signed-off-by: Fioddor Superconcentrado [sunil: Yapf and isort, flak8 warnings, spelling] [sunil: Drop debugging code] [sunil: Use pytest parametrize, skip marks] [sunil: Minor test improvements] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/help/tests/test_views.py | 275 ++++++++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 plinth/modules/help/tests/test_views.py diff --git a/plinth/modules/help/tests/test_views.py b/plinth/modules/help/tests/test_views.py new file mode 100644 index 000000000..3ab4c53ab --- /dev/null +++ b/plinth/modules/help/tests/test_views.py @@ -0,0 +1,275 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Tests for help views. + +Design: - Make tests independent from URL policy by using Django names instead + of URLs to call the help module. For this, some additional fixture + work is needed: pytestmark and fixture_app_urls(). + +Pending: - status log + +""" + +import pathlib +import subprocess +from unittest.mock import patch + +import pytest +from django import urls +from django.conf import settings +from django.http import Http404 + +from plinth import module_loader +from plinth.modules.help import views + +# For all tests, use plinth.urls instead of urls configured for testing +pytestmark = pytest.mark.urls('plinth.urls') + + +def _is_page(response): + """Minimal check on help views.""" + return (response.status_code == 200 and 'title' in response.context_data + and response['content-type'] == 'text/html; charset=utf-8') + + +@pytest.fixture(autouse=True, scope='module') +def fixture_app_urls(): + """Make sure app's URLs are part of plinth.urls.""" + with patch('plinth.module_loader._modules_to_load', new=[]) as modules, \ + patch('plinth.urls.urlpatterns', new=[]): + modules.append('plinth.modules.help') + module_loader.include_urls() + yield + + +@pytest.mark.parametrize("view_name, view", ( + ('contribute', views.contribute), + ('feedback', views.feedback), + ('support', views.support), + ('index', views.index), +)) +def test_simple_help_pages(rf, view_name, view): + """Simple common test for certain help views.""" + response = view(rf.get(urls.reverse('help:' + view_name))) + assert _is_page(response) + + +def test_about(rf): + """Test some expected items in about view.""" + manual_url = urls.reverse('help:manual') + response = views.about(rf.get(manual_url)) + assert _is_page(response) + for item in ('version', 'new_version', 'os_release'): + assert item in response.context_data + + +# --------------------------------------------------------------------------- +# Tests for serving the offline user guide ( the "manual") +# +# The manual can be requested: +# - Either complete on a single page or page by page. +# - Specifying (or not) the language. +# - The complete manual can be requested in HTML or PDF formats. +# +# Expected Behaviour Rules: +# - If the page isn't specified, the help module returns the full manual in +# one single page. +# - The help module tries first to return the page in the specified +# language. If not found (either that page doesn't exist or the language +# wasn't secified) it falls back to its twin in the fallback language. If +# it is neither available, it shows a proper error message. +# +# Design Decisions: +# - The PDF manual has a separate function to serve it. +# - The 'Manual' page doesn't exist as such. However there are files named +# 'Manual' containing the complete full manual in one single page. +# - In order to avoid loops, the fallback language is intercepted and +# treated specifically. +# - Problem: Requesting a missing page in a language that happens to be +# the fallback one, missing it would cause the help module to +# redirect to the same page, closing thereby a neverending loop. +# The web served would probably break that loop, but it would +# cause confusion to the user. +# - CI environments don't setup FreedomBox completely. A regular setup run is +# impractically slow (10-15 mins), if even posible. Compiling and deploying +# the manual is just 3 extra lines in .gitlab-ci.yml file: +# - make -C doc +# - mkdir -p /usr/share/freedombox/manual +# - cp -r doc/manual /usr/share/freedombox/manual +# But again, this causes the 4 minutes of test preparation to bump to 6. +# It's not worth for just testing the offline manual, so the tests guess if +# they are running in a restricted environment and skip. + +canary = pathlib.Path('doc/manual/en/Coturn.part.html') +TRANSLATIONS = ('es', ) +MANUAL_PAGES = ('Apache_userdir', 'APU', 'Backups', 'BananaPro', 'BeagleBone', + 'bepasty', 'Bind', 'Calibre', 'Cockpit', 'Configure', + 'Contribute', 'Coturn', 'Cubieboard2', 'Cubietruck', + 'DateTime', 'Debian', 'Deluge', 'Developer', 'Diagnostics', + 'Download', 'DynamicDNS', 'ejabberd', 'Firewall', + 'freedombox-manual', 'GettingHelp', 'GitWeb', 'Hardware', + 'I2P', 'Ikiwiki', 'Infinoted', 'Introduction', 'JSXC', + 'LetsEncrypt', 'Maker', 'MatrixSynapse', 'MediaWiki', + 'Minetest', 'MiniDLNA', 'MLDonkey', 'Monkeysphere', 'Mumble', + 'NameServices', 'Networks', 'OpenVPN', 'OrangePiZero', + 'PageKite', 'pcDuino3', 'Performance', 'PineA64+', + 'PioneerEdition', 'Plinth', 'Power', 'Privoxy', 'Quassel', + 'QuickStart', 'Radicale', 'RaspberryPi2', 'RaspberryPi3B+', + 'RaspberryPi3B', 'RaspberryPi4B', 'ReleaseNotes', 'Rock64', + 'RockPro64', 'Roundcube', 'Samba', 'Searx', 'SecureShell', + 'Security', 'ServiceDiscovery', 'Shadowsocks', 'Sharing', + 'Snapshots', 'Storage', 'Syncthing', 'TinyTinyRSS', 'Tor', + 'Transmission', 'Upgrades', 'USBWiFi', 'Users', 'VirtualBox', + 'WireGuard') +_restricted_reason = ('Needs installed manual. ' + 'CI speed-optimized workspace does not provide it.') +not_restricted_environment = pytest.mark.skipif(not canary.exists(), + reason=_restricted_reason) + + +@pytest.mark.parametrize('lang', (None, '-')) +def test_full_default_manual(rf, lang): + """Test request for the full default manual. + + Expected: Redirect to the full manual in the fallback language. + + """ + manual_url = urls.reverse('help:manual') + response = views.manual(rf.get(manual_url), lang=lang) + assert response.status_code == 302 + assert response.url == '/help/manual/en/' + + # With a language cookie set + request = rf.get(manual_url) + request.COOKIES[settings.LANGUAGE_COOKIE_NAME] = TRANSLATIONS[0] + response = views.manual(request, lang=lang) + assert response.status_code == 302 + assert response.url == f'/help/manual/{TRANSLATIONS[0]}/' + + +@pytest.mark.parametrize('lang', (None, '-')) +def test_default_manual_by_pages(rf, lang): + """Test page-specific requests for the (default) manual. + + Expected: Redirect to their respective twins in the fallback language. + Pending.: Redirect pages with plus-sign '+' in their name. + + """ + manual_url = urls.reverse('help:manual') + for page in MANUAL_PAGES: + if '+' in page or 'Manual' in page: # Pine64+ & RaspberryPi3B+ + continue + + response = views.manual(rf.get(manual_url), lang=lang, page=page) + assert response.status_code == 302 + assert response.url == '/help/manual/en/' + page + + # With a language cookie set + request = rf.get(manual_url) + request.COOKIES[settings.LANGUAGE_COOKIE_NAME] = TRANSLATIONS[0] + response = views.manual(request, lang=lang, page=page) + assert response.status_code == 302 + assert response.url == f'/help/manual/{TRANSLATIONS[0]}/{page}' + + +@not_restricted_environment +def test_specific_full_manual_translation(rf): + """Test request for specific translated manuals. + + Expected: All return a page. + + """ + manual_url = urls.reverse('help:manual') + for lang in ('es', 'en'): + response = views.manual(rf.get(manual_url), lang=lang) + assert _is_page(response) + + +@not_restricted_environment +def test_specific_manual_translation_by_pages(rf): + """Test that translated-page-specific requests. + + Expected: All known page names return pages. + + """ + manual_url = urls.reverse('help:manual') + for lang in ('es', 'en'): + for page in MANUAL_PAGES: + response = views.manual(rf.get(manual_url), page=page, lang=lang) + assert _is_page(response) + + +@not_restricted_environment +def test_full_manual_requested_by_page_name(rf): + """Test requests for 'Manual'. + + Note: 'Manual' is a file, not a manual page. + Expected: Return a proper not found message (HTTP 404) + Currently: Non fallback languages return a page. + This is wrong, but doesn't cause any harm. + + """ + manual_url = urls.reverse('help:manual') + page = 'Manual' + + for lang in TRANSLATIONS: + response = views.manual(rf.get(manual_url), page=page, lang=lang) + assert _is_page(response) + + with pytest.raises(Http404): + views.manual(rf.get(manual_url), page=page, lang='en') + + +def test_missing_page(rf): + """Test requests for missing pages. + + Expected: + - Unspecified language: Fall back to its fallback twin. + - Translated languages: Fall back to its fallback twin. + - Fallback language...: Return a proper not found message (HTTP 404) + - Unknown languages...: Fall back to its fallback twin. + + """ + manual_url = urls.reverse('help:manual') + page = 'unknown' + for lang in TRANSLATIONS + ('unknown', None): + response = views.manual(rf.get(manual_url), page=page, lang=lang) + assert response.status_code == 302 + assert response.url == '/help/manual/en/unknown' + + with pytest.raises(Http404): + views.manual(rf.get(manual_url), page=page, lang='en') + + +@not_restricted_environment +def test_download_full_manual_file(rf, tmp_path): + """Test download of manual. + + Design: - Downloads the default manual, a translated one and the + fallback translation. None should fail. Then compares + them. + - Call diff command for fast comparision. Comparing the + over 10MB bytestrings in python is insanely slow. + + """ + + def _diff(file_name_a, file_name_b, same): + file_a = tmp_path / file_name_a + file_b = tmp_path / file_name_b + process = subprocess.run( + ['diff', '-q', str(file_a), str(file_b)], check=False) + assert bool(process.returncode) != same + + url = urls.reverse('help:manual') + manuals = { + 'unspecified': rf.get(url), + 'translated': rf.get(url, HTTP_ACCEPT_LANGUAGE='es'), + 'fallback': rf.get(url, HTTP_ACCEPT_LANGUAGE='en') + } + for name, request in manuals.items(): + response = views.download_manual(request) + assert response.status_code == 200 + file = tmp_path / (name + '.pdf') + file.write_bytes(response.content) + + _diff('fallback.pdf', 'unspecified.pdf', same=True) + _diff('fallback.pdf', 'translated.pdf', same=False) From e11ce5f58f42842088dda2ba4058c89a77fbfc24 Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Mon, 8 Feb 2021 18:43:05 +0100 Subject: [PATCH 02/58] test: Add tests for action utilities Signed-off-by: Fioddor Superconcentrado [sunil: Minor refactoring, relax a test to make it work on CI] [sunil: Run tests only when systemd, ip commands are available] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/tests/test_action_utils.py | 139 ++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 plinth/tests/test_action_utils.py diff --git a/plinth/tests/test_action_utils.py b/plinth/tests/test_action_utils.py new file mode 100644 index 000000000..b347cedae --- /dev/null +++ b/plinth/tests/test_action_utils.py @@ -0,0 +1,139 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Test module for key/value store. +""" + +import json +import pathlib +import subprocess +from unittest.mock import patch + +import pytest + +from plinth.action_utils import (get_addresses, get_hostname, + is_systemd_running, service_action, + service_disable, service_enable, + service_is_enabled, service_is_running, + service_reload, service_restart, + service_start, service_stop, + service_try_restart, service_unmask) + +UNKNOWN = 'unknowndeamon' + +systemctl_path = pathlib.Path('/usr/bin/systemctl') +systemd_installed = pytest.mark.skipif(not systemctl_path.exists(), + reason='systemd not available') + +ip_path = pathlib.Path('/usr/bin/ip') +ip_installed = pytest.mark.skipif(not ip_path.exists(), + reason='ip command not available') + + +@patch('os.path.exists') +def test_is_systemd_running(mock): + """Trivial white box test for a trivial implementation.""" + mock.return_value = True + assert is_systemd_running() + mock.return_value = False + assert not is_systemd_running() + + +@systemd_installed +def test_service_checks(): + """Test basic checks on status of an arbitrary service.""" + assert not service_is_running(UNKNOWN) + assert not service_is_enabled(UNKNOWN) + + # expected is best if: generic. Alternatives: systemd-sysctl, logrotate + expected = 'networking' + if not service_is_running(expected): + pytest.skip(f'Needs service {expected} running.') + + assert service_is_enabled(expected) + + +@pytest.mark.usefixtures('needs_root') +@systemd_installed +def test_service_enable_and_disable(): + """Test enabling and disabling of an arbitrary service.""" + # service is best if: non-essential part of FreedomBox that restarts fast + service = 'unattended-upgrades' + if not service_is_enabled(service): + reason = f'Needs service {service} enabled.' + pytest.skip(reason) + + service_disable(service) + assert not service_is_running(service) + service_enable(service) + assert service_is_running(service) + + # Ignore unknown services, don't fail: + service_disable(UNKNOWN) + service_enable(UNKNOWN) + + +@patch('plinth.action_utils.service_action') +@systemd_installed +def test_service_actions(mock): + """Trivial white box test for trivial implementations.""" + service_start(UNKNOWN) + mock.assert_called_with(UNKNOWN, 'start') + service_stop(UNKNOWN) + mock.assert_called_with(UNKNOWN, 'stop') + service_restart(UNKNOWN) + mock.assert_called_with(UNKNOWN, 'restart') + service_try_restart(UNKNOWN) + mock.assert_called_with(UNKNOWN, 'try-restart') + service_reload(UNKNOWN) + mock.assert_called_with(UNKNOWN, 'reload') + + +@pytest.mark.usefixtures('needs_root') +@systemd_installed +def test_service_unmask(): + """Test unmasking of an arbitrary masked service.""" + + def is_masked(service): + process = subprocess.run([ + 'systemctl', 'list-unit-files', '--output=json', + service + '.service' + ], stdout=subprocess.PIPE, check=False) + output = json.loads(process.stdout) + return output[0]['state'] == 'masked' if output else False + + # SERVICE is best if: part of FreedomBox, so we can mess with least risk. + service = 'samba-ad-dc' + if not is_masked(service): + pytest.skip(f'Needs service {service} masked.') + + service_unmask(service) + assert not is_masked(service) + + service_action(service, 'mask') + assert is_masked(service) + + +def test_get_hostname(): + """get_hostname returns a string. + + In fact, the maximum length for a hostname is 253 characters, but + anything longer than 80 is very suspicious, so we fail the test. + + To avoid error messages pass as hostnames we seek and fail if we find + some unexpected characters. + """ + hostname = get_hostname() + assert hostname + assert isinstance(hostname, str) + assert len(hostname) < 80 + for char in ' ,:;!?=$%&@*+()[]{}<>"\'': + assert char not in hostname + + +@ip_installed +def test_get_addresses(): + """Test that any FreedomBox has some addresses.""" + ips = get_addresses() + assert len(ips) > 3 # min: ip, 2x'localhost', hostname + for address in ips: + assert address['kind'] in ('4', '6') From b6aa6bab09448b1ec01422025b563fd7b9146af0 Mon Sep 17 00:00:00 2001 From: 109247019824 Date: Tue, 28 Sep 2021 14:35:34 +0000 Subject: [PATCH 03/58] Translated using Weblate (Bulgarian) Currently translated at 7.1% (109 of 1514 strings) --- plinth/locale/bg/LC_MESSAGES/django.po | 174 ++++++++++++++----------- 1 file changed, 96 insertions(+), 78 deletions(-) diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 1ae700439..2358e844c 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-27 18:44-0400\n" -"PO-Revision-Date: 2021-09-15 21:34+0000\n" +"PO-Revision-Date: 2021-09-29 14:38+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian \n" @@ -138,11 +138,11 @@ msgstr "Откриване на услуги" #: plinth/modules/avahi/__init__.py:69 msgid "Local Network Domain" -msgstr "Домейн на местната мрежа" +msgstr "Домейн в местната мрежа" #: plinth/modules/backups/__init__.py:34 msgid "Backups allows creating and managing backup archives." -msgstr "" +msgstr "Създаване и управление на архиви с резервни копия." #: plinth/modules/backups/__init__.py:54 plinth/modules/backups/__init__.py:200 #: plinth/modules/backups/__init__.py:245 @@ -160,7 +160,7 @@ msgstr "" #: plinth/modules/backups/__init__.py:203 msgid "Enable a Backup Schedule" -msgstr "" +msgstr "Включване на резервни копия по график" #: plinth/modules/backups/__init__.py:207 #: plinth/modules/backups/__init__.py:254 @@ -175,49 +175,60 @@ msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" +"Резервно копие по график се провали. Последните {error_count} опита за " +"създаване на резервно копие са безуспешни. Последната грешка е: " +"{error_message}" #: plinth/modules/backups/__init__.py:250 msgid "Error During Backup" -msgstr "" +msgstr "Грешка при създаване на резервно копие" #: plinth/modules/backups/forms.py:33 #, python-brace-format msgid "{app} (No data to backup)" -msgstr "" +msgstr "{app} (липсват данни за архивиране)" #: plinth/modules/backups/forms.py:53 msgid "Enable scheduled backups" -msgstr "" +msgstr "Резервни копия по график" #: plinth/modules/backups/forms.py:54 msgid "" "If enabled, a backup is taken every day, every week and every month. Older " "backups are removed." msgstr "" +"Ако е отметнато резервно копие се прави всеки ден, всяка седмица и всеки " +"месец. По-ранните архиви биват премахвани." #: plinth/modules/backups/forms.py:58 msgid "Number of daily backups to keep" -msgstr "" +msgstr "Брой дневни архиви" #: plinth/modules/backups/forms.py:59 msgid "" "This many latest backups are kept and the rest are removed. A value of \"0\" " "disables backups of this type. Triggered at specified hour every day." msgstr "" +"Толкова от последните резервни копия ще бъдат запазвани, а останалите - " +"премахвани. Стойност „0“ изключва този вид резервно копие. Изпълнява се в " +"определен час всеки ден." #: plinth/modules/backups/forms.py:64 msgid "Number of weekly backups to keep" -msgstr "" +msgstr "Брой седмични архиви" #: plinth/modules/backups/forms.py:66 msgid "" "This many latest backups are kept and the rest are removed. A value of \"0\" " "disables backups of this type. Triggered at specified hour every Sunday." msgstr "" +"Толкова от последните резервни копия ще бъдат запазвани, а останалите - " +"премахвани. Стойност „0“ изключва този вид резервно копие. Изпълнява се в " +"определен час всяка неделя." #: plinth/modules/backups/forms.py:71 msgid "Number of monthly backups to keep" -msgstr "" +msgstr "Брой месечни архиви" #: plinth/modules/backups/forms.py:73 msgid "" @@ -225,26 +236,29 @@ msgid "" "disables backups of this type. Triggered at specified hour first day of " "every month." msgstr "" +"Толкова от последните резервни копия ще бъдат запазвани, а останалите - " +"премахвани. Стойност „0“ изключва този вид резервно копие. Изпълнява се в " +"определен час на първия ден от всеки месец." #: plinth/modules/backups/forms.py:78 msgid "Hour of the day to trigger backup operation" -msgstr "" +msgstr "Час от деня, в който да бъде създадено резервното копие" #: plinth/modules/backups/forms.py:79 msgid "In 24 hour format." -msgstr "" +msgstr "24-часов формат." #: plinth/modules/backups/forms.py:82 plinth/modules/backups/forms.py:104 msgid "Included apps" -msgstr "" +msgstr "Включени приложения" #: plinth/modules/backups/forms.py:82 plinth/modules/backups/forms.py:104 msgid "Apps to include in the backup" -msgstr "" +msgstr "Приложения, които да бъдат включени в резервното копие" #: plinth/modules/backups/forms.py:98 msgid "Repository" -msgstr "" +msgstr "Хранилище" #: plinth/modules/backups/forms.py:100 #: plinth/modules/backups/templates/backups_delete.html:17 @@ -253,180 +267,190 @@ msgstr "" #: plinth/modules/samba/templates/samba.html:66 #: plinth/modules/sharing/templates/sharing.html:33 msgid "Name" -msgstr "" +msgstr "Наименование" #: plinth/modules/backups/forms.py:101 msgid "(Optional) Set a name for this backup archive" -msgstr "" +msgstr "(по избор) Задайте име на архива с резервното копие" #: plinth/modules/backups/forms.py:121 msgid "Select the apps you want to restore" -msgstr "" +msgstr "Изберете приложенията, които да бъдат възстановени" #: plinth/modules/backups/forms.py:137 msgid "Upload File" -msgstr "" +msgstr "Качване на файл" #: plinth/modules/backups/forms.py:139 msgid "Backup files have to be in .tar.gz format" -msgstr "" +msgstr "Архивните файлове трябва да бъдат във формат .tar.gz" #: plinth/modules/backups/forms.py:140 msgid "Select the backup file you want to upload" -msgstr "" +msgstr "Изберете архивния файл, който искате да качите" #: plinth/modules/backups/forms.py:146 msgid "Repository path format incorrect." -msgstr "" +msgstr "Неправилен формат на пътя до хранилището." #: plinth/modules/backups/forms.py:153 #, python-brace-format msgid "Invalid username: {username}" -msgstr "" +msgstr "Недействително потребителско име: {username}" #: plinth/modules/backups/forms.py:163 #, python-brace-format msgid "Invalid hostname: {hostname}" -msgstr "" +msgstr "Недействително име на хост: {hostname}" #: plinth/modules/backups/forms.py:167 #, python-brace-format msgid "Invalid directory path: {dir_path}" -msgstr "" +msgstr "Недействителен път до папка: {dir_path}" #: plinth/modules/backups/forms.py:173 msgid "Encryption" -msgstr "" +msgstr "Шифроване" #: plinth/modules/backups/forms.py:174 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" +"„Ключ в хранилището“ означава, че ключ защитен с парола се съхранява заедно " +"с резервното копие." #: plinth/modules/backups/forms.py:176 msgid "Key in Repository" -msgstr "" +msgstr "Ключ в хранилището" #: plinth/modules/backups/forms.py:176 plinth/modules/searx/forms.py:15 msgid "None" -msgstr "" +msgstr "Няма" #: plinth/modules/backups/forms.py:178 plinth/modules/networks/forms.py:275 msgid "Passphrase" -msgstr "" +msgstr "Фраза за достъп" #: plinth/modules/backups/forms.py:179 msgid "Passphrase; Only needed when using encryption." -msgstr "" +msgstr "Фраза за достъп; Необходима е само при използване на шифроване." #: plinth/modules/backups/forms.py:182 msgid "Confirm Passphrase" -msgstr "" +msgstr "Потвърждаване на фразата за достъп" #: plinth/modules/backups/forms.py:182 msgid "Repeat the passphrase." -msgstr "" +msgstr "Повторете фразата за достъп." #: plinth/modules/backups/forms.py:193 msgid "The entered encryption passphrases do not match" -msgstr "" +msgstr "Въведените фрази за достъп за шифроване не съвпадат" #: plinth/modules/backups/forms.py:197 msgid "Passphrase is needed for encryption." -msgstr "" +msgstr "За шифроване е необходима фраза за достъп." #: plinth/modules/backups/forms.py:232 msgid "Select Disk or Partition" -msgstr "" +msgstr "Избиране на диск или дял" #: plinth/modules/backups/forms.py:233 msgid "Backups will be stored in the directory FreedomBoxBackups" -msgstr "" +msgstr "Резервните копия ще се съхраняват в папката FreedomBoxBackups" #: plinth/modules/backups/forms.py:242 msgid "SSH Repository Path" -msgstr "" +msgstr "Път към хранилището на SSH" #: plinth/modules/backups/forms.py:243 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" +"Път към ново или съществуващо хранилище. Пример: user@host:~/path/to/repo/" +"" #: plinth/modules/backups/forms.py:247 msgid "SSH server password" -msgstr "" +msgstr "Парола за сървъра през SSH" #: plinth/modules/backups/forms.py:248 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" +"Парола за сървъра през SSH.
Удостоверяване на SSH с ключове все още не е " +"възможно." #: plinth/modules/backups/forms.py:267 msgid "Remote backup repository already exists." -msgstr "" +msgstr "Отдалеченото хранилище за резервни копия вече съществува." #: plinth/modules/backups/forms.py:273 msgid "Select verified SSH public key" -msgstr "" +msgstr "Изберете проверен публичен ключ за SSH" #: plinth/modules/backups/repository.py:34 msgid "" "Connection refused - make sure you provided correct credentials and the " "server is running." msgstr "" +"Връзката е отказана - уверете се, че сте предоставили правилните данни за " +"вход и сървърът работи." #: plinth/modules/backups/repository.py:41 msgid "Connection refused" -msgstr "" +msgstr "Връзката е отказана" #: plinth/modules/backups/repository.py:48 msgid "Repository not found" -msgstr "" +msgstr "Хранилището не е намерено" #: plinth/modules/backups/repository.py:53 msgid "Incorrect encryption passphrase" -msgstr "" +msgstr "Грешна фраза за шифроване" #: plinth/modules/backups/repository.py:58 msgid "SSH access denied" -msgstr "" +msgstr "Достъпът през SSH е отказан" #: plinth/modules/backups/repository.py:64 msgid "Repository path is neither empty nor is an existing backups repository." msgstr "" +"Пътят до хранилището не е празен, нито е съществуващо хранилище за резервни " +"копия." #: plinth/modules/backups/repository.py:143 msgid "Existing repository is not encrypted." -msgstr "" +msgstr "Съществуващото хранилище не е шифровано." #: plinth/modules/backups/repository.py:327 #, python-brace-format msgid "{box_name} storage" -msgstr "" +msgstr "Хранилище на {box_name}" #: plinth/modules/backups/templates/backups.html:17 #: plinth/modules/backups/views.py:111 msgid "Create a new backup" -msgstr "" +msgstr "Създаване на резервно копие" #: plinth/modules/backups/templates/backups.html:21 msgid "Create Backup" -msgstr "" +msgstr "Създаване на резервно копие" #: plinth/modules/backups/templates/backups.html:24 msgid "Upload and restore a backup archive" -msgstr "" +msgstr "Качване и възстановяване на архив с резервно копие" #: plinth/modules/backups/templates/backups.html:28 msgid "Upload and Restore" -msgstr "" +msgstr "Качване и възстановяване" #: plinth/modules/backups/templates/backups.html:31 msgid "Add a backup location" -msgstr "" +msgstr "Добавяне на местоположение за архивиране" #: plinth/modules/backups/templates/backups.html:35 msgid "Add Backup Location" @@ -485,7 +509,7 @@ msgstr "" #: plinth/modules/sharing/templates/sharing_add_edit.html:20 #: plinth/templates/form.html:19 msgid "Submit" -msgstr "" +msgstr "Изпращане" #: plinth/modules/backups/templates/backups_repository.html:19 msgid "This repository is encrypted" @@ -493,7 +517,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:29 msgid "Schedule" -msgstr "" +msgstr "График" #: plinth/modules/backups/templates/backups_repository.html:40 msgid "Unmount Location" @@ -599,11 +623,11 @@ msgstr "" #: plinth/modules/backups/views.py:55 msgid "Backup schedule updated." -msgstr "" +msgstr "Графика за резервни копия е обновен." #: plinth/modules/backups/views.py:74 msgid "Schedule Backups" -msgstr "" +msgstr "Резервни копия по график" #: plinth/modules/backups/views.py:106 msgid "Archive created." @@ -1858,10 +1882,8 @@ msgid "" msgstr "" #: plinth/modules/email_server/__init__.py:48 -#, fuzzy -#| msgid "Web Server" msgid "Email Server" -msgstr "Уеб Сървър" +msgstr "Пощенски сървър" #: plinth/modules/email_server/__init__.py:80 msgid "Powered by Postfix, Dovecot & Rspamd" @@ -2079,7 +2101,7 @@ msgstr "" #: plinth/modules/networks/templates/connection_show.html:259 #: plinth/modules/security/__init__.py:45 msgid "Security" -msgstr "" +msgstr "Сигурност" #: plinth/modules/email_server/views.py:26 #: plinth/modules/monkeysphere/templates/monkeysphere.html:37 @@ -2390,7 +2412,7 @@ msgstr "" #: plinth/modules/help/views.py:37 plinth/templates/help-menu.html:33 #: plinth/templates/help-menu.html:34 msgid "Submit Feedback" -msgstr "" +msgstr "Подаване на обратна връзка" #: plinth/modules/help/__init__.py:49 #: plinth/modules/help/templates/help_contribute.html:9 @@ -2602,6 +2624,8 @@ msgid "" "Please remove any passwords or other personal information from the log " "before submitting the bug report." msgstr "" +"Моля, премахнете всички пароли или друга лична информация от дневника, преди " +"да изпратите доклад за грешка." #: plinth/modules/help/views.py:25 msgid "Documentation and FAQ" @@ -3099,10 +3123,8 @@ msgid "" msgstr "" #: plinth/modules/mediawiki/forms.py:58 -#, fuzzy -#| msgid "Web Server" msgid "Server URL" -msgstr "Уеб Сървър" +msgstr "Адрес на сървъра" #: plinth/modules/mediawiki/forms.py:59 msgid "" @@ -5230,10 +5252,8 @@ msgid "Action" msgstr "" #: plinth/modules/samba/views.py:33 -#, fuzzy -#| msgid "FreedomBox" msgid "FreedomBox OS disk" -msgstr "FreedomBox" +msgstr "Диск с OS на FreedomBox" #: plinth/modules/samba/views.py:59 plinth/modules/storage/forms.py:147 msgid "Open Share" @@ -5338,7 +5358,7 @@ msgstr "" #: plinth/modules/security/templates/security.html:12 #: plinth/modules/security/templates/security.html:14 msgid "Show security report" -msgstr "" +msgstr "Доклад за сигурността" #: plinth/modules/security/templates/security.html:19 #: plinth/modules/upgrades/templates/backports-firstboot.html:11 @@ -5368,7 +5388,7 @@ msgstr "" #: plinth/modules/security/templates/security_report.html:10 #: plinth/modules/security/views.py:74 msgid "Security Report" -msgstr "" +msgstr "Доклад за сигурността" #: plinth/modules/security/templates/security_report.html:12 #, python-format @@ -6406,20 +6426,22 @@ msgstr "" #: plinth/modules/ttrss/__init__.py:57 plinth/modules/ttrss/manifest.py:18 msgid "Tiny Tiny RSS" -msgstr "" +msgstr "Tiny Tiny RSS" #: plinth/modules/ttrss/__init__.py:58 msgid "News Feed Reader" -msgstr "" +msgstr "Четец на абонаменти за новини" #: plinth/modules/ttrss/manifest.py:9 msgid "Tiny Tiny RSS (Fork)" -msgstr "" +msgstr "Tiny Tiny RSS (Fork)" #: plinth/modules/upgrades/__init__.py:45 #: plinth/modules/upgrades/templates/update-firstboot.html:14 msgid "Check for and apply the latest software and security updates." msgstr "" +"Проверява и прилага последните издания на софтуера и обновявания на " +"сигурността." #: plinth/modules/upgrades/__init__.py:46 msgid "" @@ -6431,13 +6453,11 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:122 msgid "Updates" -msgstr "" +msgstr "Обновяване" #: plinth/modules/upgrades/__init__.py:125 -#, fuzzy -#| msgid "FreedomBox" msgid "FreedomBox Updated" -msgstr "FreedomBox" +msgstr "Обновяване на FreedomBox" #: plinth/modules/upgrades/__init__.py:210 msgid "Could not start distribution update" @@ -6972,10 +6992,8 @@ msgid "Typically checked for a VPN service though which all traffic is sent." msgstr "" #: plinth/modules/wireguard/templates/wireguard.html:10 -#, fuzzy -#| msgid "Web Server" msgid "As a Server" -msgstr "Уеб Сървър" +msgstr "Като сървър" #: plinth/modules/wireguard/templates/wireguard.html:12 msgid "Peers allowed to connect to this server:" From f801e768f3f7c47ddc2b65ac8354b7a7211f6576 Mon Sep 17 00:00:00 2001 From: Andrij Mizyk Date: Fri, 1 Oct 2021 21:08:12 +0000 Subject: [PATCH 04/58] Translated using Weblate (Ukrainian) Currently translated at 78.7% (1192 of 1514 strings) --- plinth/locale/uk/LC_MESSAGES/django.po | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 4b2e0ea46..ba6def4d6 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-27 18:44-0400\n" -"PO-Revision-Date: 2021-09-21 20:38+0000\n" +"PO-Revision-Date: 2021-10-02 21:38+0000\n" "Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian \n" @@ -168,7 +168,7 @@ msgstr "Дозволити планування резервних копій" #: plinth/modules/storage/__init__.py:323 #, python-brace-format msgid "Go to {app_name}" -msgstr "Перейти до {app_name}" +msgstr "Перейти в {app_name}" #: plinth/modules/backups/__init__.py:242 #, python-brace-format @@ -2513,7 +2513,7 @@ msgstr "Нема доступних репозиторіїв." #: plinth/modules/gitweb/templates/gitweb_configure.html:35 #, python-format msgid "Go to repository %(repo.name)s" -msgstr "Перейти до репозиторію %(repo.name)s" +msgstr "Перейти в репозиторій %(repo.name)s" #: plinth/modules/gitweb/templates/gitweb_configure.html:42 msgid "Cloning…" @@ -2764,6 +2764,9 @@ msgid "" "using %(box_name)s, you can ask for help from our community of users and " "contributors." msgstr "" +"Якщо Вам потрібна допомога в якійсь роботі або Ви стикнулися з проблемами " +"використання %(box_name)s, можете звертатися до нашої спільноти користувачів " +"і розробників." #: plinth/modules/help/templates/help_support.html:20 msgid "" @@ -2953,7 +2956,7 @@ msgstr "Нема доступних вікі або боґів." #: plinth/modules/ikiwiki/templates/ikiwiki_configure.html:31 #, python-format msgid "Go to site %(site)s" -msgstr "Перейти до сайту %(site)s" +msgstr "Перейти на сайт %(site)s" #: plinth/modules/ikiwiki/templates/ikiwiki_configure.html:38 #, python-format @@ -4509,8 +4512,8 @@ msgid "" "your network. This information is used to guide you with further setup. It " "can be changed later." msgstr "" -"Виберіть пункт, який найкраще описує те, як Ваш %(box_name)s підʼєднано до " -"мережі. Ця інформація використовується лише для подальших вказівок " +"Оберіть пункт, який найкраще описує зʼєднання Вашого %(box_name)s із " +"мережею. Ця інформація використовується лише для подальших вказівок " "установлення. Її можна змінити пізніше." #: plinth/modules/networks/templates/network_topology_main.html:9 @@ -5195,7 +5198,7 @@ msgid "" "Are you sure you want to restart? You will not be able to access this web " "interface for a few minutes until the system is restarted." msgstr "" -"Ви справді хочете перезавантажити систему? Ви не матимете доступ до " +"Ви дійсно хочете перезавантажити систему? Ви не матимете доступу до " "вебінтерфейсу протягом кількох хвилин, поки система не перезавантажиться." #: plinth/modules/power/templates/power_restart.html:34 @@ -5214,7 +5217,7 @@ msgid "" "Are you sure you want to shut down? You will not be able to access this web " "interface after shut down." msgstr "" -"Ви справді хочете вимкнути систему? Ви не матимете доступу до вебінтерфейсу " +"Ви дійсно хочете вимкнути систему? Ви не матимете доступу до вебінтерфейсу " "після вимкнення." #: plinth/modules/power/templates/power_shutdown.html:33 @@ -6892,7 +6895,7 @@ msgid "" "case, refresh the page to continue." msgstr "" "Це може зайняти багато часу. Під час оновлення вебінтерфейс " -"може бути тимчасово недоступним і показувати помилку. В такому випадку " +"може тимчасово бути недоступним і показувати помилку. В такому випадку " "оновіть сторінку і продовжіть." #: plinth/modules/upgrades/templates/update-firstboot-progress.html:31 @@ -6917,6 +6920,8 @@ msgid "" "%(box_name)s has been updated to version %(version)s. See the release announcement." msgstr "" +"%(box_name)s оновлено до версії %(version)s. Дивіться анонс випуску." #: plinth/modules/upgrades/templates/upgrades-new-release.html:22 #: plinth/templates/notifications.html:44 @@ -7743,6 +7748,9 @@ msgid "" "FreedomBox Service (Plinth) project issue tracker." msgstr "" +"Якщо Ви вірите, що ця сторінка має існувати, будь ласка, надішліть ваду у відстежувач помилок проєкту служби FreedomBox (Plinth)." #: plinth/templates/500.html:10 msgid "500" From 8dea7d3c799c965af7749d368d8c4a6a11656a2a Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 29 Sep 2021 12:48:50 -0400 Subject: [PATCH 05/58] openvpn: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/openvpn/tests/openvpn.feature | 43 ------------- .../modules/openvpn/tests/test_functional.py | 64 +++++++++++++++---- 2 files changed, 52 insertions(+), 55 deletions(-) delete mode 100644 plinth/modules/openvpn/tests/openvpn.feature diff --git a/plinth/modules/openvpn/tests/openvpn.feature b/plinth/modules/openvpn/tests/openvpn.feature deleted file mode 100644 index 931c4ddf2..000000000 --- a/plinth/modules/openvpn/tests/openvpn.feature +++ /dev/null @@ -1,43 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @openvpn -Feature: OpenVPN - Virtual Private Network - Setup and configure OpenVPN - -Background: - Given I'm a logged in user - Given the openvpn application is installed - -Scenario: Enable openvpn application - Given the openvpn application is disabled - When I enable the openvpn application - Then the openvpn service should be running - -Scenario: Download openvpn profile - Given the openvpn application is enabled - Then the openvpn profile should be downloadable - -Scenario: User of 'vpn' group - Given the openvpn application is enabled - And the user vpnuser in group vpn exists - When I'm logged in as the user vpnuser - Then the openvpn profile should be downloadable - -Scenario: User not of 'vpn' group - Given the openvpn application is enabled - And the user nonvpnuser exists - When I'm logged in as the user nonvpnuser - Then openvpn app should not be visible on the front page - -@backups -Scenario: Backup and restore openvpn - Given the openvpn application is enabled - And I download openvpn profile - When I create a backup of the openvpn app data with name test_openvpn - And I restore the openvpn app data backup with name test_openvpn - Then the openvpn profile downloaded should be same as before - -Scenario: Disable openvpn application - Given the openvpn application is enabled - When I disable the openvpn application - Then the openvpn service should not be running diff --git a/plinth/modules/openvpn/tests/test_functional.py b/plinth/modules/openvpn/tests/test_functional.py index 98f506e39..e04bd3c25 100644 --- a/plinth/modules/openvpn/tests/test_functional.py +++ b/plinth/modules/openvpn/tests/test_functional.py @@ -3,35 +3,75 @@ Functional, browser based tests for openvpn app. """ -from pytest_bdd import given, scenarios, then - +import pytest from plinth.tests import functional -scenarios('openvpn.feature') +pytestmark = [pytest.mark.apps, pytest.mark.openvpn] base_url = functional.config['DEFAULT']['URL'] shortcut_href = '?selected=shortcut-openvpn' -@given('I download openvpn profile', target_fixture='openvpn_profile') -def openvpn_download_profile(session_browser): - return _download_profile(session_browser) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'openvpn') + yield + functional.app_disable(session_browser, 'openvpn') -@then('the openvpn profile should be downloadable') -def openvpn_profile_downloadable(session_browser): +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'openvpn') + + functional.app_enable(session_browser, 'openvpn') + assert functional.service_is_running(session_browser, 'openvpn') + + functional.app_disable(session_browser, 'openvpn') + assert functional.service_is_not_running(session_browser, 'openvpn') + + +def test_download_profile(session_browser): + """Test that OpenVPN profile is downloadable.""" + functional.app_enable(session_browser, 'openvpn') _download_profile(session_browser) -@then('openvpn app should not be visible on the front page') -def openvpn_app_not_on_front_page(session_browser): +def test_user_group(session_browser): + """Test that only users in vpn group have access.""" + functional.app_enable(session_browser, 'openvpn') + if not functional.user_exists(session_browser, 'vpnuser'): + functional.create_user(session_browser, 'vpnuser', groups=['vpn']) + if not functional.user_exists(session_browser, 'nonvpnuser'): + functional.create_user(session_browser, 'nonvpnuser', groups=[]) + + functional.login_with_account(session_browser, base_url, 'vpnuser') + _download_profile(session_browser) + + functional.login_with_account(session_browser, base_url, 'nonvpnuser') + _not_on_front_page(session_browser) + + functional.login(session_browser) + + +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'openvpn') + profile = _download_profile(session_browser) + functional.backup_create(session_browser, 'openvpn', 'test_openvpn') + + functional.backup_restore(session_browser, 'openvpn', 'test_openvpn') + _profile_download_compare(session_browser, profile) + + +def _not_on_front_page(session_browser): session_browser.visit(base_url) links = session_browser.links.find_by_href(shortcut_href) assert len(links) == 0 -@then('the openvpn profile downloaded should be same as before') -def openvpn_profile_download_compare(session_browser, openvpn_profile): +def _profile_download_compare(session_browser, openvpn_profile): new_profile = _download_profile(session_browser) assert openvpn_profile == new_profile From 98cc6c4753029b324c7b618e8f2e3cd33fd2ead1 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 29 Sep 2021 22:01:00 -0400 Subject: [PATCH 06/58] pagekite: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../modules/pagekite/tests/pagekite.feature | 44 ------------ .../modules/pagekite/tests/test_functional.py | 70 ++++++++++++++----- 2 files changed, 54 insertions(+), 60 deletions(-) delete mode 100644 plinth/modules/pagekite/tests/pagekite.feature diff --git a/plinth/modules/pagekite/tests/pagekite.feature b/plinth/modules/pagekite/tests/pagekite.feature deleted file mode 100644 index 8e4848725..000000000 --- a/plinth/modules/pagekite/tests/pagekite.feature +++ /dev/null @@ -1,44 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -# TODO Scenario: Enable standard services -# TODO Scenario: Disable standard services -# TODO Scenario: Add custom service -# TODO Scenario: Delete custom service - -@apps @pagekite -Feature: Pagekite Public Visibility - Configure Pagekite public visitbility server. - -Background: - Given I'm a logged in user - Given the pagekite application is installed - -Scenario: Enable pagekite application - Given the pagekite application is disabled - When I enable the pagekite application - Then the pagekite service should be running - -Scenario: Configure pagekite application - Given the pagekite application is enabled - When I configure pagekite with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret - Then pagekite should be configured with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret - -Scenario: Capitalized kite name - Given the pagekite application is enabled - When I configure pagekite with host pagekite.example.com, port 8080, kite name Mykite.example.com and kite secret mysecret - Then pagekite should be configured with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret - -@backups -Scenario: Backup and restore pagekite - Given the pagekite application is enabled - When I configure pagekite with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret - And I create a backup of the pagekite app data with name test_pagekite - And I configure pagekite with host afterbackup.example.com, port 8082, kite name afterbackup.example.com and kite secret afterbackupsecret - And I restore the pagekite app data backup with name test_pagekite - Then the pagekite service should be running - And pagekite should be configured with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret - -Scenario: Disable pagekite application - Given the pagekite application is enabled - When I disable the pagekite application - Then the pagekite service should not be running diff --git a/plinth/modules/pagekite/tests/test_functional.py b/plinth/modules/pagekite/tests/test_functional.py index d18168619..3ea48b5ee 100644 --- a/plinth/modules/pagekite/tests/test_functional.py +++ b/plinth/modules/pagekite/tests/test_functional.py @@ -3,28 +3,66 @@ Functional, browser based tests for pagekite app. """ -from pytest_bdd import parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('pagekite.feature') +pytestmark = [pytest.mark.system, pytest.mark.pagekite] + +# TODO Scenario: Enable standard services +# TODO Scenario: Disable standard services +# TODO Scenario: Add custom service +# TODO Scenario: Delete custom service -@when( - parsers.parse('I configure pagekite with host {host:S}, port {port:d}, ' - 'kite name {kite_name:S} and kite secret {kite_secret:w}')) -def pagekite_configure(session_browser, host, port, kite_name, kite_secret): - _configure(session_browser, host, port, kite_name, kite_secret) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'pagekite') + yield + functional.app_disable(session_browser, 'pagekite') -@then( - parsers.parse( - 'pagekite should be configured with host {host:S}, port {port:d}, ' - 'kite name {kite_name:S} and kite secret {kite_secret:w}')) -def pagekite_assert_configured(session_browser, host, port, kite_name, - kite_secret): - assert (host, port, kite_name, - kite_secret) == _get_configuration(session_browser) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'pagekite') + + functional.app_enable(session_browser, 'pagekite') + assert functional.service_is_running(session_browser, 'pagekite') + + functional.app_disable(session_browser, 'pagekite') + assert functional.service_is_not_running(session_browser, 'pagekite') + + +def test_configure(session_browser): + """Test pagekite configuration.""" + functional.app_enable(session_browser, 'pagekite') + _configure(session_browser, 'pagekite.example.com', 8080, + 'mykite.example.com', 'mysecret') + assert ('pagekite.example.com', 8080, 'mykite.example.com', + 'mysecret') == _get_configuration(session_browser) + + # Capitalized kite name should become lower case. + _configure(session_browser, 'pagekite.example.com', 8080, + 'Mykite.example.com', 'mysecret') + assert ('pagekite.example.com', 8080, 'mykite.example.com', + 'mysecret') == _get_configuration(session_browser) + + +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'pagekite') + _configure(session_browser, 'beforebackup.example.com', 8081, + 'beforebackup.example.com', 'beforebackupsecret') + functional.backup_create(session_browser, 'pagekite', 'test_pagekite') + + _configure(session_browser, 'afterbackup.example.com', 8082, + 'afterbackup.example.com', 'afterbackupsecret') + functional.backup_restore(session_browser, 'pagekite', 'test_pagekite') + + assert functional.service_is_running(session_browser, 'pagekite') + assert ('beforebackup.example.com', 8081, 'beforebackup.example.com', + 'beforebackupsecret') == _get_configuration(session_browser) def _configure(browser, host, port, kite_name, kite_secret): From 93e9f95d1876ffea8187929767aa592b3e157e55 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 30 Sep 2021 11:02:42 -0400 Subject: [PATCH 07/58] privoxy: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/privoxy/tests/privoxy.feature | 26 --------------- .../modules/privoxy/tests/test_functional.py | 33 +++++++++++++++++-- 2 files changed, 31 insertions(+), 28 deletions(-) delete mode 100644 plinth/modules/privoxy/tests/privoxy.feature diff --git a/plinth/modules/privoxy/tests/privoxy.feature b/plinth/modules/privoxy/tests/privoxy.feature deleted file mode 100644 index ff397339d..000000000 --- a/plinth/modules/privoxy/tests/privoxy.feature +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @privoxy -Feature: Privoxy Web Proxy - Proxy web connections for enhanced privacy. - -Background: - Given I'm a logged in user - Given the privoxy application is installed - -Scenario: Enable privoxy application - Given the privoxy application is disabled - When I enable the privoxy application - Then the privoxy service should be running - -@backups -Scenario: Backup and restore privoxy - Given the privoxy application is enabled - When I create a backup of the privoxy app data with name test_privoxy - And I restore the privoxy app data backup with name test_privoxy - Then the privoxy service should be running - -Scenario: Disable privoxy application - Given the privoxy application is enabled - When I disable the privoxy application - Then the privoxy service should not be running diff --git a/plinth/modules/privoxy/tests/test_functional.py b/plinth/modules/privoxy/tests/test_functional.py index 10638de5d..3554532d8 100644 --- a/plinth/modules/privoxy/tests/test_functional.py +++ b/plinth/modules/privoxy/tests/test_functional.py @@ -3,6 +3,35 @@ Functional, browser based tests for privoxy app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('privoxy.feature') +pytestmark = [pytest.mark.apps, pytest.mark.privoxy] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'privoxy') + yield + functional.app_disable(session_browser, 'privoxy') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'privoxy') + + functional.app_enable(session_browser, 'privoxy') + assert functional.service_is_running(session_browser, 'privoxy') + + functional.app_disable(session_browser, 'privoxy') + assert functional.service_is_not_running(session_browser, 'privoxy') + + +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'privoxy') + functional.backup_create(session_browser, 'privoxy', 'test_privoxy') + functional.backup_restore(session_browser, 'privoxy', 'test_privoxy') + assert functional.service_is_running(session_browser, 'privoxy') From 650c16f91418bdd6d17b5a81ac1bda4d12b9f70b Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 30 Sep 2021 11:05:10 -0400 Subject: [PATCH 08/58] tests: Add backups mark for openvpn, pagekite, privoxy Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/openvpn/tests/test_functional.py | 1 + plinth/modules/pagekite/tests/test_functional.py | 1 + plinth/modules/privoxy/tests/test_functional.py | 1 + 3 files changed, 3 insertions(+) diff --git a/plinth/modules/openvpn/tests/test_functional.py b/plinth/modules/openvpn/tests/test_functional.py index e04bd3c25..10d13ffdb 100644 --- a/plinth/modules/openvpn/tests/test_functional.py +++ b/plinth/modules/openvpn/tests/test_functional.py @@ -55,6 +55,7 @@ def test_user_group(session_browser): functional.login(session_browser) +@pytest.mark.backups def test_backup_restore(session_browser): """Test backup and restore of app data.""" functional.app_enable(session_browser, 'openvpn') diff --git a/plinth/modules/pagekite/tests/test_functional.py b/plinth/modules/pagekite/tests/test_functional.py index 3ea48b5ee..64fd8cf92 100644 --- a/plinth/modules/pagekite/tests/test_functional.py +++ b/plinth/modules/pagekite/tests/test_functional.py @@ -49,6 +49,7 @@ def test_configure(session_browser): 'mysecret') == _get_configuration(session_browser) +@pytest.mark.backups def test_backup_restore(session_browser): """Test backup and restore of configuration.""" functional.app_enable(session_browser, 'pagekite') diff --git a/plinth/modules/privoxy/tests/test_functional.py b/plinth/modules/privoxy/tests/test_functional.py index 3554532d8..74a028d89 100644 --- a/plinth/modules/privoxy/tests/test_functional.py +++ b/plinth/modules/privoxy/tests/test_functional.py @@ -29,6 +29,7 @@ def test_enable_disable(session_browser): assert functional.service_is_not_running(session_browser, 'privoxy') +@pytest.mark.backups def test_backup_restore(session_browser): """Test backup and restore.""" functional.app_enable(session_browser, 'privoxy') From 8daa9aa49d55dd217c33d011c08c99b33872c72e Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 30 Sep 2021 12:08:12 -0400 Subject: [PATCH 09/58] quassel: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/quassel/tests/quassel.feature | 27 -------------- .../modules/quassel/tests/test_functional.py | 36 +++++++++++++++++-- 2 files changed, 34 insertions(+), 29 deletions(-) delete mode 100644 plinth/modules/quassel/tests/quassel.feature diff --git a/plinth/modules/quassel/tests/quassel.feature b/plinth/modules/quassel/tests/quassel.feature deleted file mode 100644 index 2012ed0cc..000000000 --- a/plinth/modules/quassel/tests/quassel.feature +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @quassel -Feature: Quassel IRC Client - Run Quassel core. - -Background: - Given I'm a logged in user - Given the quassel application is installed - -Scenario: Enable quassel application - Given the quassel application is disabled - When I enable the quassel application - Then the quassel service should be running - -# TODO: Improve this to actually check that data configured servers is restored. -@backups -Scenario: Backup and restore quassel - Given the quassel application is enabled - When I create a backup of the quassel app data with name test_quassel - And I restore the quassel app data backup with name test_quassel - Then the quassel service should be running - -Scenario: Disable quassel application - Given the quassel application is enabled - When I disable the quassel application - Then the quassel service should not be running diff --git a/plinth/modules/quassel/tests/test_functional.py b/plinth/modules/quassel/tests/test_functional.py index a9ddd2f57..e24faa699 100644 --- a/plinth/modules/quassel/tests/test_functional.py +++ b/plinth/modules/quassel/tests/test_functional.py @@ -3,6 +3,38 @@ Functional, browser based tests for quassel app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('quassel.feature') +pytestmark = [pytest.mark.apps, pytest.mark.quassel] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'quassel') + yield + functional.app_disable(session_browser, 'quassel') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'quassel') + + functional.app_enable(session_browser, 'quassel') + assert functional.service_is_running(session_browser, 'quassel') + + functional.app_disable(session_browser, 'quassel') + assert functional.service_is_not_running(session_browser, 'quassel') + + +# TODO: Improve this to actually check that data configured servers is +# restored. +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'quassel') + functional.backup_create(session_browser, 'quassel', 'test_quassel') + functional.backup_restore(session_browser, 'quassel', 'test_quassel') + assert functional.service_is_running(session_browser, 'quassel') From c1204118463c10bf6e4e8958f21e0475e1b051ec Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 30 Sep 2021 16:36:10 -0400 Subject: [PATCH 10/58] radicale: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy [sunil: Set an initial value before testing for access rights] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- .../modules/radicale/tests/radicale.feature | 54 --------- .../modules/radicale/tests/test_functional.py | 106 ++++++++---------- 2 files changed, 48 insertions(+), 112 deletions(-) delete mode 100644 plinth/modules/radicale/tests/radicale.feature diff --git a/plinth/modules/radicale/tests/radicale.feature b/plinth/modules/radicale/tests/radicale.feature deleted file mode 100644 index 431e00cbb..000000000 --- a/plinth/modules/radicale/tests/radicale.feature +++ /dev/null @@ -1,54 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @radicale -Feature: Radicale Calendar and Addressbook - Configure CalDAV/CardDAV server. - -Background: - Given I'm a logged in user - Given the radicale application is installed - -Scenario: Enable radicale application - Given the radicale application is disabled - When I enable the radicale application - Then the radicale service should be running - And the calendar should be available - And the addressbook should be available - -Scenario: Owner-only access rights - Given the radicale application is enabled - And the access rights are set to "any user can view, but only the owner can make changes" - When I change the access rights to "only the owner can view or make changes" - Then the radicale service should be running - And the access rights should be "only the owner can view or make changes" - -Scenario: Owner-write access rights - Given the radicale application is enabled - And the access rights are set to "only the owner can view or make changes" - When I change the access rights to "any user can view, but only the owner can make changes" - Then the radicale service should be running - And the access rights should be "any user can view, but only the owner can make changes" - -Scenario: Authenticated access rights - Given the radicale application is enabled - And the access rights are set to "only the owner can view or make changes" - When I change the access rights to "any user can view or make changes" - Then the radicale service should be running - And the access rights should be "any user can view or make changes" - -@backups -Scenario: Backup and restore radicale - Given the radicale application is enabled - And the access rights are set to "only the owner can view or make changes" - When I create a backup of the radicale app data with name test_radicale - And I change the access rights to "any user can view, but only the owner can make changes" - And I restore the radicale app data backup with name test_radicale - Then the radicale service should be running - And the access rights should be "only the owner can view or make changes" - -Scenario: Disable radicale application - Given the radicale application is enabled - When I disable the radicale application - Then the radicale service should not be running - And the calendar should not be available - And the addressbook should not be available diff --git a/plinth/modules/radicale/tests/test_functional.py b/plinth/modules/radicale/tests/test_functional.py index 7b3a29463..ae9a46c68 100644 --- a/plinth/modules/radicale/tests/test_functional.py +++ b/plinth/modules/radicale/tests/test_functional.py @@ -5,83 +5,73 @@ Functional, browser based tests for radicale app. import logging +import pytest import requests -from pytest_bdd import given, scenarios, then, when from plinth.tests import functional logger = logging.getLogger(__name__) -scenarios('radicale.feature') + +pytestmark = [pytest.mark.apps, pytest.mark.radicale] -@given('the access rights are set to "only the owner can view or make changes"' - ) -def radicale_given_owner_only(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'radicale') + yield + functional.app_disable(session_browser, 'radicale') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'radicale') + + functional.app_enable(session_browser, 'radicale') + assert functional.service_is_running(session_browser, 'radicale') + assert _calendar_is_available(session_browser) + assert _addressbook_is_available(session_browser) + + functional.app_disable(session_browser, 'radicale') + assert functional.service_is_not_running(session_browser, 'radicale') + assert not _calendar_is_available(session_browser) + assert not _addressbook_is_available(session_browser) + + +def test_access_rights(session_browser): + """Test setting the access rights.""" + functional.app_enable(session_browser, 'radicale') _set_access_rights(session_browser, 'owner_only') - -@given('the access rights are set to "any user can view, but only the ' - 'owner can make changes"') -def radicale_given_owner_write(session_browser): + # Owner-write access rights _set_access_rights(session_browser, 'owner_write') + assert functional.service_is_running(session_browser, 'radicale') + assert _get_access_rights(session_browser) == 'owner_write' - -@given('the access rights are set to "any user can view or make changes"') -def radicale_given_authenticated(session_browser): + # Authenticated access rights _set_access_rights(session_browser, 'authenticated') + assert functional.service_is_running(session_browser, 'radicale') + assert _get_access_rights(session_browser) == 'authenticated' - -@when('I change the access rights to "only the owner can view or make changes"' - ) -def radicale_set_owner_only(session_browser): + # Owner-only access rights _set_access_rights(session_browser, 'owner_only') - - -@when('I change the access rights to "any user can view, but only the ' - 'owner can make changes"') -def radicale_set_owner_write(session_browser): - _set_access_rights(session_browser, 'owner_write') - - -@when('I change the access rights to "any user can view or make changes"') -def radicale_set_authenticated(session_browser): - _set_access_rights(session_browser, 'authenticated') - - -@then('the access rights should be "only the owner can view or make changes"') -def radicale_check_owner_only(session_browser): + assert functional.service_is_running(session_browser, 'radicale') assert _get_access_rights(session_browser) == 'owner_only' -@then('the access rights should be "any user can view, but only the ' - 'owner can make changes"') -def radicale_check_owner_write(session_browser): - assert _get_access_rights(session_browser) == 'owner_write' +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'radicale') + _set_access_rights(session_browser, 'owner_only') + functional.backup_create(session_browser, 'radicale', 'test_radicale') + _set_access_rights(session_browser, 'owner_write') + functional.backup_restore(session_browser, 'radicale', 'test_radicale') -@then('the access rights should be "any user can view or make changes"') -def radicale_check_authenticated(session_browser): - assert _get_access_rights(session_browser) == 'authenticated' - - -@then('the calendar should be available') -def assert_calendar_is_available(session_browser): - assert _calendar_is_available(session_browser) - - -@then('the calendar should not be available') -def assert_calendar_is_not_available(session_browser): - assert not _calendar_is_available(session_browser) - - -@then('the addressbook should be available') -def assert_addressbook_is_available(session_browser): - assert _addressbook_is_available(session_browser) - - -@then('the addressbook should not be available') -def assert_addressbook_is_not_available(session_browser): - assert not _addressbook_is_available(session_browser) + assert functional.service_is_running(session_browser, 'radicale') + assert _get_access_rights(session_browser) == 'owner_only' def _get_access_rights(browser): From 60236376c27f1e05900db3af498a02c70637ca7e Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 30 Sep 2021 17:14:27 -0400 Subject: [PATCH 11/58] roundcube: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../modules/roundcube/tests/roundcube.feature | 26 -------------- .../roundcube/tests/test_functional.py | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 28 deletions(-) delete mode 100644 plinth/modules/roundcube/tests/roundcube.feature diff --git a/plinth/modules/roundcube/tests/roundcube.feature b/plinth/modules/roundcube/tests/roundcube.feature deleted file mode 100644 index 0baa92055..000000000 --- a/plinth/modules/roundcube/tests/roundcube.feature +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @roundcube -Feature: Roundcube Email Client - Run webmail client. - -Background: - Given I'm a logged in user - Given the roundcube application is installed - -Scenario: Enable roundcube application - Given the roundcube application is disabled - When I enable the roundcube application - Then the roundcube site should be available - -@backups -Scenario: Backup and restore roundcube - Given the roundcube application is enabled - When I create a backup of the roundcube app data with name test_roundcube - And I restore the roundcube app data backup with name test_roundcube - Then the roundcube site should be available - -Scenario: Disable roundcube application - Given the roundcube application is enabled - When I disable the roundcube application - Then the roundcube site should not be available diff --git a/plinth/modules/roundcube/tests/test_functional.py b/plinth/modules/roundcube/tests/test_functional.py index 0aaee4b5e..e88220190 100644 --- a/plinth/modules/roundcube/tests/test_functional.py +++ b/plinth/modules/roundcube/tests/test_functional.py @@ -3,6 +3,36 @@ Functional, browser based tests for roundcube app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('roundcube.feature') +pytestmark = [pytest.mark.apps, pytest.mark.roundcube] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'roundcube') + yield + functional.app_disable(session_browser, 'roundcube') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'roundcube') + + functional.app_enable(session_browser, 'roundcube') + assert functional.is_available(session_browser, 'roundcube') + + functional.app_disable(session_browser, 'roundcube') + assert not functional.is_available(session_browser, 'roundcube') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'roundcube') + functional.backup_create(session_browser, 'roundcube', 'test_roundcube') + functional.backup_restore(session_browser, 'roundcube', 'test_roundcube') + assert functional.is_available(session_browser, 'roundcube') From 6aecad7259ca4e8036aefaff08cbf0779155ef0c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 2 Oct 2021 14:49:36 -0400 Subject: [PATCH 12/58] searx: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/searx/tests/searx.feature | 50 ------------ plinth/modules/searx/tests/test_functional.py | 77 +++++++++++++++---- plinth/tests/functional/__init__.py | 5 ++ 3 files changed, 65 insertions(+), 67 deletions(-) delete mode 100644 plinth/modules/searx/tests/searx.feature diff --git a/plinth/modules/searx/tests/searx.feature b/plinth/modules/searx/tests/searx.feature deleted file mode 100644 index 83f0b07b7..000000000 --- a/plinth/modules/searx/tests/searx.feature +++ /dev/null @@ -1,50 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @searx @sso -Feature: Searx Web Search - Run Searx metasearch engine. - -Background: - Given I'm a logged in user - Given the searx application is installed - -Scenario: Enable searx application - Given the searx application is disabled - When I enable the searx application - Then the searx site should be available - And the search form should be visible - -@backups -Scenario: Backup and restore searx - Given the searx application is enabled - When I create a backup of the searx app data with name test_searx - And I restore the searx app data backup with name test_searx - Then the searx site should be available - -Scenario: Enable public access - Given the searx application is enabled - When I enable public access in searx - And I log out - Then searx app should be visible on the front page - And the searx site should be available - -Scenario: Disable public access - Given the searx application is enabled - When I disable public access in searx - And I log out - Then searx app should not be visible on the front page - And the searx site should not be available - -Scenario: Preserve public access setting - Given the searx application is enabled - And public access is enabled in searx - When I disable the searx application - And I enable the searx application - And I log out - Then searx app should be visible on the front page - And the searx site should be available - -Scenario: Disable searx application - Given the searx application is enabled - When I disable the searx application - Then the searx site should not be available diff --git a/plinth/modules/searx/tests/test_functional.py b/plinth/modules/searx/tests/test_functional.py index 747067bb1..cf35c60b7 100644 --- a/plinth/modules/searx/tests/test_functional.py +++ b/plinth/modules/searx/tests/test_functional.py @@ -3,32 +3,75 @@ Functional, browser based tests for searx app. """ -from pytest_bdd import given, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('searx.feature') +pytestmark = [pytest.mark.apps, pytest.mark.searx] -@given('public access is enabled in searx') -def searx_public_access_enabled(session_browser): - _enable_public_access(session_browser) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'searx') + yield + functional.login(session_browser) + functional.app_disable(session_browser, 'searx') -@when('I enable public access in searx') -def searx_enable_public_access(session_browser): - _enable_public_access(session_browser) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'searx') - -@when('I disable public access in searx') -def searx_disable_public_access(session_browser): - _disable_public_access(session_browser) - - -@then('the search form should be visible') -def is_searx_search_form_visible(session_browser): + functional.app_enable(session_browser, 'searx') + assert functional.is_available(session_browser, 'searx') _is_search_form_visible(session_browser) + functional.app_disable(session_browser, 'searx') + assert not functional.is_available(session_browser, 'searx') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'searx') + functional.backup_create(session_browser, 'searx', 'test_searx') + functional.backup_restore(session_browser, 'searx', 'test_searx') + assert functional.is_available(session_browser, 'searx') + + +def test_public_access(session_browser): + """Test enabling public access.""" + functional.app_enable(session_browser, 'searx') + + # Enable public access + _enable_public_access(session_browser) + functional.logout(session_browser) + assert functional.is_visible_on_front_page(session_browser, 'searx') + assert functional.is_available(session_browser, 'searx') + + # Disable public access + functional.login(session_browser) + _disable_public_access(session_browser) + functional.logout(session_browser) + assert not functional.is_visible_on_front_page(session_browser, 'searx') + assert not functional.is_available(session_browser, 'searx') + + +def test_preserve_public_access_setting(session_browser): + """Test that public access setting is preserved when disabling and + re-enabling the app.""" + functional.login(session_browser) + functional.app_enable(session_browser, 'searx') + _enable_public_access(session_browser) + + functional.app_disable(session_browser, 'searx') + functional.app_enable(session_browser, 'searx') + functional.logout(session_browser) + + assert functional.is_visible_on_front_page(session_browser, 'searx') + assert functional.is_available(session_browser, 'searx') + def _enable_public_access(browser): """Enable Public Access in SearX""" diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index 550b2db07..d8927acae 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -419,6 +419,11 @@ def find_on_front_page(browser, app_name): return shortcuts +def is_visible_on_front_page(browser, app_name): + shortcuts = find_on_front_page(browser, app_name) + return len(shortcuts) == 1 + + #################### # Daemon utilities # #################### From 9ec995a741bf982c31784ea268a3e8be153bbc53 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 2 Oct 2021 15:11:24 -0400 Subject: [PATCH 13/58] security: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../modules/security/tests/security.feature | 25 ------------ .../modules/security/tests/test_functional.py | 38 +++++++++++-------- 2 files changed, 23 insertions(+), 40 deletions(-) delete mode 100644 plinth/modules/security/tests/security.feature diff --git a/plinth/modules/security/tests/security.feature b/plinth/modules/security/tests/security.feature deleted file mode 100644 index d9dba5b9a..000000000 --- a/plinth/modules/security/tests/security.feature +++ /dev/null @@ -1,25 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@security @essential @system -Feature: Security - Configure security options. - -Background: - Given I'm a logged in user - -Scenario: Disable restricted console logins - Given restricted console logins are enabled - When I disable restricted console logins - Then restricted console logins should be disabled - -Scenario: Backup and restore security - When I enable restricted console logins - And I create a backup of the security app data with name test_security - And I disable restricted console logins - And I restore the security app data backup with name test_security - Then restricted console logins should be enabled - -Scenario: Enable restricted console logins - Given restricted console logins are disabled - When I enable restricted console logins - Then restricted console logins should be enabled diff --git a/plinth/modules/security/tests/test_functional.py b/plinth/modules/security/tests/test_functional.py index c0266b111..356d3f12d 100644 --- a/plinth/modules/security/tests/test_functional.py +++ b/plinth/modules/security/tests/test_functional.py @@ -3,29 +3,37 @@ Functional, browser based tests for security app. """ -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('security.feature') +pytestmark = [pytest.mark.system, pytest.mark.security] -@given(parsers.parse('restricted console logins are {enabled}')) -def security_given_enable_restricted_logins(session_browser, enabled): - should_enable = (enabled == 'enabled') - _enable_restricted_logins(session_browser, should_enable) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) -@when(parsers.parse('I {enable} restricted console logins')) -def security_enable_restricted_logins(session_browser, enable): - should_enable = (enable == 'enable') - _enable_restricted_logins(session_browser, should_enable) +def test_restricted_console_logins(session_browser): + """Test enabling and disabling restricted console logins.""" + _enable_restricted_logins(session_browser, False) + assert not _get_restricted_logins(session_browser) + + _enable_restricted_logins(session_browser, True) + assert _get_restricted_logins(session_browser) -@then(parsers.parse('restricted console logins should be {enabled}')) -def security_assert_restricted_logins(session_browser, enabled): - enabled = (enabled == 'enabled') - assert _get_restricted_logins(session_browser) == enabled +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + _enable_restricted_logins(session_browser, True) + functional.backup_create(session_browser, 'security', 'test_security') + + _enable_restricted_logins(session_browser, False) + functional.backup_restore(session_browser, 'security', 'test_security') + + assert _get_restricted_logins(session_browser) def _enable_restricted_logins(browser, should_enable): From d3c7383cb62802b83b5c458543b11565b7deb067 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 2 Oct 2021 15:19:35 -0400 Subject: [PATCH 14/58] shadowsocks: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy [sunil: Properly changes the values before restoring from backup] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- .../shadowsocks/tests/shadowsocks.feature | 30 ------------ .../shadowsocks/tests/test_functional.py | 47 +++++++++++++------ 2 files changed, 33 insertions(+), 44 deletions(-) delete mode 100644 plinth/modules/shadowsocks/tests/shadowsocks.feature diff --git a/plinth/modules/shadowsocks/tests/shadowsocks.feature b/plinth/modules/shadowsocks/tests/shadowsocks.feature deleted file mode 100644 index 67167e004..000000000 --- a/plinth/modules/shadowsocks/tests/shadowsocks.feature +++ /dev/null @@ -1,30 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @shadowsocks -Feature: Shadowsocks Socks5 Proxy - Run the Shadowsocks Socks5 proxy client. - -Background: - Given I'm a logged in user - Given the shadowsocks application is installed - Given the shadowsocks application is configured - -Scenario: Enable shadowsocks application - Given the shadowsocks application is disabled - When I enable the shadowsocks application - Then the shadowsocks service should be running - -@backups -Scenario: Backup and restore shadowsocks - Given the shadowsocks application is enabled - When I configure shadowsocks with server example.com and password beforebackup123 - And I create a backup of the shadowsocks app data with name test_shadowsocks - And I configure shadowsocks with server example.org and password afterbackup123 - And I restore the shadowsocks app data backup with name test_shadowsocks - Then the shadowsocks service should be running - And shadowsocks should be configured with server example.com and password beforebackup123 - -Scenario: Disable shadowsocks application - Given the shadowsocks application is enabled - When I disable the shadowsocks application - Then the shadowsocks service should not be running diff --git a/plinth/modules/shadowsocks/tests/test_functional.py b/plinth/modules/shadowsocks/tests/test_functional.py index 3e6095690..5f7e7bcfa 100644 --- a/plinth/modules/shadowsocks/tests/test_functional.py +++ b/plinth/modules/shadowsocks/tests/test_functional.py @@ -3,30 +3,49 @@ Functional, browser based tests for shadowsocks app. """ -from pytest_bdd import given, parsers, scenarios, then, when +import pytest from plinth.tests import functional -scenarios('shadowsocks.feature') +pytestmark = [pytest.mark.apps, pytest.mark.shadowsocks] -@given('the shadowsocks application is configured') -def configure_shadowsocks(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'shadowsocks') _configure(session_browser, 'example.com', 'fakepassword') + yield + functional.app_disable(session_browser, 'shadowsocks') -@when( - parsers.parse('I configure shadowsocks with server {server:S} and ' - 'password {password:w}')) -def configure_shadowsocks_with_details(session_browser, server, password): - _configure(session_browser, server, password) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'shadowsocks') + + functional.app_enable(session_browser, 'shadowsocks') + assert functional.service_is_running(session_browser, 'shadowsocks') + + functional.app_disable(session_browser, 'shadowsocks') + assert functional.service_is_not_running(session_browser, 'shadowsocks') -@then( - parsers.parse('shadowsocks should be configured with server {server:S} ' - 'and password {password:w}')) -def assert_shadowsocks_configuration(session_browser, server, password): - assert (server, password) == _get_configuration(session_browser) +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'shadowsocks') + _configure(session_browser, 'example.com', 'beforebackup123') + functional.backup_create(session_browser, 'shadowsocks', + 'test_shadowsocks') + + _configure(session_browser, 'example.org', 'afterbackup123') + functional.backup_restore(session_browser, 'shadowsocks', + 'test_shadowsocks') + + assert functional.service_is_running(session_browser, 'shadowsocks') + assert _get_configuration(session_browser) == ('example.com', + 'beforebackup123') def _configure(browser, server, password): From a51e4aaa1c32d3eb01446a1e75f1bbef9800ebd0 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 09:00:59 -0400 Subject: [PATCH 15/58] sharing: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/sharing/tests/sharing.feature | 52 --------- .../modules/sharing/tests/test_functional.py | 100 ++++++++++-------- 2 files changed, 54 insertions(+), 98 deletions(-) delete mode 100644 plinth/modules/sharing/tests/sharing.feature diff --git a/plinth/modules/sharing/tests/sharing.feature b/plinth/modules/sharing/tests/sharing.feature deleted file mode 100644 index fc75661ee..000000000 --- a/plinth/modules/sharing/tests/sharing.feature +++ /dev/null @@ -1,52 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @sharing -Feature: Sharing - Share server folders over HTTP, etc. - -Background: - Given I'm a logged in user - -Scenario: Add new share - Given share tmp is not available - When I add a share tmp from path /tmp for admin - Then the share tmp should be listed from path /tmp for admin - And the share tmp should be accessible - -Scenario: Edit a share - Given share tmp is not available - When I remove share boot - And I add a share tmp from path /tmp for admin - And I edit share tmp to boot from path /boot for admin - Then the share tmp should not be listed - And the share tmp should not exist - And the share boot should be listed from path /boot for admin - And the share boot should be accessible - -Scenario: Remove a share - When I remove share tmp - And I add a share tmp from path /tmp for admin - And I remove share tmp - Then the share tmp should not be listed - And the share tmp should not exist - -Scenario: Share permissions - When I remove share tmp - And I add a share tmp from path /tmp for syncthing-access - Then the share tmp should be listed from path /tmp for syncthing-access - And the share tmp should not be accessible - -Scenario: Public share - When I edit share tmp to be public - And I log out - Then the share_tmp site should be available - -@backups -Scenario: Backup and restore sharing - Given share tmp is not available - When I add a share tmp from path /tmp for admin - And I create a backup of the sharing app data with name test_sharing - And I remove share tmp - And I restore the sharing app data backup with name test_sharing - Then the share tmp should be listed from path /tmp for admin - And the share tmp should be accessible diff --git a/plinth/modules/sharing/tests/test_functional.py b/plinth/modules/sharing/tests/test_functional.py index 0717038ca..5e335d29a 100644 --- a/plinth/modules/sharing/tests/test_functional.py +++ b/plinth/modules/sharing/tests/test_functional.py @@ -5,66 +5,69 @@ Functional, browser based tests for sharing app. import pytest import splinter -from pytest_bdd import given, parsers, scenarios, then, when - from plinth.tests import functional -scenarios('sharing.feature') +pytestmark = [pytest.mark.apps, pytest.mark.sharing] -@given(parsers.parse('share {name:w} is not available')) -def remove_share(session_browser, name): - _remove_share(session_browser, name) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) -@when(parsers.parse('I add a share {name:w} from path {path} for {group:S}')) -def add_share(session_browser, name, path, group): - _add_share(session_browser, name, path, group) +def test_add_remove_share(session_browser): + """Test adding and removing a share.""" + _remove_share(session_browser, 'tmp') + _add_share(session_browser, 'tmp', '/tmp', 'admin') + _verify_share(session_browser, 'tmp', '/tmp', 'admin') + _access_share(session_browser, 'tmp') + + _remove_share(session_browser, 'tmp') + _verify_invalid_share(session_browser, 'tmp') + _verify_nonexistant_share(session_browser, 'tmp') -@when( - parsers.parse('I edit share {old_name:w} to {new_name:w} from path {path} ' - 'for {group:w}')) -def edit_share(session_browser, old_name, new_name, path, group): - _edit_share(session_browser, old_name, new_name, path, group) +def test_edit_share(session_browser): + """Test editing a share.""" + _remove_share(session_browser, 'tmp') + _remove_share(session_browser, 'boot') + + _add_share(session_browser, 'tmp', '/tmp', 'admin') + _edit_share(session_browser, 'tmp', 'boot', '/boot', 'admin') + + _verify_invalid_share(session_browser, 'tmp') + _verify_nonexistant_share(session_browser, 'tmp') + + _verify_share(session_browser, 'boot', '/boot', 'admin') + _access_share(session_browser, 'boot') -@when(parsers.parse('I remove share {name:w}')) -def remove_share2(session_browser, name): - _remove_share(session_browser, name) +def test_share_permissions(session_browser): + """Test share permissions.""" + _remove_share(session_browser, 'tmp') + _add_share(session_browser, 'tmp', '/tmp', 'syncthing-access') + _verify_share(session_browser, 'tmp', '/tmp', 'syncthing-access') + _verify_inaccessible_share(session_browser, 'tmp') + + _make_share_public(session_browser, 'tmp') + functional.logout(session_browser) + assert functional.is_available(session_browser, 'share_tmp') + functional.login(session_browser) -@when(parsers.parse('I edit share {name:w} to be public')) -def edit_share_public_access(session_browser, name): - _make_share_public(session_browser, name) +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + _remove_share(session_browser, 'tmp') + _add_share(session_browser, 'tmp', '/tmp', 'admin') + functional.backup_create(session_browser, 'sharing', 'test_sharing') + _remove_share(session_browser, 'tmp') + functional.backup_restore(session_browser, 'sharing', 'test_sharing') -@then( - parsers.parse( - 'the share {name:w} should be listed from path {path} for {group:S}')) -def verify_share(session_browser, name, path, group): - _verify_share(session_browser, name, path, group) - - -@then(parsers.parse('the share {name:w} should not be listed')) -def verify_invalid_share(session_browser, name): - with pytest.raises(splinter.exceptions.ElementDoesNotExist): - _get_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should be accessible')) -def access_share(session_browser, name): - _access_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should not exist')) -def verify_nonexistant_share(session_browser, name): - _verify_nonexistant_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should not be accessible')) -def verify_inaccessible_share(session_browser, name): - _verify_inaccessible_share(session_browser, name) + _verify_share(session_browser, 'tmp', '/tmp', 'admin') + _access_share(session_browser, 'tmp') def _remove_share(browser, name): @@ -135,6 +138,11 @@ def _make_share_public(browser, name): functional.submit(browser) +def _verify_invalid_share(browser, name): + with pytest.raises(splinter.exceptions.ElementDoesNotExist): + _get_share(browser, name) + + def _verify_nonexistant_share(browser, name): """Verify that given URL for a given share name is a 404.""" functional.visit(browser, f'/share/{name}') From b9f561a43fbc7e478ad7c6e18ea05530604eaf5b Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 10:59:04 -0400 Subject: [PATCH 16/58] snapshot: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../modules/snapshot/tests/snapshot.feature | 28 ----- .../modules/snapshot/tests/test_functional.py | 105 +++++++----------- 2 files changed, 40 insertions(+), 93 deletions(-) delete mode 100644 plinth/modules/snapshot/tests/snapshot.feature diff --git a/plinth/modules/snapshot/tests/snapshot.feature b/plinth/modules/snapshot/tests/snapshot.feature deleted file mode 100644 index bd2687186..000000000 --- a/plinth/modules/snapshot/tests/snapshot.feature +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@system @snapshot -Feature: Storage Snapshots - Run storage snapshots application - Snapper. - -Background: - Given I'm a logged in user - And the snapshot application is installed - And the filesystem supports snapshots - -Scenario: Create a snapshot - Given the list of snapshots is empty - When I manually create a snapshot - Then there should be 1 more snapshots in the list - -Scenario: Configure snapshots - Given snapshots are configured with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 - When I configure snapshots with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - Then snapshots should be configured with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - -@backups -Scenario: Backup and restore snapshot - When I configure snapshots with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 - And I create a backup of the snapshot app data with name test_storage_snapshots - And I configure snapshots with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - And I restore the snapshot app data backup with name test_storage_snapshots - Then snapshots should be configured with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 diff --git a/plinth/modules/snapshot/tests/test_functional.py b/plinth/modules/snapshot/tests/test_functional.py index d1b0dc0be..7bdfc8ec8 100644 --- a/plinth/modules/snapshot/tests/test_functional.py +++ b/plinth/modules/snapshot/tests/test_functional.py @@ -4,84 +4,59 @@ Functional, browser based tests for snapshot app. """ import pytest -from pytest_bdd import given, parsers, scenarios, then, when - from plinth.tests import functional -scenarios('snapshot.feature') +pytestmark = [pytest.mark.system, pytest.mark.snapshot] -@given('the filesystem supports snapshots') -def is_snapshots_supported(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'snapshot') if not _is_snapshot_supported(session_browser): pytest.skip('Filesystem doesn\'t support snapshots') - assert True -@given('the list of snapshots is empty', target_fixture='empty_snapshots_list') -def empty_snapshots_list(session_browser): - _delete_all(session_browser) - return _get_count(session_browser) +def test_create(session_browser): + """Test creating a snapshot.""" + _empty_snapshots_list(session_browser) + _create_snapshot(session_browser) + assert _get_count(session_browser) == 1 -@when('I manually create a snapshot') -def create_snapshot(session_browser): - _create(session_browser) +def test_configure(session_browser): + """Test configuring snapshots.""" + _set_configuration(session_browser, free_space=30, timeline_enabled=False, + software_enabled=False, hourly=10, daily=3, weekly=2, + monthly=2, yearly=0) + _set_configuration(session_browser, free_space=20, timeline_enabled=True, + software_enabled=True, hourly=3, daily=2, weekly=1, + monthly=1, yearly=1) + assert _get_configuration(session_browser) == (20, True, True, 3, 2, 1, 1, + 1) -@then(parsers.parse('there should be {count:d} more snapshots in the list')) -def verify_snapshot_count(session_browser, count, empty_snapshots_list): - assert _get_count(session_browser) == count + empty_snapshots_list +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + _set_configuration(session_browser, free_space=30, timeline_enabled=False, + software_enabled=False, hourly=10, daily=3, weekly=2, + monthly=2, yearly=0) + functional.backup_create(session_browser, 'snapshot', 'test_snapshot') + + _set_configuration(session_browser, free_space=20, timeline_enabled=True, + software_enabled=True, hourly=3, daily=2, weekly=1, + monthly=1, yearly=1) + functional.backup_restore(session_browser, 'snapshot', 'test_snapshot') + + assert _get_configuration(session_browser) == (30, False, False, 10, 3, 2, + 2, 0) -@given( - parsers.parse( - 'snapshots are configured with free space {free_space:d}, timeline ' - 'snapshots {timeline_enabled:w}, software snapshots ' - '{software_enabled:w}, hourly limit {hourly:d}, daily limit {daily:d}' - ', weekly limit {weekly:d}, monthly limit {monthly:d}, yearly limit ' - '{yearly:d}')) -def snapshot_given_set_configuration(session_browser, free_space, - timeline_enabled, software_enabled, - hourly, daily, weekly, monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - _set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, monthly, - yearly) - - -@when( - parsers.parse( - 'I configure snapshots with free space {free_space:d}, ' - 'timeline snapshots {timeline_enabled:w}, ' - 'software snapshots {software_enabled:w}, hourly limit {hourly:d}, ' - 'daily limit {daily:d}, weekly limit {weekly:d}, monthly limit ' - '{monthly:d}, yearly limit {yearly:d}')) -def snapshot_set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, - monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - _set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, monthly, - yearly) - - -@then( - parsers.parse( - 'snapshots should be configured with free space {free_space:d}, ' - 'timeline snapshots {timeline_enabled:w}, software snapshots ' - '{software_enabled:w}, hourly limit {hourly:d}, daily limit ' - '{daily:d}, weekly limit {weekly:d}, monthly limit {monthly:d}, ' - 'yearly limit {yearly:d}')) -def snapshot_assert_configuration(session_browser, free_space, - timeline_enabled, software_enabled, hourly, - daily, weekly, monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - assert (free_space, timeline_enabled, software_enabled, hourly, daily, - weekly, monthly, yearly) == _get_configuration(session_browser) +def _empty_snapshots_list(browser): + _delete_all(browser) + return _get_count(browser) def _delete_all(browser): @@ -96,7 +71,7 @@ def _delete_all(browser): functional.submit(browser, confirm_button) -def _create(browser): +def _create_snapshot(browser): functional.visit(browser, '/plinth/sys/snapshot/manage/') functional.submit(browser) # Click on 'Create Snapshot' From f8258fcef49c23203b80c1398a655d7e1f2afadc Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 11:29:26 -0400 Subject: [PATCH 17/58] ssh: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy [sunil: Ensure app is enabled after tests] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/ssh/tests/ssh.feature | 28 ---------------- plinth/modules/ssh/tests/test_functional.py | 37 +++++++++++++++++++-- 2 files changed, 35 insertions(+), 30 deletions(-) delete mode 100644 plinth/modules/ssh/tests/ssh.feature diff --git a/plinth/modules/ssh/tests/ssh.feature b/plinth/modules/ssh/tests/ssh.feature deleted file mode 100644 index 251125044..000000000 --- a/plinth/modules/ssh/tests/ssh.feature +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @ssh -Feature: Secure Shell Server - Run secure shell server. - -Background: - Given I'm a logged in user - Given the ssh application is installed - -Scenario: Enable ssh application - Given the ssh application is disabled - When I enable the ssh application - Then the ssh service should be running - -Scenario: Disable ssh application - Given the ssh application is enabled - When I disable the ssh application - Then the ssh service should not be running - -# TODO: Improve this to actually check that earlier ssh certificate has been -# restored. -@backups -Scenario: Backup and restore ssh - Given the ssh application is enabled - When I create a backup of the ssh app data with name test_ssh - And I restore the ssh app data backup with name test_ssh - Then the ssh service should be running diff --git a/plinth/modules/ssh/tests/test_functional.py b/plinth/modules/ssh/tests/test_functional.py index 6b239f3ea..550769e1c 100644 --- a/plinth/modules/ssh/tests/test_functional.py +++ b/plinth/modules/ssh/tests/test_functional.py @@ -3,6 +3,39 @@ Functional, browser based tests for ssh app. """ -from pytest_bdd import scenarios +import pytest -scenarios('ssh.feature') +from plinth.tests import functional + +pytestmark = [pytest.mark.system, pytest.mark.ssh] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'ssh') + yield + functional.app_enable(session_browser, 'ssh') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'ssh') + + functional.app_enable(session_browser, 'ssh') + assert functional.service_is_running(session_browser, 'ssh') + + functional.app_disable(session_browser, 'ssh') + assert functional.service_is_not_running(session_browser, 'ssh') + + +# TODO: Improve this to actually check that earlier ssh certificate has been +# restored. +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'ssh') + functional.backup_create(session_browser, 'ssh', 'test_ssh') + functional.backup_restore(session_browser, 'ssh', 'test_ssh') + assert functional.service_is_running(session_browser, 'ssh') From 667f2575b6343016169b71e574a6c84829a23684 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 11:39:58 -0400 Subject: [PATCH 18/58] sso: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/sso/tests/sso.feature | 20 ---------------- plinth/modules/sso/tests/test_functional.py | 26 +++++++++++++++++++-- 2 files changed, 24 insertions(+), 22 deletions(-) delete mode 100644 plinth/modules/sso/tests/sso.feature diff --git a/plinth/modules/sso/tests/sso.feature b/plinth/modules/sso/tests/sso.feature deleted file mode 100644 index f6f0d998e..000000000 --- a/plinth/modules/sso/tests/sso.feature +++ /dev/null @@ -1,20 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@sso @essential @system -Feature: Single Sign On - Test Single Sign On features. - -Background: - Given I'm a logged in user - Given the syncthing application is installed - Given the syncthing application is enabled - - -Scenario: Logged out Plinth user cannot access Syncthing web interface - Given I'm a logged out user - When I access syncthing application - Then I should be prompted for login - -Scenario: Logged in Plinth user can access Syncthing web interface - When I access syncthing application - Then the syncthing site should be available diff --git a/plinth/modules/sso/tests/test_functional.py b/plinth/modules/sso/tests/test_functional.py index 3af0e47eb..631853720 100644 --- a/plinth/modules/sso/tests/test_functional.py +++ b/plinth/modules/sso/tests/test_functional.py @@ -3,6 +3,28 @@ Functional, browser based tests for sso app. """ -from pytest_bdd import scenarios +import pytest +from plinth.tests import functional -scenarios('sso.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.sso] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'syncthing') + functional.app_enable(session_browser, 'syncthing') + yield + functional.app_disable(session_browser, 'syncthing') + + +def test_app_access(session_browser): + """Test that only logged-in users can access Syncthing web interface.""" + functional.logout(session_browser) + functional.access_url(session_browser, 'syncthing') + assert functional.is_login_prompt(session_browser) + + functional.login(session_browser) + functional.access_url(session_browser, 'syncthing') + assert functional.is_available(session_browser, 'syncthing') From 3bbbd0c812ad7a2fa1e1d5dbf9831ee7c4961f6a Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 11:45:23 -0400 Subject: [PATCH 19/58] storage: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/storage/tests/storage.feature | 12 ------------ .../modules/storage/tests/test_functional.py | 18 +++++++++--------- 2 files changed, 9 insertions(+), 21 deletions(-) delete mode 100644 plinth/modules/storage/tests/storage.feature diff --git a/plinth/modules/storage/tests/storage.feature b/plinth/modules/storage/tests/storage.feature deleted file mode 100644 index bc3f51e5b..000000000 --- a/plinth/modules/storage/tests/storage.feature +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@system @storage @essential -Feature: Storage - Show information about the disks. - -Background: - Given I'm a logged in user - -Scenario: List disks - Given I'm on the storage page - Then the root disk should be shown diff --git a/plinth/modules/storage/tests/test_functional.py b/plinth/modules/storage/tests/test_functional.py index 3125d8a3d..cdfc085c1 100644 --- a/plinth/modules/storage/tests/test_functional.py +++ b/plinth/modules/storage/tests/test_functional.py @@ -3,24 +3,24 @@ Functional, browser based tests for storage app. """ import pytest -from pytest_bdd import given, parsers, scenarios, then - from plinth.tests import functional -scenarios('storage.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.storage] -@then('the root disk should be shown') -def storage_root_disk_is_shown(session_browser): - assert _is_root_disk_shown(session_browser) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) -@given(parsers.parse("I'm on the {name:w} page")) -def go_to_module(session_browser, name): +def test_list_disks(session_browser): + """Test that root disk is shown on storage page.""" if functional.running_inside_container: pytest.skip('Storage doesn\'t work inside a container') else: - functional.nav_to_module(session_browser, name) + functional.nav_to_module(session_browser, 'storage') + assert _is_root_disk_shown(session_browser) def _is_root_disk_shown(browser): From 7ea6eeeac8d552fd7f40c393cea5bea18ef71420 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 20:02:04 -0400 Subject: [PATCH 20/58] syncthing: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../modules/syncthing/tests/syncthing.feature | 59 ---------- .../syncthing/tests/test_functional.py | 111 ++++++++++++------ 2 files changed, 75 insertions(+), 95 deletions(-) delete mode 100644 plinth/modules/syncthing/tests/syncthing.feature diff --git a/plinth/modules/syncthing/tests/syncthing.feature b/plinth/modules/syncthing/tests/syncthing.feature deleted file mode 100644 index c252ac29d..000000000 --- a/plinth/modules/syncthing/tests/syncthing.feature +++ /dev/null @@ -1,59 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @syncthing @sso -Feature: Syncthing File Synchronization - Run Syncthing File Synchronization server. - -Background: - Given I'm a logged in user - Given the syncthing application is installed - -Scenario: Enable syncthing application - Given the syncthing application is disabled - When I enable the syncthing application - Then the syncthing service should be running - -Scenario: Authentication and usage reporting notifications not shown - Given the syncthing application is enabled - When I access syncthing application - Then the usage reporting notification is not shown - And the authentication notification is not shown - -Scenario: Add a syncthing folder - Given the syncthing application is enabled - And syncthing folder Test is not present - When I add a folder /tmp as syncthing folder Test - Then syncthing folder Test should be present - -Scenario: Remove a syncthing folder - Given the syncthing application is enabled - And folder /tmp is present as syncthing folder Test - When I remove syncthing folder Test - Then syncthing folder Test should not be present - -@backups -Scenario: Backup and restore syncthing - Given the syncthing application is enabled - And syncthing folder Test is not present - When I add a folder /tmp as syncthing folder Test - And I create a backup of the syncthing app data with name test_syncthing - And I remove syncthing folder Test - And I restore the syncthing app data backup with name test_syncthing - Then syncthing folder Test should be present - -Scenario: User of syncthing-access group can access syncthing site - Given the syncthing application is enabled - And the user syncthinguser in group syncthing-access exists - When I'm logged in as the user syncthinguser - Then the syncthing site should be available - -Scenario: User not of syncthing-access group can't access syncthing site - Given the syncthing application is enabled - And the user nogroupuser exists - When I'm logged in as the user nogroupuser - Then the syncthing site should not be available - -Scenario: Disable syncthing application - Given the syncthing application is enabled - When I disable the syncthing application - Then the syncthing service should not be running diff --git a/plinth/modules/syncthing/tests/test_functional.py b/plinth/modules/syncthing/tests/test_functional.py index cfbce4f55..f72bfd1d5 100644 --- a/plinth/modules/syncthing/tests/test_functional.py +++ b/plinth/modules/syncthing/tests/test_functional.py @@ -5,63 +5,102 @@ Functional, browser based tests for syncthing app. import time -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('syncthing.feature') +pytestmark = [pytest.mark.apps, pytest.mark.syncthing] -@given(parsers.parse('syncthing folder {folder_name:w} is not present')) -def syncthing_folder_not_present(session_browser, folder_name): - if _folder_is_present(session_browser, folder_name): - _remove_folder(session_browser, folder_name) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'syncthing') + yield + functional.app_disable(session_browser, 'syncthing') -@given( - parsers.parse( - 'folder {folder_path:S} is present as syncthing folder {folder_name:w}' - )) -def syncthing_folder_present(session_browser, folder_name, folder_path): - if not _folder_is_present(session_browser, folder_name): - _add_folder(session_browser, folder_name, folder_path) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'syncthing') + + functional.app_enable(session_browser, 'syncthing') + assert functional.service_is_running(session_browser, 'syncthing') + + functional.app_disable(session_browser, 'syncthing') + assert functional.service_is_not_running(session_browser, 'syncthing') -@when( - parsers.parse( - 'I add a folder {folder_path:S} as syncthing folder {folder_name:w}')) -def syncthing_add_folder(session_browser, folder_name, folder_path): - _add_folder(session_browser, folder_name, folder_path) +def test_notifications(session_browser): + """Test that authentication and usage reporting notifications are not + shown.""" + functional.app_enable(session_browser, 'syncthing') + functional.access_url(session_browser, 'syncthing') + _assert_usage_report_notification_not_shown(session_browser) + _assert_authentication_notification_not_shown(session_browser) -@when(parsers.parse('I remove syncthing folder {folder_name:w}')) -def syncthing_remove_folder(session_browser, folder_name): - _remove_folder(session_browser, folder_name) +def test_add_remove_folder(session_browser): + """Test adding and removing a folder.""" + functional.app_enable(session_browser, 'syncthing') + if _folder_is_present(session_browser, 'Test'): + _remove_folder(session_browser, 'Test') + + _add_folder(session_browser, 'Test', '/tmp') + assert _folder_is_present(session_browser, 'Test') + + _remove_folder(session_browser, 'Test') + assert not _folder_is_present(session_browser, 'Test') -@then('the usage reporting notification is not shown') -def syncthing_assert_usage_report_notification_not_shown(session_browser): +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'syncthing') + if _folder_is_present(session_browser, 'Test'): + _remove_folder(session_browser, 'Test') + + _add_folder(session_browser, 'Test', '/tmp') + functional.backup_create(session_browser, 'syncthing', 'test_syncthing') + + _remove_folder(session_browser, 'Test') + functional.backup_restore(session_browser, 'syncthing', 'test_syncthing') + + assert _folder_is_present(session_browser, 'Test') + + +def test_user_group_access(session_browser): + """Test that only users in syncthing-access group can access syncthing + site.""" + functional.app_enable(session_browser, 'syncthing') + if not functional.user_exists(session_browser, 'syncthinguser'): + functional.create_user(session_browser, 'syncthinguser', + groups=['syncthing-access']) + if not functional.user_exists(session_browser, 'nogroupuser'): + functional.create_user(session_browser, 'nogroupuser') + + functional.login_with_account(session_browser, functional.base_url, + 'syncthinguser') + assert functional.is_available(session_browser, 'syncthing') + + functional.login_with_account(session_browser, functional.base_url, + 'nogroupuser') + assert not functional.is_available(session_browser, 'syncthing') + + functional.login(session_browser) + + +def _assert_usage_report_notification_not_shown(session_browser): _load_main_interface(session_browser) assert session_browser.find_by_id('ur').visible is False -@then('the authentication notification is not shown') -def syncthing_assert_authentication_notification_not_shown(session_browser): +def _assert_authentication_notification_not_shown(session_browser): _load_main_interface(session_browser) assert bool(session_browser.find_by_css( '#authenticationUserAndPassword *')) is False -@then(parsers.parse('syncthing folder {folder_name:w} should be present')) -def syncthing_assert_folder_present(session_browser, folder_name): - assert _folder_is_present(session_browser, folder_name) - - -@then(parsers.parse('syncthing folder {folder_name:w} should not be present')) -def syncthing_assert_folder_not_present(session_browser, folder_name): - assert not _folder_is_present(session_browser, folder_name) - - def _load_main_interface(browser): """Close the dialog boxes that many popup after visiting the URL.""" functional.access_url(browser, 'syncthing') From e500f191b3f859d6c553b77a1fe02c3e8164c6d7 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 3 Oct 2021 21:11:08 -0400 Subject: [PATCH 21/58] tahoe: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/tahoe/tests/tahoe.feature | 53 ------------ plinth/modules/tahoe/tests/test_functional.py | 84 +++++++++++++------ 2 files changed, 57 insertions(+), 80 deletions(-) delete mode 100644 plinth/modules/tahoe/tests/tahoe.feature diff --git a/plinth/modules/tahoe/tests/tahoe.feature b/plinth/modules/tahoe/tests/tahoe.feature deleted file mode 100644 index 8dcf9ca27..000000000 --- a/plinth/modules/tahoe/tests/tahoe.feature +++ /dev/null @@ -1,53 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -# TODO: When tahoe-lafs is restarted, it leaves a .gnupg folder in -# /var/lib/tahoe-lafs and failes to start in the next run. Enable tests after -# this is fixed. - -@apps @tahoe @skip -Feature: Tahoe-LAFS distribute file storage - Run the Tahoe distribute file storage server - -Background: - Given I'm a logged in user - And advanced mode is on - And the domain name is set to mydomain.example - And the tahoe application is installed - And the domain name for tahoe is set to mydomain.example - -Scenario: Enable tahoe application - Given the tahoe application is disabled - When I enable the tahoe application - Then the tahoe service should be running - -Scenario: Default tahoe introducers - Given the tahoe application is enabled - Then mydomain.example should be a tahoe local introducer - And mydomain.example should be a tahoe connected introducer - -Scenario: Add tahoe introducer - Given the tahoe application is enabled - And anotherdomain.example is not a tahoe introducer - When I add anotherdomain.example as a tahoe introducer - Then anotherdomain.example should be a tahoe connected introducer - -Scenario: Remove tahoe introducer - Given the tahoe application is enabled - And anotherdomain.example is a tahoe introducer - When I remove anotherdomain.example as a tahoe introducer - Then anotherdomain.example should not be a tahoe connected introducer - -@backups -Scenario: Backup and restore tahoe - Given the tahoe application is enabled - And backupdomain.example is a tahoe introducer - When I create a backup of the tahoe app data with name test_tahoe - And I remove backupdomain.example as a tahoe introducer - And I restore the tahoe app data backup with name test_tahoe - Then the tahoe service should be running - And backupdomain.example should be a tahoe connected introducer - -Scenario: Disable tahoe application - Given the tahoe application is enabled - When I disable the tahoe application - Then the tahoe service should not be running diff --git a/plinth/modules/tahoe/tests/test_functional.py b/plinth/modules/tahoe/tests/test_functional.py index c6ebedb29..cb13b6f25 100644 --- a/plinth/modules/tahoe/tests/test_functional.py +++ b/plinth/modules/tahoe/tests/test_functional.py @@ -3,47 +3,77 @@ Functional, browser based tests for tahoe app. """ -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('tahoe.feature') +pytestmark = [pytest.mark.apps, pytest.mark.tahoe, pytest.mark.skip] + +# TODO: When tahoe-lafs is restarted, it leaves a .gnupg folder in +# /var/lib/tahoe-lafs and failes to start in the next run. Enable tests after +# this is fixed. -@then( - parsers.parse( - '{domain:S} should be a tahoe {introducer_type:w} introducer')) -def tahoe_assert_introducer(session_browser, domain, introducer_type): - assert _get_introducer(session_browser, domain, introducer_type) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.set_advanced_mode(session_browser, True) + functional.set_domain_name(session_browser, 'mydomain.example') + functional.install(session_browser, 'tahoe') + functional.app_select_domain_name(session_browser, 'tahoe', + 'mydomain.example') + yield + functional.app_disable(session_browser, 'tahoe') -@then( - parsers.parse( - '{domain:S} should not be a tahoe {introducer_type:w} introducer')) -def tahoe_assert_not_introducer(session_browser, domain, introducer_type): - assert not _get_introducer(session_browser, domain, introducer_type) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'tahoe') + + functional.app_enable(session_browser, 'tahoe') + assert functional.service_is_running(session_browser, 'tahoe') + + functional.app_disable(session_browser, 'tahoe') + assert functional.service_is_not_running(session_browser, 'tahoe') -@given(parsers.parse('{domain:S} is not a tahoe introducer')) -def tahoe_given_remove_introducer(session_browser, domain): - if _get_introducer(session_browser, domain, 'connected'): - _remove_introducer(session_browser, domain) +def test_default_introducers(session_browser): + """Test default introducers.""" + functional.app_enable(session_browser, 'tahoe') + assert _get_introducer(session_browser, 'mydomain.example', 'local') + assert _get_introducer(session_browser, 'mydomain.example', 'connected') -@when(parsers.parse('I add {domain:S} as a tahoe introducer')) -def tahoe_add_introducer(session_browser, domain): - _add_introducer(session_browser, domain) +def test_add_remove_introducers(session_browser): + """Test add and remove introducers.""" + functional.app_enable(session_browser, 'tahoe') + if _get_introducer(session_browser, 'anotherdomain.example', 'connected'): + _remove_introducer(session_browser, 'anotherdomain.example') + + _add_introducer(session_browser, 'anotherdomain.example') + assert _get_introducer(session_browser, 'anotherdomain.example', + 'connected') + + _remove_introducer(session_browser, 'anotherdomain.example') + assert not _get_introducer(session_browser, 'anotherdomain.example', + 'connected') -@given(parsers.parse('{domain:S} is a tahoe introducer')) -def tahoe_given_add_introducer(session_browser, domain): - if not _get_introducer(session_browser, domain, 'connected'): - _add_introducer(session_browser, domain) +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'tahoe') + if not _get_introducer(session_browser, 'backupdomain.example', + 'connected'): + _add_introducer(session_browser, 'backupdomain.example') + functional.backup_create(session_browser, 'tahoe', 'test_tahoe') + _remove_introducer(session_browser, 'backupdomain.example') + functional.backup_restore(session_browser, 'tahoe', 'test_tahoe') -@when(parsers.parse('I remove {domain:S} as a tahoe introducer')) -def tahoe_remove_introducer(session_browser, domain): - _remove_introducer(session_browser, domain) + assert functional.service_is_running(session_browser, 'tahoe') + assert _get_introducer(session_browser, 'backupdomain.example', + 'connected') def _get_introducer(browser, domain, introducer_type): From 1bc42a76474e13aa3c14900446fb13d0e9ebb780 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 4 Oct 2021 18:07:48 -0400 Subject: [PATCH 22/58] tor: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy [sunil: Remove use of text constants for bool values (artifact of bdd)] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/tor/tests/test_functional.py | 124 ++++++++++---------- plinth/modules/tor/tests/tor.feature | 60 ---------- 2 files changed, 62 insertions(+), 122 deletions(-) delete mode 100644 plinth/modules/tor/tests/tor.feature diff --git a/plinth/modules/tor/tests/test_functional.py b/plinth/modules/tor/tests/test_functional.py index ae159ca46..3ccaa539e 100644 --- a/plinth/modules/tor/tests/test_functional.py +++ b/plinth/modules/tor/tests/test_functional.py @@ -3,7 +3,7 @@ Functional, browser based tests for tor app. """ -from pytest_bdd import given, parsers, scenarios, then, when +import pytest from plinth.tests import functional @@ -14,85 +14,88 @@ _TOR_FEATURE_TO_ELEMENT = { 'software': 'tor-apt_transport_tor_enabled' } -scenarios('tor.feature') +pytestmark = [pytest.mark.apps, pytest.mark.tor] -@given(parsers.parse('tor relay is {enabled:w}')) -def tor_given_relay_enable(session_browser, enabled): - _feature_enable(session_browser, 'relay', enabled) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'tor') + yield + functional.app_disable(session_browser, 'tor') -@when(parsers.parse('I {enable:w} tor relay')) -def tor_relay_enable(session_browser, enable): - _feature_enable(session_browser, 'relay', enable) +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'tor') + + functional.app_enable(session_browser, 'tor') + assert functional.service_is_running(session_browser, 'tor') + + functional.app_disable(session_browser, 'tor') + assert functional.service_is_not_running(session_browser, 'tor') -@then(parsers.parse('tor relay should be {enabled:w}')) -def tor_assert_relay_enabled(session_browser, enabled): - _assert_feature_enabled(session_browser, 'relay', enabled) +def test_set_tor_relay_configuration(session_browser): + """Test setting Tor relay configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'relay', should_enable=False) + _feature_enable(session_browser, 'relay', should_enable=True) + _assert_feature_enabled(session_browser, 'relay', enabled=True) + assert 'orport' in _get_relay_ports(session_browser) -@then(parsers.parse('tor {port_name:w} port should be displayed')) -def tor_assert_port_displayed(session_browser, port_name): - assert port_name in _get_relay_ports(session_browser) +def test_set_tor_bridge_relay_configuration(session_browser): + """Test setting Tor bridge relay configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'bridge-relay', should_enable=False) + _feature_enable(session_browser, 'bridge-relay', should_enable=True) + _assert_feature_enabled(session_browser, 'bridge-relay', enabled=True) + assert 'obfs3' in _get_relay_ports(session_browser) + assert 'obfs4' in _get_relay_ports(session_browser) -@given(parsers.parse('tor bridge relay is {enabled:w}')) -def tor_given_bridge_relay_enable(session_browser, enabled): - _feature_enable(session_browser, 'bridge-relay', enabled) - - -@when(parsers.parse('I {enable:w} tor bridge relay')) -def tor_bridge_relay_enable(session_browser, enable): - _feature_enable(session_browser, 'bridge-relay', enable) - - -@then(parsers.parse('tor bridge relay should be {enabled:w}')) -def tor_assert_bridge_relay_enabled(session_browser, enabled): - _assert_feature_enabled(session_browser, 'bridge-relay', enabled) - - -@given(parsers.parse('tor hidden services are {enabled:w}')) -def tor_given_hidden_services_enable(session_browser, enabled): - _feature_enable(session_browser, 'hidden-services', enabled) - - -@when(parsers.parse('I {enable:w} tor hidden services')) -def tor_hidden_services_enable(session_browser, enable): - _feature_enable(session_browser, 'hidden-services', enable) - - -@then(parsers.parse('tor hidden services should be {enabled:w}')) -def tor_assert_hidden_services_enabled(session_browser, enabled): - _assert_feature_enabled(session_browser, 'hidden-services', enabled) - - -@then(parsers.parse('tor hidden services information should be displayed')) -def tor_assert_hidden_services(session_browser): +def test_set_tor_hidden_services_configuration(session_browser): + """Test setting Tor hidden services configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'hidden-services', should_enable=False) + _feature_enable(session_browser, 'hidden-services', should_enable=True) + _assert_feature_enabled(session_browser, 'hidden-services', enabled=True) _assert_hidden_services(session_browser) -@given(parsers.parse('download software packages over tor is {enabled:w}')) -def tor_given_download_software_over_tor_enable(session_browser, enabled): - _feature_enable(session_browser, 'software', enabled) +def test_set_download_software_packages_over_tor(session_browser): + """Test setting download software packages over Tor.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'software', should_enable=True) + _feature_enable(session_browser, 'software', should_enable=False) + _assert_feature_enabled(session_browser, 'software', enabled=False) -@when(parsers.parse('I {enable:w} download software packages over tor')) -def tor_download_software_over_tor_enable(session_browser, enable): - _feature_enable(session_browser, 'software', enable) +# TODO: Test more thoroughly by checking same hidden service is restored and by +# actually connecting using Tor. +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + functional.app_enable(session_browser, 'tor') + _feature_enable(session_browser, 'relay', should_enable=True) + _feature_enable(session_browser, 'bridge-relay', should_enable=True) + _feature_enable(session_browser, 'hidden-services', should_enable=True) + functional.backup_create(session_browser, 'tor', 'test_tor') + _feature_enable(session_browser, 'relay', should_enable=False) + _feature_enable(session_browser, 'hidden-services', should_enable=False) + functional.backup_restore(session_browser, 'tor', 'test_tor') -@then( - parsers.parse('download software packages over tor should be {enabled:w}')) -def tor_assert_download_software_over_tor(session_browser, enabled): - _assert_feature_enabled(session_browser, 'software', enabled) + assert functional.service_is_running(session_browser, 'tor') + _assert_feature_enabled(session_browser, 'relay', enabled=True) + _assert_feature_enabled(session_browser, 'bridge-relay', enabled=True) + _assert_feature_enabled(session_browser, 'hidden-services', enabled=True) def _feature_enable(browser, feature, should_enable): """Enable/disable a Tor feature.""" - if not isinstance(should_enable, bool): - should_enable = should_enable in ('enable', 'enabled') - element_name = _TOR_FEATURE_TO_ELEMENT[feature] functional.nav_to_module(browser, 'tor') checkbox_element = browser.find_by_name(element_name).first @@ -113,9 +116,6 @@ def _feature_enable(browser, feature, should_enable): def _assert_feature_enabled(browser, feature, enabled): """Assert whether Tor relay is enabled or disabled.""" - if not isinstance(enabled, bool): - enabled = enabled in ('enable', 'enabled') - element_name = _TOR_FEATURE_TO_ELEMENT[feature] functional.nav_to_module(browser, 'tor') assert browser.find_by_name(element_name).first.checked == enabled diff --git a/plinth/modules/tor/tests/tor.feature b/plinth/modules/tor/tests/tor.feature deleted file mode 100644 index 4bd1f46f9..000000000 --- a/plinth/modules/tor/tests/tor.feature +++ /dev/null @@ -1,60 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @tor -Feature: Tor Anonymity Network - Manage Tor configuration. - -Background: - Given I'm a logged in user - Given the tor application is installed - -Scenario: Enable tor application - Given the tor application is disabled - When I enable the tor application - Then the tor service should be running - -Scenario: Set tor relay configuration - Given tor relay is disabled - When I enable tor relay - Then tor relay should be enabled - And tor orport port should be displayed - -Scenario: Set tor bridge relay configuration - Given tor bridge relay is disabled - When I enable tor bridge relay - Then tor bridge relay should be enabled - And tor obfs3 port should be displayed - And tor obfs4 port should be displayed - -Scenario: Set tor hidden services configuration - Given tor hidden services are disabled - When I enable tor hidden services - Then tor hidden services should be enabled - And tor hidden services information should be displayed - -Scenario: Set download software packages over tor - Given download software packages over tor is enabled - When I disable download software packages over tor - Then download software packages over tor should be disabled - -# TODO: Test more thoroughly by checking same hidden service is restored and by -# actually connecting using Tor. -@backups -Scenario: Backup and restore tor - Given the tor application is enabled - And tor relay is enabled - And tor bridge relay is enabled - And tor hidden services are enabled - When I create a backup of the tor app data with name test_tor - And I disable tor relay - And I disable tor hidden services - And I restore the tor app data backup with name test_tor - Then the tor service should be running - And tor relay should be enabled - And tor bridge relay should be enabled - And tor hidden services should be enabled - -Scenario: Disable tor application - Given the tor application is enabled - When I disable the tor application - Then the tor service should not be running From 79f09e3d885698bc012b56697f975a149c130614 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 4 Oct 2021 18:48:20 -0400 Subject: [PATCH 23/58] transmission: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../transmission/tests/test_functional.py | 57 ++++++++++++++----- .../transmission/tests/transmission.feature | 36 ------------ 2 files changed, 44 insertions(+), 49 deletions(-) delete mode 100644 plinth/modules/transmission/tests/transmission.feature diff --git a/plinth/modules/transmission/tests/test_functional.py b/plinth/modules/transmission/tests/test_functional.py index 68e8341e8..457e670e2 100644 --- a/plinth/modules/transmission/tests/test_functional.py +++ b/plinth/modules/transmission/tests/test_functional.py @@ -5,27 +5,58 @@ Functional, browser based tests for transmission app. import os -from pytest_bdd import parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('transmission.feature') +pytestmark = [pytest.mark.apps, pytest.mark.transmission, pytest.mark.sso] -@when('all torrents are removed from transmission') -def transmission_remove_all_torrents(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'transmission') + yield + functional.app_disable(session_browser, 'transmission') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'transmission') + + functional.app_enable(session_browser, 'transmission') + assert functional.is_available(session_browser, 'transmission') + + functional.app_disable(session_browser, 'transmission') + assert not functional.is_available(session_browser, 'transmission') + + +def test_upload_torrent(session_browser): + """Test uploading a torrent to Transmission.""" + functional.app_enable(session_browser, 'transmission') _remove_all_torrents(session_browser) - - -@when('I upload a sample torrent to transmission') -def transmission_upload_sample_torrent(session_browser): _upload_sample_torrent(session_browser) + _assert_number_of_torrents(session_browser, 1) -@then( - parsers.parse( - 'there should be {torrents_number:d} torrents listed in transmission')) -def transmission_assert_number_of_torrents(session_browser, torrents_number): +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'transmission') + _remove_all_torrents(session_browser) + _upload_sample_torrent(session_browser) + functional.backup_create(session_browser, 'transmission', + 'test_transmission') + + _remove_all_torrents(session_browser) + functional.backup_restore(session_browser, 'transmission', + 'test_transmission') + + assert functional.service_is_running(session_browser, 'transmission') + _assert_number_of_torrents(session_browser, 1) + + +def _assert_number_of_torrents(session_browser, torrents_number): functional.visit(session_browser, '/transmission') assert functional.eventually( lambda: torrents_number == _get_number_of_torrents(session_browser)) diff --git a/plinth/modules/transmission/tests/transmission.feature b/plinth/modules/transmission/tests/transmission.feature deleted file mode 100644 index bec006c7b..000000000 --- a/plinth/modules/transmission/tests/transmission.feature +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @transmission @sso -Feature: Transmission BitTorrent Client - Run the Transmission BitTorrent client. - -Background: - Given I'm a logged in user - Given the transmission application is installed - -Scenario: Enable transmission application - Given the transmission application is disabled - When I enable the transmission application - Then the transmission site should be available - -Scenario: Upload a torrent to transmission - Given the transmission application is enabled - When all torrents are removed from transmission - And I upload a sample torrent to transmission - Then there should be 1 torrents listed in transmission - -@backups -Scenario: Backup and restore transmission - Given the transmission application is enabled - When all torrents are removed from transmission - And I upload a sample torrent to transmission - And I create a backup of the transmission app data with name test_transmission - And all torrents are removed from transmission - And I restore the transmission app data backup with name test_transmission - Then the transmission service should be running - And there should be 1 torrents listed in transmission - -Scenario: Disable transmission application - Given the transmission application is enabled - When I disable the transmission application - Then the transmission site should not be available From 95a3784f02b5511412102703bfc5f564fcdc9916 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 4 Oct 2021 20:18:56 -0400 Subject: [PATCH 24/58] ttrss: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/ttrss/tests/test_functional.py | 40 ++++++++++++++----- plinth/modules/ttrss/tests/ttrss.feature | 29 -------------- 2 files changed, 29 insertions(+), 40 deletions(-) delete mode 100644 plinth/modules/ttrss/tests/ttrss.feature diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py index c67d99f52..57e87f1f8 100644 --- a/plinth/modules/ttrss/tests/test_functional.py +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -3,25 +3,43 @@ Functional, browser based tests for ttrss app. """ -from pytest_bdd import given, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('ttrss.feature') +pytestmark = [pytest.mark.apps, pytest.mark.ttrss, pytest.mark.sso] -@given('I subscribe to a feed in ttrss') -def ttrss_subscribe(session_browser): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'ttrss') + yield + functional.app_disable(session_browser, 'ttrss') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'ttrss') + + functional.app_enable(session_browser, 'ttrss') + assert functional.service_is_running(session_browser, 'ttrss') + + functional.app_disable(session_browser, 'ttrss') + assert functional.service_is_not_running(session_browser, 'ttrss') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of app data.""" + functional.app_enable(session_browser, 'ttrss') _subscribe(session_browser) + functional.backup_create(session_browser, 'ttrss', 'test_ttrss') - -@when('I unsubscribe from the feed in ttrss') -def ttrss_unsubscribe(session_browser): _unsubscribe(session_browser) + functional.backup_restore(session_browser, 'ttrss', 'test_ttrss') - -@then('I should be subscribed to the feed in ttrss') -def ttrss_assert_subscribed(session_browser): + assert functional.service_is_running(session_browser, 'ttrss') assert _is_subscribed(session_browser) diff --git a/plinth/modules/ttrss/tests/ttrss.feature b/plinth/modules/ttrss/tests/ttrss.feature deleted file mode 100644 index b1efdfa80..000000000 --- a/plinth/modules/ttrss/tests/ttrss.feature +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @ttrss @sso -Feature: TT-RSS News Feed Reader - Run TT-RSS News Feed Reader. - -Background: - Given I'm a logged in user - Given the ttrss application is installed - -Scenario: Enable ttrss application - Given the ttrss application is disabled - When I enable the ttrss application - Then the ttrss service should be running - -@backups -Scenario: Backup and restore ttrss - Given the ttrss application is enabled - And I subscribe to a feed in ttrss - When I create a backup of the ttrss app data with name test_ttrss - And I unsubscribe from the feed in ttrss - And I restore the ttrss app data backup with name test_ttrss - Then the ttrss service should be running - And I should be subscribed to the feed in ttrss - -Scenario: Disable ttrss application - Given the ttrss application is enabled - When I disable the ttrss application - Then the ttrss service should not be running From c92c95e39d310412f290189e5b331945f667d7e1 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 4 Oct 2021 20:36:48 -0400 Subject: [PATCH 25/58] upgrades: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- .../modules/upgrades/tests/test_functional.py | 41 ++++++++++++------- .../modules/upgrades/tests/upgrades.feature | 26 ------------ 2 files changed, 26 insertions(+), 41 deletions(-) delete mode 100644 plinth/modules/upgrades/tests/upgrades.feature diff --git a/plinth/modules/upgrades/tests/test_functional.py b/plinth/modules/upgrades/tests/test_functional.py index 48e2c60fd..22fb94106 100644 --- a/plinth/modules/upgrades/tests/test_functional.py +++ b/plinth/modules/upgrades/tests/test_functional.py @@ -3,29 +3,40 @@ Functional, browser based tests for upgrades app. """ -from pytest_bdd import given, parsers, scenarios, then, when - +import pytest from plinth.tests import functional -scenarios('upgrades.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.upgrades] -@given(parsers.parse('automatic upgrades are {enabled:w}')) -def upgrades_given_enable_automatic(session_browser, enabled): - should_enable = (enabled == 'enabled') - _enable_automatic(session_browser, should_enable) +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) + yield + _enable_automatic(session_browser, False) -@when(parsers.parse('I {enable:w} automatic upgrades')) -def upgrades_enable_automatic(session_browser, enable): - should_enable = (enable == 'enable') - _enable_automatic(session_browser, should_enable) +def test_enable_automatic_upgrades(session_browser): + """Test enabling automatic upgrades.""" + _enable_automatic(session_browser, False) + _enable_automatic(session_browser, True) + assert _get_automatic(session_browser) + + _enable_automatic(session_browser, False) + assert not _get_automatic(session_browser) -@then(parsers.parse('automatic upgrades should be {enabled:w}')) -def upgrades_assert_automatic(session_browser, enabled): - should_be_enabled = (enabled == 'enabled') - assert _get_automatic(session_browser) == should_be_enabled +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore of configuration.""" + _enable_automatic(session_browser, True) + functional.backup_create(session_browser, 'upgrades', 'test_upgrades') + + _enable_automatic(session_browser, False) + functional.backup_restore(session_browser, 'upgrades', 'test_upgrades') + + assert _get_automatic(session_browser) def _enable_automatic(browser, should_enable): diff --git a/plinth/modules/upgrades/tests/upgrades.feature b/plinth/modules/upgrades/tests/upgrades.feature deleted file mode 100644 index e828c7afc..000000000 --- a/plinth/modules/upgrades/tests/upgrades.feature +++ /dev/null @@ -1,26 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@essential @upgrades @system -Feature: Software Upgrades - Configure automatic software upgrades - -Background: - Given I'm a logged in user - -Scenario: Enable automatic upgrades - Given automatic upgrades are disabled - When I enable automatic upgrades - Then automatic upgrades should be enabled - -@backups -Scenario: Backup and restore upgrades - When I enable automatic upgrades - And I create a backup of the upgrades app data with name test_upgrades - And I disable automatic upgrades - And I restore the upgrades app data backup with name test_upgrades - Then automatic upgrades should be enabled - -Scenario: Disable automatic upgrades - Given automatic upgrades are enabled - When I disable automatic upgrades - Then automatic upgrades should be disabled From a89b4de8b7508bee8ef61e20c2b72ed4739d109c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 4 Oct 2021 21:36:30 -0400 Subject: [PATCH 26/58] zoph: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/zoph/tests/test_functional.py | 36 +++++++++++++++++--- plinth/modules/zoph/tests/zoph.feature | 27 --------------- 2 files changed, 32 insertions(+), 31 deletions(-) delete mode 100644 plinth/modules/zoph/tests/zoph.feature diff --git a/plinth/modules/zoph/tests/test_functional.py b/plinth/modules/zoph/tests/test_functional.py index f0ebab73a..854f7fb75 100644 --- a/plinth/modules/zoph/tests/test_functional.py +++ b/plinth/modules/zoph/tests/test_functional.py @@ -3,14 +3,42 @@ Functional, browser based tests for zoph app. """ -from pytest_bdd import given, parsers, scenarios - +import pytest from plinth.tests import functional -scenarios('zoph.feature') +pytestmark = [pytest.mark.apps, pytest.mark.zoph] + + +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login and install the app.""" + functional.login(session_browser) + functional.install(session_browser, 'zoph') + _zoph_is_setup(session_browser) + yield + functional.app_disable(session_browser, 'zoph') + + +def test_enable_disable(session_browser): + """Test enabling the app.""" + functional.app_disable(session_browser, 'zoph') + + functional.app_enable(session_browser, 'zoph') + assert functional.app_is_enabled(session_browser, 'zoph') + + functional.app_disable(session_browser, 'zoph') + assert not functional.app_is_enabled(session_browser, 'zoph') + + +@pytest.mark.backups +def test_backup_restore(session_browser): + """Test backup and restore.""" + functional.app_enable(session_browser, 'zoph') + functional.backup_create(session_browser, 'zoph', 'test_zoph') + functional.backup_restore(session_browser, 'zoph', 'test_zoph') + assert functional.app_is_enabled(session_browser, 'zoph') -@given(parsers.parse('the zoph application is setup')) def _zoph_is_setup(session_browser): """Click setup button on the setup page.""" functional.nav_to_module(session_browser, 'zoph') diff --git a/plinth/modules/zoph/tests/zoph.feature b/plinth/modules/zoph/tests/zoph.feature deleted file mode 100644 index e7c655794..000000000 --- a/plinth/modules/zoph/tests/zoph.feature +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -@apps @zoph -Feature: Zoph Organises PHotos - Run photo organiser - -Background: - Given I'm a logged in user - Given the zoph application is installed - Given the zoph application is setup - -Scenario: Enable zoph application - Given the zoph application is disabled - When I enable the zoph application - Then the zoph application is enabled - -@backups -Scenario: Backup and restore zoph - Given the zoph application is enabled - When I create a backup of the zoph app data with name test_zoph - And I restore the zoph app data backup with name test_zoph - Then the zoph application is enabled - -Scenario: Disable zoph application - Given the zoph application is enabled - When I disable the zoph application - Then the zoph application is disabled From 0aaf9ad6dff44617f1c9954ae4fa9b9b7ff2759c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 4 Oct 2021 22:19:33 -0400 Subject: [PATCH 27/58] users: Convert functional tests to non-BDD python format Signed-off-by: James Valleroy [sunil: Delete user before running create test] [sunil: Minor refactor for simplicity] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/users/tests/test_functional.py | 270 ++++++++++-------- plinth/modules/users/tests/users.feature | 105 ------- 2 files changed, 146 insertions(+), 229 deletions(-) delete mode 100644 plinth/modules/users/tests/users.feature diff --git a/plinth/modules/users/tests/test_functional.py b/plinth/modules/users/tests/test_functional.py index 6e6ecfe2c..467b18c5c 100644 --- a/plinth/modules/users/tests/test_functional.py +++ b/plinth/modules/users/tests/test_functional.py @@ -3,17 +3,19 @@ Functional, browser based tests for users app. """ +# TODO Scenario: Add user to wiki group +# TODO Scenario: Remove user from wiki group + import subprocess import urllib import pytest -from pytest_bdd import given, parsers, scenarios, then, when from plinth.tests import functional _admin_password = functional.config['DEFAULT']['password'] -scenarios('users.feature') +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.users] _language_codes = { 'None': '', @@ -50,26 +52,150 @@ _config_page_title_language_map = { } -@given(parsers.parse('the admin user {name:w} exists')) -def admin_user_exists(session_browser, name): +@pytest.fixture(scope='module', autouse=True) +def fixture_background(session_browser): + """Login.""" + functional.login(session_browser) + yield + _set_language(session_browser, _language_codes['None']) + + +def test_create_user(session_browser): + """Test creating a user.""" + if functional.user_exists(session_browser, 'alice'): + functional.delete_user(session_browser, 'alice') + + functional.create_user(session_browser, 'alice') + assert functional.user_exists(session_browser, 'alice') + + +def test_rename_user(session_browser): + """Test renaming a user.""" + _non_admin_user_exists(session_browser, 'alice') + if functional.user_exists(session_browser, 'bob'): + functional.delete_user(session_browser, 'bob') + + _rename_user(session_browser, 'alice', 'bob') + assert not functional.user_exists(session_browser, 'alice') + assert functional.user_exists(session_browser, 'bob') + + +def test_admin_users_can_change_own_ssh_keys(session_browser): + """Test that admin users can change their own ssh keys.""" + _set_ssh_keys(session_browser, 'somekey123') + assert _get_ssh_keys(session_browser) == 'somekey123' + + +def test_non_admin_users_can_change_own_ssh_keys(session_browser): + """Test that non-admin users can change their own ssh keys.""" + _non_admin_user_exists(session_browser, 'alice') + functional.login_with_account(session_browser, functional.base_url, + 'alice') + _set_ssh_keys(session_browser, 'somekey456') + assert _get_ssh_keys(session_browser) == 'somekey456' + functional.login(session_browser) + + +def test_admin_users_can_change_other_users_ssh_keys(session_browser): + """Test that admin users can change other user's ssh keys.""" + _non_admin_user_exists(session_browser, 'alice') + _set_ssh_keys(session_browser, 'alicesomekey123', username='alice') + assert _get_ssh_keys(session_browser, + username='alice') == 'alicesomekey123' + + +def test_users_can_remove_ssh_keys(session_browser): + """Test that users can remove ssh keys.""" + _set_ssh_keys(session_browser, 'somekey123') + _set_ssh_keys(session_browser, '') + assert _get_ssh_keys(session_browser) == '' + + +def test_users_can_connect_passwordless_over_ssh(session_browser, + tmp_path_factory): + """Test that users can connect passwordless over ssh if the keys are + set.""" + functional.app_enable(session_browser, 'ssh') + _generate_ssh_keys(session_browser, tmp_path_factory) + _configure_ssh_keys(session_browser, tmp_path_factory) + _should_connect_passwordless_over_ssh(session_browser, tmp_path_factory) + + +def test_users_cannot_connect_passwordless_over_ssh(session_browser, + tmp_path_factory): + """Test that users cannot connect passwordless over ssh if the keys aren't + set.""" + functional.app_enable(session_browser, 'ssh') + _generate_ssh_keys(session_browser, tmp_path_factory) + _configure_ssh_keys(session_browser, tmp_path_factory) + _set_ssh_keys(session_browser, '') + _should_not_connect_passwordless_over_ssh(session_browser, + tmp_path_factory) + + +@pytest.mark.parametrize('language_code', _language_codes.values()) +def test_change_language(session_browser, language_code): + """Test changing the language.""" + _set_language(session_browser, language_code) + assert _check_language(session_browser, language_code) + + +def test_admin_users_can_set_others_as_inactive(session_browser): + """Test that admin users can set other users as inactive.""" + _non_admin_user_exists(session_browser, 'alice') + _set_user_inactive(session_browser, 'alice') + _cannot_log_in(session_browser, 'alice') + functional.login(session_browser) + + +def test_admin_users_can_change_own_password(session_browser): + """Test that admin users can change their own password.""" + _admin_user_exists(session_browser, 'testadmin') + functional.login_with_account(session_browser, functional.base_url, + 'testadmin') + _change_password(session_browser, 'newpassword456') + _can_log_in_with_password(session_browser, 'testadmin', 'newpassword456') + functional.login(session_browser) + + +def test_admin_users_can_change_others_password(session_browser): + """Test that admin users can change other user's password.""" + _non_admin_user_exists(session_browser, 'alice') + _change_password(session_browser, 'secretsecret567', username='alice') + _can_log_in_with_password(session_browser, 'alice', 'secretsecret567') + functional.login(session_browser) + + +def test_non_admin_users_can_change_own_password(session_browser): + """Test that non-admin users can change their own password.""" + _non_admin_user_exists(session_browser, 'alice') + functional.login_with_account(session_browser, functional.base_url, + 'alice') + _change_password(session_browser, 'newpassword123') + _can_log_in_with_password(session_browser, 'alice', 'newpassword123') + functional.login(session_browser) + + +def test_delete_user(session_browser): + """Test deleting a user.""" + _non_admin_user_exists(session_browser, 'alice') + functional.delete_user(session_browser, 'alice') + assert not functional.user_exists(session_browser, 'alice') + + +def _admin_user_exists(session_browser, name): if functional.user_exists(session_browser, name): functional.delete_user(session_browser, name) functional.create_user(session_browser, name, groups=['admin']) -@given(parsers.parse("the user {name:w} doesn't exist")) -def user_does_not_exist(session_browser, name): +def _non_admin_user_exists(session_browser, name): if functional.user_exists(session_browser, name): functional.delete_user(session_browser, name) + functional.create_user(session_browser, name) -@given(parsers.parse('the ssh keys are {ssh_keys:w}')) -def ssh_keys(session_browser, ssh_keys): - _set_ssh_keys(session_browser, ssh_keys) - - -@given('the client has a ssh key') -def generate_ssh_keys(session_browser, tmp_path_factory): +def _generate_ssh_keys(session_browser, tmp_path_factory): key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key' try: key_file.unlink() @@ -81,147 +207,43 @@ def generate_ssh_keys(session_browser, tmp_path_factory): str(key_file)]) -@when(parsers.parse('I create a user named {name:w}')) -def create_user(session_browser, name): - functional.create_user(session_browser, name) - - -@when(parsers.parse('I rename the user {old_name:w} to {new_name:w}')) -def rename_user(session_browser, old_name, new_name): - _rename_user(session_browser, old_name, new_name) - - -@when(parsers.parse('I delete the user {name:w}')) -def delete_user(session_browser, name): - functional.delete_user(session_browser, name) - - -@when('I change the language to ') -def change_language(session_browser, language): - _set_language(session_browser, _language_codes[language]) - - -@when(parsers.parse('I change the ssh keys to {ssh_keys:w}')) -def change_ssh_keys(session_browser, ssh_keys): - _set_ssh_keys(session_browser, ssh_keys) - - -@when('I remove the ssh keys') -def remove_ssh_keys(session_browser): - _set_ssh_keys(session_browser, '') - - -@when( - parsers.parse( - 'I change the ssh keys to {ssh_keys:w} for the user {username:w}')) -def change_user_ssh_keys(session_browser, ssh_keys, username): - _set_ssh_keys(session_browser, ssh_keys, username=username) - - -@when(parsers.parse('I change my ssh keys to {ssh_keys:w}')) -def change_my_ssh_keys(session_browser, ssh_keys): - _set_ssh_keys(session_browser, ssh_keys) - - -@when(parsers.parse('I set the user {username:w} as inactive')) -def set_user_inactive(session_browser, username): - _set_user_inactive(session_browser, username) - - -@when(parsers.parse('I change my password to {new_password:w}')) -def change_my_password(session_browser, new_password): - _change_password(session_browser, new_password) - - -@when( - parsers.parse( - 'I change the user {username:w} password to {new_password:w}')) -def change_other_user_password(session_browser, username, new_password): - _change_password(session_browser, new_password, username=username) - - -@when('I configure the ssh keys') -def configure_ssh_keys(session_browser, tmp_path_factory): +def _configure_ssh_keys(session_browser, tmp_path_factory): public_key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key.pub' public_key = public_key_file.read_text() _set_ssh_keys(session_browser, public_key) -@then(parsers.parse('I can log in as the user {username:w}')) -def can_log_in(session_browser, username): +def _can_log_in(session_browser, username): functional.login_with_account(session_browser, functional.base_url, username) assert len(session_browser.find_by_id('id_user_menu')) > 0 -@then( - parsers.parse( - 'I can log in as the user {username:w} with password {password:w}')) -def can_log_in_with_password(session_browser, username, password): +def _can_log_in_with_password(session_browser, username, password): functional.logout(session_browser) functional.login_with_account(session_browser, functional.base_url, username, password) assert len(session_browser.find_by_id('id_user_menu')) > 0 -@then(parsers.parse("I can't log in as the user {username:w}")) -def cannot_log_in(session_browser, username): +def _cannot_log_in(session_browser, username): functional.login_with_account(session_browser, functional.base_url, username) assert len(session_browser.find_by_id('id_user_menu')) == 0 -@then('Plinth language should be ') -def plinth_language_should_be(session_browser, language): - assert _check_language(session_browser, _language_codes[language]) - - -@then(parsers.parse('the ssh keys should be {ssh_keys:w}')) -def ssh_keys_match(session_browser, ssh_keys): - assert _get_ssh_keys(session_browser) == ssh_keys - - -@then('the ssh keys should be removed') -def ssh_keys_should_be_removed(session_browser, ssh_keys): - assert _get_ssh_keys(session_browser) == '' - - -@then( - parsers.parse( - 'the ssh keys should be {ssh_keys:w} for the user {username:w}')) -def ssh_keys_match_for_user(session_browser, ssh_keys, username): - assert _get_ssh_keys(session_browser, username=username) == ssh_keys - - -@then(parsers.parse('my ssh keys should be {ssh_keys:w}')) -def my_ssh_keys_match(session_browser, ssh_keys): - assert _get_ssh_keys(session_browser) == ssh_keys - - -@then('the client should be able to connect passwordless over ssh') -def should_connect_passwordless_over_ssh(session_browser, tmp_path_factory): +def _should_connect_passwordless_over_ssh(session_browser, tmp_path_factory): key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key' _try_login_to_ssh(key_file=key_file) -@then("the client shouldn't be able to connect passwordless over ssh") -def should_not_connect_passwordless_over_ssh(session_browser, - tmp_path_factory): +def _should_not_connect_passwordless_over_ssh(session_browser, + tmp_path_factory): key_file = tmp_path_factory.getbasetemp() / 'users-ssh.key' with pytest.raises(subprocess.CalledProcessError): _try_login_to_ssh(key_file=key_file) -@then(parsers.parse('{name:w} should be listed as a user')) -def new_user_is_listed(session_browser, name): - assert functional.user_exists(session_browser, name) - - -@then(parsers.parse('{name:w} should not be listed as a user')) -def new_user_is_not_listed(session_browser, name): - assert not functional.user_exists(session_browser, name) - - def _rename_user(browser, old_name, new_name): functional.nav_to_module(browser, 'users') with functional.wait_for_page_update(browser): diff --git a/plinth/modules/users/tests/users.feature b/plinth/modules/users/tests/users.feature deleted file mode 100644 index 8f56ab348..000000000 --- a/plinth/modules/users/tests/users.feature +++ /dev/null @@ -1,105 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -# TODO Scenario: Add user to wiki group -# TODO Scenario: Remove user from wiki group - -@system @essential @users -Feature: Users and Groups - Manage users and groups. - -Background: - Given I'm a logged in user - -Scenario: Create user - Given the user alice doesn't exist - When I create a user named alice - Then alice should be listed as a user - -Scenario: Rename user - Given the user alice exists - Given the user bob doesn't exist - When I rename the user alice to bob - Then alice should not be listed as a user - And bob should be listed as a user - -Scenario: Admin users can change their own ssh keys - When I change the ssh keys to somekey123 - Then the ssh keys should be somekey123 - -Scenario: Non-admin users can change their own ssh keys - Given the user alice exists - And I'm logged in as the user alice - When I change my ssh keys to somekey456 - Then my ssh keys should be somekey456 - -Scenario: Admin users can change other user's ssh keys - Given the user alice exists - When I change the ssh keys to alicesomekey123 for the user alice - Then the ssh keys should be alicesomekey123 for the user alice - -Scenario: Users can remove ssh keys - Given the ssh keys are somekey123 - When I remove the ssh keys - Then the ssh keys should be removed - -Scenario: Users can connect passwordless over ssh if the keys are set - Given the ssh application is enabled - And the client has a ssh key - When I configure the ssh keys - Then the client should be able to connect passwordless over ssh - -Scenario: Users can't connect passwordless over ssh if the keys aren't set - Given the ssh application is enabled - And the client has a ssh key - And the ssh keys are configured - When I remove the ssh keys - Then the client shouldn't be able to connect passwordless over ssh - - -Scenario Outline: Change language - When I change the language to - Then Plinth language should be - - Examples: - | language | - | dansk | - | Deutsch | - | español | - | français | - | norsk (bokmål) | - | Nederlands | - | polski | - | Português | - | Русский | - | svenska | - | తెలుగు | - | Türkçe | - | 简体中文 | - | None | - -Scenario: Admin users can set other users an inactive - Given the user alice exists - When I set the user alice as inactive - Then I can't log in as the user alice - -Scenario: Admin users can change their own password - Given the user testadmin in group admin exists - And I'm logged in as the user testadmin - When I change my password to newpassword456 - Then I can log in as the user testadmin with password newpassword456 - -Scenario: Admin user can change other user's password - Given the user alice exists - When I change the user alice password to secretsecret567 - Then I can log in as the user alice with password secretsecret567 - -Scenario: Non-admin users can change their own password - Given the user alice exists - And I'm logged in as the user alice - When I change my password to newpassword123 - Then I can log in as the user alice with password newpassword123 - -Scenario: Delete user - Given the user alice exists - When I delete the user alice - Then alice should not be listed as a user From 9bad96c863df3c3daa9eb621895d49167dd643dd Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 5 Oct 2021 09:38:56 -0400 Subject: [PATCH 28/58] tests: Add some missed marks for functional tests Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/mldonkey/tests/test_functional.py | 2 +- plinth/modules/searx/tests/test_functional.py | 2 +- plinth/modules/security/tests/test_functional.py | 2 +- plinth/modules/syncthing/tests/test_functional.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plinth/modules/mldonkey/tests/test_functional.py b/plinth/modules/mldonkey/tests/test_functional.py index c6fe54db8..1a439a37d 100644 --- a/plinth/modules/mldonkey/tests/test_functional.py +++ b/plinth/modules/mldonkey/tests/test_functional.py @@ -6,7 +6,7 @@ Functional, browser based tests for mldonkey app. import pytest from plinth.tests import functional -pytestmark = [pytest.mark.apps, pytest.mark.mldonkey] +pytestmark = [pytest.mark.apps, pytest.mark.mldonkey, pytest.mark.sso] @pytest.fixture(scope='module', autouse=True) diff --git a/plinth/modules/searx/tests/test_functional.py b/plinth/modules/searx/tests/test_functional.py index cf35c60b7..74f952c91 100644 --- a/plinth/modules/searx/tests/test_functional.py +++ b/plinth/modules/searx/tests/test_functional.py @@ -6,7 +6,7 @@ Functional, browser based tests for searx app. import pytest from plinth.tests import functional -pytestmark = [pytest.mark.apps, pytest.mark.searx] +pytestmark = [pytest.mark.apps, pytest.mark.searx, pytest.mark.sso] @pytest.fixture(scope='module', autouse=True) diff --git a/plinth/modules/security/tests/test_functional.py b/plinth/modules/security/tests/test_functional.py index 356d3f12d..80b2e8f66 100644 --- a/plinth/modules/security/tests/test_functional.py +++ b/plinth/modules/security/tests/test_functional.py @@ -6,7 +6,7 @@ Functional, browser based tests for security app. import pytest from plinth.tests import functional -pytestmark = [pytest.mark.system, pytest.mark.security] +pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.security] @pytest.fixture(scope='module', autouse=True) diff --git a/plinth/modules/syncthing/tests/test_functional.py b/plinth/modules/syncthing/tests/test_functional.py index f72bfd1d5..e5ce13e00 100644 --- a/plinth/modules/syncthing/tests/test_functional.py +++ b/plinth/modules/syncthing/tests/test_functional.py @@ -8,7 +8,7 @@ import time import pytest from plinth.tests import functional -pytestmark = [pytest.mark.apps, pytest.mark.syncthing] +pytestmark = [pytest.mark.apps, pytest.mark.syncthing, pytest.mark.sso] @pytest.fixture(scope='module', autouse=True) From 38bbca76c63423d3bd217dd8afd3c60052b2f381 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 5 Oct 2021 09:51:53 -0400 Subject: [PATCH 29/58] tests: Drop step definitions Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- conftest.py | 14 -- plinth/tests/functional/step_definitions.py | 188 -------------------- 2 files changed, 202 deletions(-) delete mode 100644 plinth/tests/functional/step_definitions.py diff --git a/conftest.py b/conftest.py index b016f7fcb..d5551a936 100644 --- a/conftest.py +++ b/conftest.py @@ -11,20 +11,6 @@ from unittest.mock import patch import pytest -try: - importlib.import_module('pytest_bdd') - _bdd_available = True -except ImportError: - _bdd_available = False -else: - from plinth.tests.functional.step_definitions import * - - -def pytest_ignore_collect(path, config): - """Return True to ignore functional tests.""" - if path.basename == 'test_functional.py': - return not _bdd_available - def pytest_addoption(parser): """Add a command line option to run functional tests.""" diff --git a/plinth/tests/functional/step_definitions.py b/plinth/tests/functional/step_definitions.py deleted file mode 100644 index 5d48f6eed..000000000 --- a/plinth/tests/functional/step_definitions.py +++ /dev/null @@ -1,188 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later -""" -Step definitions used across apps. -""" - -import time - -import pytest -from pytest_bdd import given, parsers, then, when - -from plinth.tests import functional - - -@given("I'm a logged in user") -def logged_in(session_browser): - functional.login(session_browser) - - -@given("I'm a logged out user") -def logged_out_user(session_browser): - functional.logout(session_browser) - - -@when("I log out") -def log_out_user(session_browser): - functional.logout(session_browser) - - -@given(parsers.parse('the {app_name:w} application is installed')) -def application_is_installed(session_browser, app_name): - functional.install(session_browser, app_name) - assert (functional.is_installed(session_browser, app_name)) - - -@given(parsers.parse('the {app_name:w} application is enabled')) -def application_is_enabled(session_browser, app_name): - functional.app_enable(session_browser, app_name) - - -@given(parsers.parse('the {app_name:w} application is disabled')) -def application_is_disabled(session_browser, app_name): - functional.app_disable(session_browser, app_name) - - -@when(parsers.parse('I enable the {app_name:w} application')) -def enable_application(session_browser, app_name): - functional.app_enable(session_browser, app_name) - - -@when(parsers.parse('I disable the {app_name:w} application')) -def disable_application(session_browser, app_name): - functional.app_disable(session_browser, app_name) - - -@given(parsers.parse('the {app_name:w} application can be disabled')) -def app_can_be_disabled(session_browser, app_name): - if not functional.app_can_be_disabled(session_browser, app_name): - pytest.skip('network time application can\'t be disabled') - - -@then(parsers.parse('the {app_name:w} application is {enabled:w}')) -def app_assert_is_enabled(session_browser, app_name, enabled): - assert enabled in ('enabled', 'disabled') - enabled = (enabled == 'enabled') - assert functional.app_is_enabled(session_browser, app_name) == enabled - - -@then(parsers.parse('the {service_name:w} service should be running')) -def service_should_be_running(session_browser, service_name): - assert functional.eventually(functional.service_is_running, - args=[session_browser, service_name]) - - -@then(parsers.parse('the {service_name:w} service should not be running')) -def service_should_not_be_running(session_browser, service_name): - assert functional.eventually(functional.service_is_not_running, - args=[session_browser, service_name]) - - -@then(parsers.parse('I should be prompted for login')) -def prompted_for_login(session_browser): - assert functional.is_login_prompt(session_browser) - - -@given(parsers.parse('the domain name is set to {domain:S}')) -def step_set_domain_name(session_browser, domain): - functional.set_domain_name(session_browser, domain) - - -@then(parsers.parse('the {site_name:w} site should be available')) -def site_should_be_available(session_browser, site_name): - assert functional.is_available(session_browser, site_name) - - -@then(parsers.parse('the {site_name:w} site should not be available')) -def site_should_not_be_available(session_browser, site_name): - assert not functional.is_available(session_browser, site_name) - - -@when(parsers.parse('I access {app_name:w} application')) -def access_application(session_browser, app_name): - functional.access_url(session_browser, app_name) - - -@given('advanced mode is on') -def advanced_mode_is_on(session_browser): - functional.set_advanced_mode(session_browser, True) - - -@when( - parsers.parse('I create a backup of the {app_name:w} app data with ' - 'name {archive_name:w}')) -def backup_create(session_browser, app_name, archive_name): - functional.backup_create(session_browser, app_name, archive_name) - - -@when(parsers.parse('I wait for {seconds} seconds')) -def sleep_for(seconds): - seconds = int(seconds) - time.sleep(seconds) - - -@when( - parsers.parse( - 'I restore the {app_name:w} app data backup with name {archive_name:w}' - )) -def backup_restore(session_browser, app_name, archive_name): - functional.backup_restore(session_browser, app_name, archive_name) - - -@given(parsers.parse('the network device is in the {zone:w} firewall zone')) -def networks_set_firewall_zone(session_browser, zone): - functional.networks_set_firewall_zone(session_browser, zone) - - -@given( - parsers.parse('the domain name for {app_name:w} is set to {domain_name:S}') -) -def select_domain_name(session_browser, app_name, domain_name): - functional.app_select_domain_name(session_browser, app_name, domain_name) - - -@then(parsers.parse('{app_name:w} app should be visible on the front page')) -def app_visible_on_front_page(session_browser, app_name): - shortcuts = functional.find_on_front_page(session_browser, app_name) - assert len(shortcuts) == 1 - - -@then(parsers.parse('{app_name:w} app should not be visible on the front page') - ) -def app_not_visible_on_front_page(session_browser, app_name): - shortcuts = functional.find_on_front_page(session_browser, app_name) - assert len(shortcuts) == 0 - - -@given(parsers.parse('bind forwarders are set to {forwarders}')) -def bind_given_set_forwarders(session_browser, forwarders): - functional.set_forwarders(session_browser, forwarders) - - -@when(parsers.parse('I set bind forwarders to {forwarders}')) -def bind_set_forwarders(session_browser, forwarders): - functional.set_forwarders(session_browser, forwarders) - - -@then(parsers.parse('bind forwarders should be {forwarders}')) -def bind_assert_forwarders(session_browser, forwarders): - assert functional.get_forwarders(session_browser) == forwarders - - -@given(parsers.parse('the user {name:w} exists')) -def user_exists(session_browser, name): - if functional.user_exists(session_browser, name): - functional.delete_user(session_browser, name) - functional.create_user(session_browser, name) - - -@given(parsers.parse('the user {name:w} in group {group:S} exists')) -def user_in_group_exists(session_browser, name, group): - if functional.user_exists(session_browser, name): - functional.delete_user(session_browser, name) - functional.create_user(session_browser, name, groups=[group]) - - -@given(parsers.parse("I'm logged in as the user {name:w}")) -@when(parsers.parse("I'm logged in as the user {name:w}")) -def logged_in_user(session_browser, name): - functional.login_with_account(session_browser, functional.base_url, name) From b4e3824a4a4be16ade83a68d0de85afa7f4bb7f4 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 4 Oct 2021 22:32:56 -0700 Subject: [PATCH 30/58] d/control: Allow building with python interpreter of any arch python3-all:any means that python3 interpreter of any architecture could be used to build the package. python3-all means that same architecture as the build process would be needed. This is a stricter restriction and is unnecessary for the case of freedombox package. See discussion in: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=995498 Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index c8e755e6c..4f0deb1b1 100644 --- a/debian/control +++ b/debian/control @@ -18,7 +18,7 @@ Build-Depends: e2fsprogs, gir1.2-nm-1.0, libjs-bootstrap4, - python3-all, + python3-all:any, python3-apt, python3-augeas, python3-bootstrapform, From 4f79096d07a08b91341bebcfbe24651c214116e8 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 6 Oct 2021 13:58:18 -0400 Subject: [PATCH 31/58] conftest: Skip functional tests if splinter not importable Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- conftest.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/conftest.py b/conftest.py index d5551a936..af2d577b8 100644 --- a/conftest.py +++ b/conftest.py @@ -11,6 +11,18 @@ from unittest.mock import patch import pytest +try: + importlib.import_module('splinter') + _splinter_available = True +except ImportError: + _splinter_available = False + + +def pytest_ignore_collect(path, config): + """Ignore functional tests when splinter is not available.""" + if path.basename == 'test_functional.py': + return not _splinter_available + def pytest_addoption(parser): """Add a command line option to run functional tests.""" From 99c232520604767a9c4fba99f05cc56c8d808522 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 21 Sep 2021 19:12:32 -0700 Subject: [PATCH 32/58] user: Accommodate Django 3.1 change for model choice iteration - Before Django 3.1, iterating the .choices for a field would yield (id, label) tuples directly suitable for use with ChoiceFields. From Django 3.1, id is an instance of ModelChoiceIteratorValue which helps to easily find the model instance. In most cases, using the proxy works, but in our case, the value is being hashed. Access the actual value of the field from the object to avoid this issue. - Cleanup widget for disabling individual checkboxes in a group - When a form is submitted, 'disabled' input field is omitted by the browser irrespective of its value. So, the last admin user, automatically add the 'admin' group to form values. Tests: - On Django 2.2 and Django 3.2 access the user edit page. The form should render as before the change without errors. - Test with the current user as the last admin user. The 'admin' checkbox should be read-only. - Test with the current user not as the last admin user. The 'admin' checkbox should not be read-only. - Add/remove non-admin groups and save the current/different user. - Access the user edit page as non-admin user, the groups should be disabled. - Give/take admin permission to/from a user other than current user. - Take admin permission from current user. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/forms.py | 53 +++++++++-------------------------- plinth/modules/users/forms.py | 48 ++++++++++++++++--------------- 2 files changed, 40 insertions(+), 61 deletions(-) diff --git a/plinth/forms.py b/plinth/forms.py index 045c9231c..5bf5e739f 100644 --- a/plinth/forms.py +++ b/plinth/forms.py @@ -4,13 +4,10 @@ Common forms for use by modules. """ import os -from itertools import chain from django import forms from django.conf import settings -from django.forms import CheckboxInput from django.utils import translation -from django.utils.safestring import mark_safe from django.utils.translation import get_language_info from django.utils.translation import gettext_lazy as _ @@ -81,47 +78,25 @@ class LanguageSelectionForm(LanguageSelectionFormMixin, forms.Form): language = LanguageSelectionFormMixin.language -def _get_value_in_parens(string): - return string[string.find("(") + 1:string.find(")")] - - class CheckboxSelectMultipleWithReadOnly(forms.widgets.CheckboxSelectMultiple): - """ - Subclass of Django's CheckboxSelectMultiple widget that allows setting - individual fields as readonly + """Multiple checkbox widget that allows setting individual fields readonly. + To mark a feature as readonly an option, pass a dict instead of a string - for its label, of the form: {'label': 'option label', 'disabled': True} + for its label, of the form: {'label': 'option label', 'disabled': True}. - Derived from https://djangosnippets.org/snippets/2786/ """ - def render(self, name, value, attrs=None, choices=(), renderer=None): - if value is None: - value = [] - final_attrs = self.build_attrs(attrs) - output = [u'
    '] - global_readonly = 'readonly' in final_attrs - str_values = set([v for v in value]) - for i, (option_value, - option_label) in enumerate(chain(self.choices, choices)): - if not global_readonly and 'readonly' in final_attrs: - # If the entire group is readonly keep all options readonly - del final_attrs['readonly'] - if isinstance(option_label, dict): - if dict.get(option_label, 'readonly'): - final_attrs = dict(final_attrs, readonly='readonly') - option_label = option_label['label'] - group_name = _get_value_in_parens(option_label) - final_attrs = dict(final_attrs, - id='{}_{}'.format(attrs['id'], group_name)) - label_for = u' for="{}"'.format(final_attrs['id']) - cb = CheckboxInput(final_attrs, - check_test=lambda value: value in str_values) - rendered_cb = cb.render(name, option_value) - output.append(u'
  • %s %s
  • ' % - (label_for, rendered_cb, option_label)) - output.append(u'
') - return mark_safe(u'\n'.join(output)) + def create_option(self, name, value, label, selected, index, subindex=None, + attrs=None): + option = super().create_option(name, value, label, selected, index, + subindex, attrs) + if isinstance(option['label'], dict): + if option['label'].get('disabled'): + option['attrs']['disabled'] = 'disabled' + + option['label'] = option['label']['label'] + + return option class CheckboxSelectMultiple(forms.widgets.CheckboxSelectMultiple): diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 3c2333685..6da76ec07 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -210,19 +210,21 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, }) choices = [] + django_groups = sorted(self.fields['groups'].choices, + key=lambda choice: choice[1]) + for group_id, group_name in django_groups: + try: + group_id = group_id.value + except AttributeError: + pass - for c in sorted(self.fields['groups'].choices, key=lambda x: x[1]): - # Handle case where groups exist in database for - # applications not installed yet. - if c[1] in group_choices: - # Replace group names with descriptions - if c[1] == 'admin' and self.is_last_admin_user: - choices.append((c[0], { - 'label': group_choices[c[1]], - 'readonly': True - })) - else: - choices.append((c[0], group_choices[c[1]])) + # Show choices only from groups declared by apps. + if group_name in group_choices: + label = group_choices[group_name] + if group_name == 'admin' and self.is_last_admin_user: + label = {'label': label, 'disabled': True} + + choices.append((group_id, label)) self.fields['groups'].label = _('Permissions') self.fields['groups'].choices = choices @@ -323,18 +325,20 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, return user - def validate_last_admin_user(self, groups): - group_names = [group.name for group in groups] - if 'admin' not in group_names: - raise ValidationError( - _('Cannot delete the only administrator in the system.')) + def clean_groups(self): + """Validate groups to ensure admin group for last admin. - def clean(self): - """Override clean to add form validation logic.""" - cleaned_data = super().clean() + For the last admin user, we disable the checkbox for 'admin' group so + that it can't be unchecked. However, this means that browser will no + longer submit that value. Forcefully add 'admin' group in this case. + + """ + groups = self.cleaned_data['groups'] if self.is_last_admin_user: - self.validate_last_admin_user(cleaned_data.get("groups")) - return cleaned_data + groups = groups | self.fields['groups'].queryset.filter( + **{'name': 'admin'}) + + return groups class UserChangePasswordForm(PasswordConfirmForm, SetPasswordForm): From 17a83dee60364e502bd946897117d53819b6bf04 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 22 Sep 2021 10:36:52 -0700 Subject: [PATCH 33/58] settings: Choose password hashing complexity suitable for SBCs - Django 3.2 has a argon2 password hashing complexity unsuitable for single board computers. Choose parameters suitable for Olimex Lime2 boards. Tests: - In a browser, login to a user without these changes. Notice the hash parameters in sqlite3 auth_user table. Login with the changes. Notice that the hash has been updated with latest has parameters. - Login in Django 2.2 and Django 3.2. Login succeeds and hash parameters are updated. - As measured by the browser. Notice that change in login request time with and without these changes Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/hashers.py | 34 ++++++++++++++++++++++++++++++++++ plinth/settings.py | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 plinth/hashers.py diff --git a/plinth/hashers.py b/plinth/hashers.py new file mode 100644 index 000000000..6f1fdde6f --- /dev/null +++ b/plinth/hashers.py @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Custom password hashers suitable for home servers. +""" + +from django.contrib.auth.hashers import Argon2PasswordHasher + + +class Argon2PasswordHasherLowMemory(Argon2PasswordHasher): + """Argon2 password hasher that uses less CPU and RAM than Django's default. + + Derive from and override the default complexity parameters for Django. In + Django 2.2, the defaults are time: 2, memory: 512 and parallelism: 2. In + Django 3.2, the defaults are time: 2, memory: 102400, parallelism: 8. This + takes more than 3 seconds per verification on a Lime2 board. + + On a Pioneer Edition, Olimex Lime2 board, the selected parameters result in + about 200ms for password verification: + + $ python3 -m argon2 -p 2 -m 4096 + Running Argon2id 100 times with: + hash_len: 16 bytes + memory_cost: 4096 KiB + parallelism: 2 threads + time_cost: 2 iterations + + Measuring... + + 2.17e+02ms per password verification + + """ + time_cost = 2 # Iterations + memory_cost = 4096 # KiB + parallelism = 2 # Threads diff --git a/plinth/settings.py b/plinth/settings.py index 5845c3dd3..6213d74a7 100644 --- a/plinth/settings.py +++ b/plinth/settings.py @@ -131,7 +131,7 @@ MIDDLEWARE = ( ) PASSWORD_HASHERS = [ - 'django.contrib.auth.hashers.Argon2PasswordHasher', + 'plinth.hashers.Argon2PasswordHasherLowMemory', 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', From 04af3473b7f68910632c890d0ab167ea3844c4fe Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 22 Sep 2021 14:05:09 -0700 Subject: [PATCH 34/58] pyproject.toml: Merge contents of pytest.ini Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- pyproject.toml | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++ pytest.ini | 56 ----------------------------------------------- 2 files changed, 59 insertions(+), 56 deletions(-) delete mode 100644 pytest.ini diff --git a/pyproject.toml b/pyproject.toml index 9f8a5ed54..d337f151f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,61 @@ [tool.isort] known_first_party = ["plinth"] + +[tool.pytest.ini_options] +addopts = "--ds=plinth.tests.data.django_test_settings" +markers = [ + "functional", + "apps", + "avahi", + "backups", + "bepasty", + "bind", + "calibre", + "cockpit", + "config", + "coturn", + "datetime", + "deluge", + "dynamicdns", + "ejabberd", + "essential", + "gitweb", + "help", + "i2p", + "ikiwiki", + "infinoted", + "jsxc", + "matrixsynapse", + "mediawiki", + "minetest", + "minidlna", + "mldonkey", + "monkeysphere", + "mumble", + "openvpn", + "pagekite", + "performance", + "privoxy", + "quassel", + "radicale", + "roundcube", + "samba", + "searx", + "security", + "shadowsocks", + "sharing", + "skip", + "snapshot", + "ssh", + "sso", + "storage", + "syncthing", + "system", + "tahoe", + "tor", + "transmission", + "ttrss", + "upgrades", + "users", + "zoph", +] diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 4f3ac0700..000000000 --- a/pytest.ini +++ /dev/null @@ -1,56 +0,0 @@ -[pytest] -DJANGO_SETTINGS_MODULE = plinth.tests.data.django_test_settings -markers = functional - apps - avahi - backups - bepasty - bind - calibre - cockpit - config - coturn - datetime - deluge - dynamicdns - ejabberd - essential - gitweb - help - i2p - ikiwiki - infinoted - jsxc - matrixsynapse - mediawiki - minetest - minidlna - mldonkey - monkeysphere - mumble - openvpn - pagekite - performance - privoxy - quassel - radicale - roundcube - samba - searx - security - shadowsocks - sharing - skip - snapshot - ssh - sso - storage - syncthing - system - tahoe - tor - transmission - ttrss - upgrades - users - zoph From 3c370d02abfef334e8c7da95371322c27cc8769a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 22 Sep 2021 15:17:00 -0700 Subject: [PATCH 35/58] pyproject.toml: Merge contents of .converagerc Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- .coveragerc | 9 --------- .gitlab-ci.yml | 2 +- debian/tests/control | 2 +- pyproject.toml | 8 ++++++++ 4 files changed, 10 insertions(+), 11 deletions(-) delete mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 00a764af8..000000000 --- a/.coveragerc +++ /dev/null @@ -1,9 +0,0 @@ -# .coveragerc -- specifies execution options for coverage.py - -[run] -branch = True -omit = */tests/* - -[report] -precision = 2 -omit = */tests/* diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a22e93d80..ae7020554 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,7 +28,7 @@ unit-tests: - echo "tester:password" | chpasswd - cp -r . /home/tester/plinth - chown -R tester:tester /home/tester/plinth - - su -c "cd ~/plinth;PYTHONPATH='.' py.test-3 --cov=plinth --cov-report=html:/home/tester/plinth/htmlcov --cov-config=.coveragerc --cov-report=term" tester + - su -c "cd ~/plinth;PYTHONPATH='.' py.test-3 --cov=plinth --cov-report=html:/home/tester/plinth/htmlcov --cov-report=term" tester - cp -r /home/tester/plinth/htmlcov test-coverage-report coverage: '/^TOTAL\s+.*\s+(\d+\.\d+%)$/' artifacts: diff --git a/debian/tests/control b/debian/tests/control index e519f8de9..810fa0c93 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -13,5 +13,5 @@ Restrictions: needs-root # # Run unit and integration tests on installed files. # -Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/plinth/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-config=.coveragerc --cov-report=term +Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/plinth/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-report=term Depends: git, python3-pytest, python3-pytest-cov, python3-pytest-django, @ diff --git a/pyproject.toml b/pyproject.toml index d337f151f..01d3dfd8d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,14 @@ [tool.isort] known_first_party = ["plinth"] +[tool.coverage.run] +branch = true +omit = ["*/tests/*"] + +[tool.coverage.report] +precision = 2 +omit = ["*/tests/*"] + [tool.pytest.ini_options] addopts = "--ds=plinth.tests.data.django_test_settings" markers = [ From f2bcecdf7406711cd203169a60ebdf76ba493698 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 22 Sep 2021 16:06:10 -0700 Subject: [PATCH 36/58] d/rules: Don't use setup.py to invoke tests, invoke directly instead Invoking pytest from setup.py seems to be deprecated. It offers no real advantages other than being predictable way of invoking tests for someone who don't know that we use pytest for testing. Let's rely on our documentation instead. Further this clears up the need to have setup.cfg. Tests: - Build debian package in using pbuilder. Tests are run and succeed during the build. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- debian/rules | 5 ++++- setup.cfg | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 setup.cfg diff --git a/debian/rules b/debian/rules index 924d3b366..9d68df184 100755 --- a/debian/rules +++ b/debian/rules @@ -11,9 +11,12 @@ override_dh_auto_install-indep: ./run --develop --list-dependencies | sort | tr '\n' ', ' | \ sed -e 's/^/freedombox:Depends=/' >> debian/freedombox.substvars +# pybuild can run pytest. However, when the top level directory is included in +# the path (done using manage.py), it results in import problems. +# https://www.mail-archive.com/debian-python@lists.debian.org/msg17997.html override_dh_auto_test: PYBUILD_SYSTEM=custom \ - PYBUILD_TEST_ARGS="{interpreter} setup.py test" dh_auto_test + PYBUILD_TEST_ARGS="{interpreter} -m pytest" dh_auto_test override_dh_installsystemd: # Do not enable or start freedombox-manual-upgrade.service. diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 99ec86939..000000000 --- a/setup.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[aliases] -# When './setup.py test' is invoked, run './setup.py pytest' -test=pytest From 79e5edb0970ee98b86b610003280a04101a021d3 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Fri, 8 Oct 2021 19:46:47 +0530 Subject: [PATCH 37/58] ttrss: tests: functional: Make subscription faster - Remove an unnecessary eventually block that's always reaching timeout (30 sec). - Simplify selection of hamburger menu. The CSS classname used for selection is the same in buster and bullseye. - Create a constant for String 'ttrss' Signed-off-by: Joseph Nuthalapati Reviewed-by: Sunil Mohan Adapa --- plinth/modules/ttrss/tests/test_functional.py | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py index 57e87f1f8..b47202b6e 100644 --- a/plinth/modules/ttrss/tests/test_functional.py +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -4,8 +4,11 @@ Functional, browser based tests for ttrss app. """ import pytest + from plinth.tests import functional +APP_ID = 'ttrss' + pytestmark = [pytest.mark.apps, pytest.mark.ttrss, pytest.mark.sso] @@ -13,33 +16,33 @@ pytestmark = [pytest.mark.apps, pytest.mark.ttrss, pytest.mark.sso] def fixture_background(session_browser): """Login and install the app.""" functional.login(session_browser) - functional.install(session_browser, 'ttrss') + functional.install(session_browser, APP_ID) yield - functional.app_disable(session_browser, 'ttrss') + functional.app_disable(session_browser, APP_ID) def test_enable_disable(session_browser): """Test enabling the app.""" - functional.app_disable(session_browser, 'ttrss') + functional.app_disable(session_browser, APP_ID) - functional.app_enable(session_browser, 'ttrss') - assert functional.service_is_running(session_browser, 'ttrss') + functional.app_enable(session_browser, APP_ID) + assert functional.service_is_running(session_browser, APP_ID) - functional.app_disable(session_browser, 'ttrss') - assert functional.service_is_not_running(session_browser, 'ttrss') + functional.app_disable(session_browser, APP_ID) + assert functional.service_is_not_running(session_browser, APP_ID) @pytest.mark.backups def test_backup_restore(session_browser): """Test backup and restore of app data.""" - functional.app_enable(session_browser, 'ttrss') + functional.app_enable(session_browser, APP_ID) _subscribe(session_browser) - functional.backup_create(session_browser, 'ttrss', 'test_ttrss') + functional.backup_create(session_browser, APP_ID, 'test_ttrss') _unsubscribe(session_browser) - functional.backup_restore(session_browser, 'ttrss', 'test_ttrss') + functional.backup_restore(session_browser, APP_ID, 'test_ttrss') - assert functional.service_is_running(session_browser, 'ttrss') + assert functional.service_is_running(session_browser, APP_ID) assert _is_subscribed(session_browser) @@ -56,12 +59,7 @@ def _is_feed_shown(browser, invert=False): def _click_main_menu_item(browser, text): """Select an item from the main actions menu.""" - burger_menu = browser.find_by_xpath('//*[contains(@title, "Actions...")]') - if burger_menu: - burger_menu.click() - else: - browser.find_by_text('Actions...').click() - + browser.find_by_css('.action-chooser').click() browser.find_by_text(text).click() @@ -85,12 +83,6 @@ def _subscribe(browser): browser.find_by_text('Cancel').click() functional.eventually(lambda: not add_dialog.visible) - expand = browser.find_by_css('span.dijitTreeExpandoClosed') - if expand: - functional.eventually(expand.first.click) - - assert functional.eventually(_is_feed_shown, [browser]) - def _unsubscribe(browser): """Unsubscribe from a feed in TT-RSS.""" @@ -114,4 +106,4 @@ def _unsubscribe(browser): def _is_subscribed(browser): """Return whether subscribed to a feed in TT-RSS.""" _ttrss_load_main_interface(browser) - return browser.is_text_present('Planet Debian') + return _is_feed_shown(browser) From 45b5769ce6232154d3c19569c56557441a7d40ad Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 23 Sep 2021 18:29:20 -0700 Subject: [PATCH 38/58] users: Help set language cookie when user profile is edited This patch only ensures that response object is send along with set_language() call. In later changes, response object can be used by set_language() to set the language cookie. Tests: - Relevant functional tests pass. - Edit current user's language. The language is immediately set. - Edit another user's language. The language of the current session is not changed. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/users/forms.py | 5 ----- plinth/modules/users/views.py | 14 +++++++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/plinth/modules/users/forms.py b/plinth/modules/users/forms.py index 6da76ec07..aa310ab44 100644 --- a/plinth/modules/users/forms.py +++ b/plinth/modules/users/forms.py @@ -19,7 +19,6 @@ from plinth import actions from plinth.errors import ActionError from plinth.modules import first_boot from plinth.modules.security import set_restricted_access -from plinth.translation import set_language from plinth.utils import is_user_admin from . import get_last_admin_user @@ -244,10 +243,6 @@ class UserUpdateForm(ValidNewUsernameCheckMixin, PasswordConfirmForm, auth_username = self.request.user.username confirm_password = self.cleaned_data['confirm_password'] - # If user is updating their own profile then only translate the pages - if self.username == auth_username: - set_language(self.request, None, user.userprofile.language) - if commit: user.save() self.save_m2m() diff --git a/plinth/modules/users/views.py b/plinth/modules/users/views.py index c7cb8bfc0..c0ea7986e 100644 --- a/plinth/modules/users/views.py +++ b/plinth/modules/users/views.py @@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy from django.views.generic.edit import (CreateView, DeleteView, FormView, UpdateView) -from plinth import actions +from plinth import actions, translation from plinth.errors import ActionError from plinth.modules import first_boot from plinth.utils import is_user_admin @@ -108,6 +108,18 @@ class UserUpdate(ContextMixin, SuccessMessageMixin, UpdateView): """Return the URL to redirect to in case of successful updation.""" return reverse('users:edit', kwargs={'slug': self.object.username}) + def form_valid(self, form): + """Set the user language if necessary.""" + response = super().form_valid(form) + + # If user is updating their own profile then set the language for + # current session too. + if self.object.username == self.request.user.username: + translation.set_language(self.request, response, + self.request.user.userprofile.language) + + return response + class UserDelete(ContextMixin, DeleteView): """Handle deleting users, showing a confirmation dialog first. From 57931353d31fb6c007c0a75974585b5a6911529e Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 23 Sep 2021 18:38:22 -0700 Subject: [PATCH 39/58] sso, translation: Help set language cookie when user logins in This patch only ensures that response object is send along with set_language() call. In later changes, response object can be used by set_language() to set the language cookie. Tests: - Relevant functional tests pass. - Login, user's language is set when the language is set to non-browser sent language. - Logout, user's language is retained when set to non-browser sent language. - Login, user's language is set when the language is set to browser sent language. - Logout, user's language is retained when set to browser sent language. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/sso/views.py | 4 +++- plinth/translation.py | 7 ------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/plinth/modules/sso/views.py b/plinth/modules/sso/views.py index a9033c6a0..d84984a96 100644 --- a/plinth/modules/sso/views.py +++ b/plinth/modules/sso/views.py @@ -13,7 +13,7 @@ from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.auth.views import LoginView, LogoutView from django.http import HttpResponseRedirect -from plinth import actions, utils, web_framework +from plinth import actions, translation, utils, web_framework from .forms import AuthenticationForm, CaptchaAuthenticationForm @@ -51,6 +51,8 @@ class SSOLoginView(LoginView): def dispatch(self, request, *args, **kwargs): response = super(SSOLoginView, self).dispatch(request, *args, **kwargs) if request.user.is_authenticated: + translation.set_language(request, response, + request.user.userprofile.language) return set_ticket_cookie(request.user, response) return response diff --git a/plinth/translation.py b/plinth/translation.py index 3289f981c..74a881bbd 100644 --- a/plinth/translation.py +++ b/plinth/translation.py @@ -4,8 +4,6 @@ Utility methods for managing translations. """ from django.conf import settings -from django.contrib.auth.signals import user_logged_in -from django.dispatch import receiver from django.utils import translation @@ -58,8 +56,3 @@ def set_language(request, response, language_code): domain=settings.LANGUAGE_COOKIE_DOMAIN, ) - -@receiver(user_logged_in) -def _on_user_logged_in(sender, request, user, **kwargs): - """When the user logs in, set the current language.""" - set_language(request, None, user.userprofile.language) From 379e0af9c991ad113a0d6d197276eaf698869406 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 23 Sep 2021 18:39:35 -0700 Subject: [PATCH 40/58] translation: Always set language cookie when switching language MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Django 3.0 will now always set the language cookie. It will stop setting the session language in Django 4.0. To avoid breaking current behavior, always set the language cookie when switching language. "To limit creation of sessions and hence favor some caching strategies, django.views.i18n.set_language() will stop setting the user’s language in the session in Django 4.0. Since Django 2.1, the language is always stored in the LANGUAGE_COOKIE_NAME cookie." Tests: - All relevant functional tests run. - Repeat login and user page editing tests. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/translation.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plinth/translation.py b/plinth/translation.py index 74a881bbd..af941af44 100644 --- a/plinth/translation.py +++ b/plinth/translation.py @@ -25,8 +25,9 @@ def get_language_from_request(request): def set_language(request, response, language_code): """Set the language in session or as a separate cookie. - Sending language code as None removes the preference. If response is None, - cookies are not touched and setting/deleting language cookie will not work. + Sending language code as None removes the preference. response is not + optional as Django 3.0 up always set the language cookie and Django 4.0 + will no longer set the language in the session. """ if not language_code: @@ -47,12 +48,11 @@ def set_language(request, response, language_code): translation.activate(language_code) if hasattr(request, 'session'): request.session[translation.LANGUAGE_SESSION_KEY] = language_code - else: - response.set_cookie( - settings.LANGUAGE_COOKIE_NAME, - language_code, - max_age=settings.LANGUAGE_COOKIE_AGE, - path=settings.LANGUAGE_COOKIE_PATH, - domain=settings.LANGUAGE_COOKIE_DOMAIN, - ) + response.set_cookie( + settings.LANGUAGE_COOKIE_NAME, + language_code, + max_age=settings.LANGUAGE_COOKIE_AGE, + path=settings.LANGUAGE_COOKIE_PATH, + domain=settings.LANGUAGE_COOKIE_DOMAIN, + ) From 071d61bcc8dc0e3d49648bd87a0e00685ad66603 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Thu, 23 Sep 2021 23:50:14 -0700 Subject: [PATCH 41/58] *: Move all systemd service files from /lib to /usr This is now the preferred location in Debian. See: https://lintian.debian.org/tags/systemd-service-in-odd-location https://bugs.debian.org/992465 https://bugs.debian.org/987989 https://salsa.debian.org/debian/debhelper/-/commit/d70caa69c64b124e3611c967cfab93aef48346d8 https://lists.debian.org/debian-devel/2021/08/msg00275.html Tests: - Lintian no longer shows errors: E: freedombox: systemd-service-in-odd-location lib/.../calibre-server-freedombox.service - Comparing the old .deb and newly generated .deb with these changes. All the systemd files show that they are moved from /lib to /usr/lib/systemd. - After upgrading the deb from older version to a version these changes, services installed by the package are available (tested after restart with wordpress and claibre). Services tweaked by the package have the changed configuration reflected as shown by systemctl show {service-name}.service (tested after restart with quassel). Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- data/{ => usr}/lib/systemd/system/plinth.service | 0 debian/freedombox.install | 1 - .../{ => usr}/lib/systemd/system/bind9.service.d/freedombox.conf | 0 .../lib/systemd/system/calibre-server-freedombox.service | 0 .../lib/systemd/system/zramswap.service.d/freedombox.conf | 0 .../lib/systemd/system/coturn.service.d/freedombox.conf | 0 .../lib/systemd/system/deluged.service.d/freedombox.conf | 0 .../lib/systemd/system/matrix-synapse.service.d/freedombox.conf | 0 .../lib/systemd/system/mldonkey-server.service.d/freedombox.conf | 0 .../lib/systemd/system/quasselcore.service.d/freedombox.conf | 0 .../system/shadowsocks-libev-local@.service.d/freedombox.conf | 0 .../systemd/system/syncthing@syncthing.service.d/freedombox.conf | 0 .../systemd/system/transmission-daemon.service.d/freedombox.conf | 0 .../lib/systemd/system/freedombox-manual-upgrade.service | 0 .../{ => usr}/lib/systemd/system/wordpress-freedombox.service | 0 .../data/{ => usr}/lib/systemd/system/wordpress-freedombox.timer | 0 16 files changed, 1 deletion(-) rename data/{ => usr}/lib/systemd/system/plinth.service (100%) rename plinth/modules/bind/data/{ => usr}/lib/systemd/system/bind9.service.d/freedombox.conf (100%) rename plinth/modules/calibre/data/{ => usr}/lib/systemd/system/calibre-server-freedombox.service (100%) rename plinth/modules/config/data/{ => usr}/lib/systemd/system/zramswap.service.d/freedombox.conf (100%) rename plinth/modules/coturn/data/{ => usr}/lib/systemd/system/coturn.service.d/freedombox.conf (100%) rename plinth/modules/deluge/data/{ => usr}/lib/systemd/system/deluged.service.d/freedombox.conf (100%) rename plinth/modules/matrixsynapse/data/{ => usr}/lib/systemd/system/matrix-synapse.service.d/freedombox.conf (100%) rename plinth/modules/mldonkey/data/{ => usr}/lib/systemd/system/mldonkey-server.service.d/freedombox.conf (100%) rename plinth/modules/quassel/data/{ => usr}/lib/systemd/system/quasselcore.service.d/freedombox.conf (100%) rename plinth/modules/shadowsocks/data/{ => usr}/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf (100%) rename plinth/modules/syncthing/data/{ => usr}/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf (100%) rename plinth/modules/transmission/data/{ => usr}/lib/systemd/system/transmission-daemon.service.d/freedombox.conf (100%) rename plinth/modules/upgrades/data/{ => usr}/lib/systemd/system/freedombox-manual-upgrade.service (100%) rename plinth/modules/wordpress/data/{ => usr}/lib/systemd/system/wordpress-freedombox.service (100%) rename plinth/modules/wordpress/data/{ => usr}/lib/systemd/system/wordpress-freedombox.timer (100%) diff --git a/data/lib/systemd/system/plinth.service b/data/usr/lib/systemd/system/plinth.service similarity index 100% rename from data/lib/systemd/system/plinth.service rename to data/usr/lib/systemd/system/plinth.service diff --git a/debian/freedombox.install b/debian/freedombox.install index d853deb19..feda023b2 100644 --- a/debian/freedombox.install +++ b/debian/freedombox.install @@ -1,5 +1,4 @@ etc -lib usr/bin usr/lib usr/share/augeas diff --git a/plinth/modules/bind/data/lib/systemd/system/bind9.service.d/freedombox.conf b/plinth/modules/bind/data/usr/lib/systemd/system/bind9.service.d/freedombox.conf similarity index 100% rename from plinth/modules/bind/data/lib/systemd/system/bind9.service.d/freedombox.conf rename to plinth/modules/bind/data/usr/lib/systemd/system/bind9.service.d/freedombox.conf diff --git a/plinth/modules/calibre/data/lib/systemd/system/calibre-server-freedombox.service b/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service similarity index 100% rename from plinth/modules/calibre/data/lib/systemd/system/calibre-server-freedombox.service rename to plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service diff --git a/plinth/modules/config/data/lib/systemd/system/zramswap.service.d/freedombox.conf b/plinth/modules/config/data/usr/lib/systemd/system/zramswap.service.d/freedombox.conf similarity index 100% rename from plinth/modules/config/data/lib/systemd/system/zramswap.service.d/freedombox.conf rename to plinth/modules/config/data/usr/lib/systemd/system/zramswap.service.d/freedombox.conf diff --git a/plinth/modules/coturn/data/lib/systemd/system/coturn.service.d/freedombox.conf b/plinth/modules/coturn/data/usr/lib/systemd/system/coturn.service.d/freedombox.conf similarity index 100% rename from plinth/modules/coturn/data/lib/systemd/system/coturn.service.d/freedombox.conf rename to plinth/modules/coturn/data/usr/lib/systemd/system/coturn.service.d/freedombox.conf diff --git a/plinth/modules/deluge/data/lib/systemd/system/deluged.service.d/freedombox.conf b/plinth/modules/deluge/data/usr/lib/systemd/system/deluged.service.d/freedombox.conf similarity index 100% rename from plinth/modules/deluge/data/lib/systemd/system/deluged.service.d/freedombox.conf rename to plinth/modules/deluge/data/usr/lib/systemd/system/deluged.service.d/freedombox.conf diff --git a/plinth/modules/matrixsynapse/data/lib/systemd/system/matrix-synapse.service.d/freedombox.conf b/plinth/modules/matrixsynapse/data/usr/lib/systemd/system/matrix-synapse.service.d/freedombox.conf similarity index 100% rename from plinth/modules/matrixsynapse/data/lib/systemd/system/matrix-synapse.service.d/freedombox.conf rename to plinth/modules/matrixsynapse/data/usr/lib/systemd/system/matrix-synapse.service.d/freedombox.conf diff --git a/plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf b/plinth/modules/mldonkey/data/usr/lib/systemd/system/mldonkey-server.service.d/freedombox.conf similarity index 100% rename from plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf rename to plinth/modules/mldonkey/data/usr/lib/systemd/system/mldonkey-server.service.d/freedombox.conf diff --git a/plinth/modules/quassel/data/lib/systemd/system/quasselcore.service.d/freedombox.conf b/plinth/modules/quassel/data/usr/lib/systemd/system/quasselcore.service.d/freedombox.conf similarity index 100% rename from plinth/modules/quassel/data/lib/systemd/system/quasselcore.service.d/freedombox.conf rename to plinth/modules/quassel/data/usr/lib/systemd/system/quasselcore.service.d/freedombox.conf diff --git a/plinth/modules/shadowsocks/data/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf b/plinth/modules/shadowsocks/data/usr/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf similarity index 100% rename from plinth/modules/shadowsocks/data/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf rename to plinth/modules/shadowsocks/data/usr/lib/systemd/system/shadowsocks-libev-local@.service.d/freedombox.conf diff --git a/plinth/modules/syncthing/data/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf b/plinth/modules/syncthing/data/usr/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf similarity index 100% rename from plinth/modules/syncthing/data/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf rename to plinth/modules/syncthing/data/usr/lib/systemd/system/syncthing@syncthing.service.d/freedombox.conf diff --git a/plinth/modules/transmission/data/lib/systemd/system/transmission-daemon.service.d/freedombox.conf b/plinth/modules/transmission/data/usr/lib/systemd/system/transmission-daemon.service.d/freedombox.conf similarity index 100% rename from plinth/modules/transmission/data/lib/systemd/system/transmission-daemon.service.d/freedombox.conf rename to plinth/modules/transmission/data/usr/lib/systemd/system/transmission-daemon.service.d/freedombox.conf diff --git a/plinth/modules/upgrades/data/lib/systemd/system/freedombox-manual-upgrade.service b/plinth/modules/upgrades/data/usr/lib/systemd/system/freedombox-manual-upgrade.service similarity index 100% rename from plinth/modules/upgrades/data/lib/systemd/system/freedombox-manual-upgrade.service rename to plinth/modules/upgrades/data/usr/lib/systemd/system/freedombox-manual-upgrade.service diff --git a/plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.service b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service similarity index 100% rename from plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.service rename to plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service diff --git a/plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.timer b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.timer similarity index 100% rename from plinth/modules/wordpress/data/lib/systemd/system/wordpress-freedombox.timer rename to plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.timer From cf054b08881f74b314ef723d3a5a0b696a0c3246 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 24 Sep 2021 07:51:02 -0700 Subject: [PATCH 42/58] wordpress: Run service only if when installed and configured - This avoids attempting to run the service soon after FreedomBox is installed. Tests: - When old freedombox.deb is installed, the service is enabled. When upgraded to newer .deb with the changes, the service is still enabled but no start attempt is made by systemd. - After installation of WordPress, the service is running as expected. - On a fresh installation, WordPress service is working as expected. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- .../data/usr/lib/systemd/system/wordpress-freedombox.service | 1 + 1 file changed, 1 insertion(+) diff --git a/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service index c25e0ac2a..b7bcdaf72 100644 --- a/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service +++ b/plinth/modules/wordpress/data/usr/lib/systemd/system/wordpress-freedombox.service @@ -3,6 +3,7 @@ [Unit] Description=WordPress Scheduled Events Trigger (Cron) Documentation=https://rtcamp.com/tutorials/wordpress/wp-cron-crontab/ +ConditionPathExists=/etc/wordpress/config-default.php [Service] CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE From 1c47877f6be07539d5bbf8e4718acf8c7eabe82f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 24 Sep 2021 07:55:52 -0700 Subject: [PATCH 43/58] calibre: Run service only if when installed - This avoids attempting to run the service soon after FreedomBox is installed. Tests: - When old freedombox.deb is installed, the service is enabled. When upgraded to newer .deb with the changes, the service is still enabled but no start attempt is made by systemd. - After installation of calibre, the service is running as expected. - On a fresh installation, calibre service is working as expected. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- .../usr/lib/systemd/system/calibre-server-freedombox.service | 1 + 1 file changed, 1 insertion(+) diff --git a/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service b/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service index 0ac7a7026..df6acfacd 100644 --- a/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service +++ b/plinth/modules/calibre/data/usr/lib/systemd/system/calibre-server-freedombox.service @@ -4,6 +4,7 @@ Description=calibre Content Server Documentation=man:calibre-server(1) After=network.target +ConditionPathExists=/usr/bin/calibre-server [Service] CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE From 2b525a1930df6a0d14bb659d5197265c5075722d Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 24 Sep 2021 18:51:21 -0700 Subject: [PATCH 44/58] d/rules: Don't install and enable other systemd service files Close: #1982. This eliminates the issue with calibre and wordpress services getting run even before the app is installed. These services are enabled when the app is installed. On disadvantage is that services are no longer restarted when a newer service file is installed. Users for whom caibre and wordpress have already been enabled. Nothing changes on upgrade and service will still be enabled. However, the services won't be attempted to be started without the app's being installed. This is good enough without having to write custom logic to disable these services. Tests: - Install freedombox package on a fresh setup. wordpress and calibre service files are not enabled. - When wordpress and calibre apps are installed, these services are enabled and run as expected. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- debian/rules | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/debian/rules b/debian/rules index 9d68df184..a99ef4c7f 100755 --- a/debian/rules +++ b/debian/rules @@ -19,5 +19,9 @@ override_dh_auto_test: PYBUILD_TEST_ARGS="{interpreter} -m pytest" dh_auto_test override_dh_installsystemd: - # Do not enable or start freedombox-manual-upgrade.service. - dh_installsystemd --exclude=freedombox-manual-upgrade.service + # Do not enable or start any service other than FreedomBox service. Use + # of --tmpdir is a hack to workaround an issue with dh_installsystemd + # (as of debhelper 13.5.2) that still has hardcoded search path of + # /lib/systemd/system for searching systemd services. See #987989 and + # reversion of its changes. + dh_installsystemd --tmpdir=debian/tmp/usr --package=freedombox plinth.service From 4b708214e4c8b929bf83b6c3b9f443fb8e389f90 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 5 Oct 2021 20:10:43 -0700 Subject: [PATCH 45/58] storage: tests: functional: Fix tests always getting skipped - The method to check if we are running inside a container is not being called. Call it. - Also fix the assumption that tests and freedombox service run on the same machine. Be conservative and assume running in container if we can't determine the accurate state. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Fioddor Superconcentrado --- plinth/modules/storage/tests/test_functional.py | 3 ++- plinth/tests/functional/__init__.py | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/plinth/modules/storage/tests/test_functional.py b/plinth/modules/storage/tests/test_functional.py index cdfc085c1..d0dd20bfb 100644 --- a/plinth/modules/storage/tests/test_functional.py +++ b/plinth/modules/storage/tests/test_functional.py @@ -3,6 +3,7 @@ Functional, browser based tests for storage app. """ import pytest + from plinth.tests import functional pytestmark = [pytest.mark.system, pytest.mark.essential, pytest.mark.storage] @@ -16,7 +17,7 @@ def fixture_background(session_browser): def test_list_disks(session_browser): """Test that root disk is shown on storage page.""" - if functional.running_inside_container: + if functional.running_inside_container(): pytest.skip('Storage doesn\'t work inside a container') else: functional.nav_to_module(session_browser, 'storage') diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index d8927acae..e162f4021 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -439,9 +439,17 @@ def service_is_not_running(browser, app_name): def running_inside_container(): """Check if freedombox is running inside a container""" + # If the URL to connect to was overridden then assume that we are running + # tests on a different machine than the machine running freedombox. Assume + # running inside container to be conservative about tests. + if config['DEFAULT']['url'] != 'https://localhost': + return True + + # If URL is not overridden then testing code and freedombox are running on + # the same machine. Proceed with a proper test. result = subprocess.run(['systemd-detect-virt', '--container'], - stdout=subprocess.PIPE) - return bool(result.stdout.decode('utf-8').lower() != "none\n") + stdout=subprocess.PIPE, check=False) + return result.stdout.decode('utf-8').strip().lower() != 'none' ############################## From cb539cf1e80555dc479375818e2a4e3cf70bd3cc Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Sun, 12 Sep 2021 19:49:51 +0200 Subject: [PATCH 46/58] tests: Improve handling of tests skipped by default - Create the 'heavy' mark for tests that take long to run. - Skip the tests marked as 'heavy' by default. - Enable functional and heavy tests by setting the environment variable EXTENDED_TESTING=1. - Update HACKING.md accordingly. Signed-off-by: Fioddor Superconcentrado [sunil: Minor indentation] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- HACKING.md | 25 ++++++++++++++++++++++++- conftest.py | 33 ++++++++++++++++++++++----------- pyproject.toml | 5 +++-- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/HACKING.md b/HACKING.md index df5ecdf1b..07ba1adb7 100644 --- a/HACKING.md +++ b/HACKING.md @@ -338,7 +338,7 @@ For more information on translations: https://wiki.debian.org/FreedomBox/Transla ### Running Tests -To run all the tests in the container/VM: +To run all the standard unit tests in the container/VM: ```bash guest$ py.test-3 @@ -369,6 +369,29 @@ guest$ py.test-3 plinth/tests/test_actions.py::TestActions guest$ py.test-3 plinth/tests/test_actions.py::TestActions::test_is_package_manager_busy ``` +Some tests are skipped by default: +* tests that need root privileges, +* functional tests (they need additional preparation to run. See next section), +* tests that take much time to run. + +Use `sudo` to run the ones that need root access: +```bash +guest$ sudo py.test-3 +``` + +To force functional tests and tests that take long to run, set the environment +variable EXTENDED_TESTING=1: + +```bash +guest$ EXTENDED_TESTING=1 py.test-3 +``` + +To really run all tests, combine sudo with EXTENDED_TESTING: + +```bash +guest$ sudo EXTENDED_TESTING=1 py.test-3 +``` + ### Running the Test Coverage Analysis To run the coverage tool in the container/VM: diff --git a/conftest.py b/conftest.py index af2d577b8..10aca349c 100644 --- a/conftest.py +++ b/conftest.py @@ -31,18 +31,29 @@ def pytest_addoption(parser): def pytest_collection_modifyitems(config, items): - """Filter out functional tests unless --include-functional is passed.""" - if config.getoption('--include-functional'): - # Option provided on command line, no filtering - return + """Filter out specificly marked tests unless explicitly requested. - skip_functional = pytest.mark.skip( - reason='--include-functional not provided') - for item in items: - if 'functional' in item.keywords or (item.parent.fspath.basename - and item.parent.fspath.basename - == 'test_functional.py'): - item.add_marker(skip_functional) + The EXTENDED_TESTING environment variable is borrowed from the Lancaster + consensus met by the Pearl community. See + https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md + """ + + def skip(item, reason): + item.add_marker(pytest.mark.skip(reason=reason)) + + extended = 'EXTENDED_TESTING' in os.environ + if not (extended or config.getoption('--include-functional')): + for item in items: + if 'functional' in item.keywords or ( + item.parent.fspath.basename + and item.parent.fspath.basename == 'test_functional.py'): + skip(item, '--include-functional not provided') + + if not extended: + for item in items: + if 'heavy' in item.keywords: + skip(item, ('Takes too much time. ' + 'Set EXTENDED_TESTING=1 to force run')) @pytest.fixture(name='load_cfg') diff --git a/pyproject.toml b/pyproject.toml index 01d3dfd8d..2c77234ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,10 @@ omit = ["*/tests/*"] [tool.pytest.ini_options] addopts = "--ds=plinth.tests.data.django_test_settings" markers = [ + "essential", "functional", + "skip", + "heavy", "apps", "avahi", "backups", @@ -26,7 +29,6 @@ markers = [ "deluge", "dynamicdns", "ejabberd", - "essential", "gitweb", "help", "i2p", @@ -52,7 +54,6 @@ markers = [ "security", "shadowsocks", "sharing", - "skip", "snapshot", "ssh", "sso", From 24f7ffe3cfe1698c26b8da89bf4baae4022ff05c Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Tue, 31 Aug 2021 00:04:09 +0200 Subject: [PATCH 47/58] package: Add functions for removing packages Functions needed to spot and remove installed conflicting packages before installation of apps. - Remove all packages in a single operation as this way apt can search for solutions to conflicts more easily. - Use type hints rather than a lot of type checking. Type hints shall later be enforced using offline checking (with mypy) or at runtime (with enforce, etc.). Signed-off-by: Fioddor Superconcentrado [sunil: Run single remove operation on all packages] [sunil: Use type hints instead of extensive type checking] [sunil: Trim down the test case as it would only succeed after install] Reviewed-by: Sunil Mohan Adapa package --- actions/packages | 13 ++++++++++++- plinth/package.py | 30 ++++++++++++++++++++++++++++++ plinth/tests/test_package.py | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 plinth/tests/test_package.py diff --git a/actions/packages b/actions/packages index 53d2afa7d..1a907d86c 100755 --- a/actions/packages +++ b/actions/packages @@ -48,6 +48,11 @@ def parse_arguments(): 'module', help='name of module for which package is being installed') subparser.add_argument('packages', nargs='+', help='list of packages to install') + + subparser = subparsers.add_parser('remove', help='remove the package(s)') + subparser.add_argument('--packages', required=True, + help='List of packages to remove', nargs='+') + subparsers.add_parser('is-package-manager-busy', help='Return whether package manager is busy') subparser = subparsers.add_parser( @@ -100,6 +105,11 @@ def subcommand_install(arguments): sys.exit(returncode) +def subcommand_remove(arguments): + """Remove apt package(s).""" + sys.exit(run_apt_command(['remove'] + arguments.packages)) + + def _assert_managed_packages(module, packages): """Check that list of packages are in fact managed by module.""" cfg.read() @@ -116,7 +126,8 @@ def _assert_managed_packages(module, packages): def subcommand_is_package_manager_busy(_): """Check whether package manager is busy. - An exit code of zero indicates that package manager is busy.""" + An exit code of zero indicates that package manager is busy. + """ if not is_package_manager_busy(): sys.exit(-1) diff --git a/plinth/package.py b/plinth/package.py index c6221a0c9..58314d630 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -7,11 +7,14 @@ import json import logging import subprocess import threading +from typing import Union +import apt.cache from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy from plinth import actions +from plinth.errors import ActionError, PlinthError from plinth.utils import format_lazy logger = logging.getLogger(__name__) @@ -195,3 +198,30 @@ def filter_conffile_prompt_packages(packages): 'packages', ['filter-conffile-packages', '--packages'] + list(packages)) return json.loads(response) + + +def packages_installed(candidates: Union[list, tuple]) -> list: + """Check which candidates are installed on the system. + + :param candidates: A list of package names. + :return: A list of installed Debian package names. + """ + cache = apt.cache.Cache() + installed_packages = [] + for package_name in candidates: + try: + package = cache[package_name] + if package.is_installed: + installed_packages.append(package_name) + except KeyError: + pass + + return installed_packages + + +def remove(packages: Union[list, tuple]) -> None: + """Remove packages.""" + try: + actions.superuser_run('packages', ['remove', '--packages'] + packages) + except ActionError: + pass diff --git a/plinth/tests/test_package.py b/plinth/tests/test_package.py new file mode 100644 index 000000000..3339172ca --- /dev/null +++ b/plinth/tests/test_package.py @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Test module for package module. +""" + +from unittest.mock import call, patch + +from plinth.errors import ActionError +from plinth.package import packages_installed, remove + + +def test_packages_installed(): + """Test packages_installed().""" + # list as input + assert len(packages_installed([])) == 0 + assert len(packages_installed(['unknown-package'])) == 0 + assert len(packages_installed(['python3'])) == 1 + # tuples as input + assert len(packages_installed(())) == 0 + assert len(packages_installed(('unknown-package', ))) == 0 + assert len(packages_installed(('python3', ))) == 1 + + +@patch('plinth.actions.superuser_run') +def test_remove(run): + """Test removing packages.""" + remove(['package1', 'package2']) + run.assert_has_calls( + [call('packages', ['remove', '--packages', 'package1', 'package2'])]) + + run.reset_mock() + run.side_effect = ActionError() + remove(['package1']) + run.assert_has_calls( + [call('packages', ['remove', '--packages', 'package1'])]) From 4b2162f3fdf648735fa74cd60308ec91fd16c2c9 Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Tue, 31 Aug 2021 00:10:48 +0200 Subject: [PATCH 48/58] setup: Show and remove conflicts before installation Warn of installed conflicting packages before installing apps. [sunil: Rename 'advice' to 'action'] [sunil: Action will be string constant, for better API and i18n] [sunil: Don't show conflict warning if action is 'ignore'] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/setup.py | 16 ++++++++++++++++ plinth/templates/setup.html | 11 +++++++++++ plinth/views.py | 8 +++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/plinth/setup.py b/plinth/setup.py index d1f651a0e..8189f6199 100644 --- a/plinth/setup.py +++ b/plinth/setup.py @@ -13,6 +13,7 @@ from collections import defaultdict import apt import plinth +from plinth.package import packages_installed from plinth.signals import post_setup from . import package @@ -178,6 +179,15 @@ class Helper(object): if pkg_name not in cache) return any(unavailable_pkgs) + def get_package_conflicts(self): + """Report list of conflicting packages for the user.""" + package_conflicts, package_conflicts_action = \ + _get_module_package_conflicts(self.module) + if package_conflicts: + package_conflicts = packages_installed(package_conflicts) + + return package_conflicts, package_conflicts_action + def init(module_name, module): """Create a setup helper for a module for later use.""" @@ -298,6 +308,12 @@ def _is_module_essential(module): return getattr(module, 'is_essential', False) +def _get_module_package_conflicts(module): + """Return list of packages that conflict with packages of a module.""" + return (getattr(module, 'package_conflicts', + None), getattr(module, 'package_conflicts_action', None)) + + def _get_module_managed_packages(module): """Return list of packages managed by a module.""" return getattr(module, 'managed_packages', []) diff --git a/plinth/templates/setup.html b/plinth/templates/setup.html index 2846a0145..3d9d78bbf 100644 --- a/plinth/templates/setup.html +++ b/plinth/templates/setup.html @@ -50,6 +50,17 @@ {% trans "Check again" %} + {% elif package_conflicts and package_conflicts_action != 'ignore' %} + {% endif %} Date: Fri, 8 Oct 2021 10:09:11 -0700 Subject: [PATCH 49/58] email: Manage known installation conflicts Signed-off-by: Fioddor Superconcentrado [sunil: Don't show warning on conflict] [sunil: Add statement to description about conflicts] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/email_server/__init__.py | 78 ++++++++++++++++--------- plinth/modules/email_server/views.py | 1 + 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/plinth/modules/email_server/__init__.py b/plinth/modules/email_server/__init__.py index da59314d2..9f69cea9b 100644 --- a/plinth/modules/email_server/__init__.py +++ b/plinth/modules/email_server/__init__.py @@ -15,14 +15,26 @@ from plinth.modules.apache.components import Webserver from plinth.modules.config import get_domainname from plinth.modules.firewall.components import Firewall from plinth.modules.letsencrypt.components import LetsEncrypt +from plinth.package import packages_installed, remove from . import audit, manifest version = 1 +# Other likely install conflicts have been discarded: +# - msmtp, nullmailer, sendmail don't cause install faults. +# - qmail and smail are missing in Bullseye (Not tested, +# but less likely due to that). +package_conflicts = ('exim4-base', 'exim4-config', 'exim4-daemon-light') +package_conflicts_action = 'ignore' + packages = [ - 'postfix-ldap', 'dovecot-pop3d', 'dovecot-imapd', - 'dovecot-ldap', 'dovecot-lmtpd', 'dovecot-managesieved', + 'postfix-ldap', + 'dovecot-pop3d', + 'dovecot-imapd', + 'dovecot-ldap', + 'dovecot-lmtpd', + 'dovecot-managesieved', ] packages_bloat = ['rspamd'] @@ -38,6 +50,12 @@ port_info = { managed_services = ['postfix', 'dovecot', 'rspamd'] managed_packages = packages + packages_bloat + +_description = [ + _('During installation, any other email servers in the system will be ' + 'uninstalled.') +] + app = None logger = logging.getLogger(__name__) @@ -55,18 +73,19 @@ class EmailServerApp(plinth.app.App): self._add_firewall_ports() # /rspamd location - webserver = Webserver('webserver-email', # unique id - 'email-server-freedombox', # config file name - urls=['https://{host}/rspamd']) + webserver = Webserver( + 'webserver-email', # unique id + 'email-server-freedombox', # config file name + urls=['https://{host}/rspamd']) self.add(webserver) # Let's Encrypt event hook default_domain = get_domainname() domains = [default_domain] if default_domain else [] - letsencrypt = LetsEncrypt( - 'letsencrypt-email-server', domains=domains, - daemons=['postfix', 'dovecot'], should_copy_certificates=False, - managing_app='email_server') + letsencrypt = LetsEncrypt('letsencrypt-email-server', domains=domains, + daemons=['postfix', 'dovecot'], + should_copy_certificates=False, + managing_app='email_server') self.add(letsencrypt) if not domains: @@ -74,14 +93,11 @@ class EmailServerApp(plinth.app.App): def _add_ui_components(self): info = plinth.app.Info( - app_id=self.app_id, - version=version, - name=self.app_name, + app_id=self.app_id, version=version, name=self.app_name, short_description=_('Powered by Postfix, Dovecot & Rspamd'), - manual_page='EmailServer', + description=_description, manual_page='EmailServer', clients=manifest.clients, - donation_url='https://freedomboxfoundation.org/donate/' - ) + donation_url='https://freedomboxfoundation.org/donate/') self.add(info) menu_item = plinth.menu.Menu( @@ -90,19 +106,14 @@ class EmailServerApp(plinth.app.App): info.short_description, # app description 'roundcube', # icon name in `static/theme/icons/` 'email_server:index', # view name - parent_url_name='apps' - ) + parent_url_name='apps') self.add(menu_item) shortcut = plinth.frontpage.Shortcut( - 'shortcut_' + self.app_id, - name=info.name, - short_description=info.short_description, - icon='roundcube', - url=reverse_lazy('email_server:my_mail'), - clients=manifest.clients, - login_required=True - ) + 'shortcut_' + self.app_id, name=info.name, + short_description=info.short_description, icon='roundcube', + url=reverse_lazy('email_server:my_mail'), clients=manifest.clients, + login_required=True) self.add(shortcut) def _add_daemons(self): @@ -142,14 +153,29 @@ class EmailServerApp(plinth.app.App): def setup(helper, old_version=None): """Installs and configures module""" + + def _clear_conflicts(): + packages_to_remove = packages_installed(package_conflicts) + if packages_to_remove: + logger.info('Removing conflicting packages: %s', + packages_to_remove) + remove(packages_to_remove) + + # Install + helper.call('pre', _clear_conflicts) helper.install(packages) helper.install(packages_bloat, skip_recommends=True) + + # Setup helper.call('post', audit.domain.repair) helper.call('post', audit.ldap.repair) helper.call('post', audit.spam.repair) helper.call('post', audit.tls.repair) helper.call('post', audit.rcube.repair) + + # Reload for srvname in managed_services: actions.superuser_run('service', ['reload', srvname]) - # Final step: expose service daemons to public internet + + # Expose to public internet helper.call('post', app.enable) diff --git a/plinth/modules/email_server/views.py b/plinth/modules/email_server/views.py index 0feeacadf..66bb98b3d 100644 --- a/plinth/modules/email_server/views.py +++ b/plinth/modules/email_server/views.py @@ -121,6 +121,7 @@ class EmailServerView(TabMixin, AppView): return redirect(request.path) def _repair(self, module_name, action_name): + """Repair the configuration of the given audit module.""" module = getattr(audit, module_name) if not hasattr(module, 'repair_component'): return From 148d1ea311aa922dca8b978e31336e71ffb20c9f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 10 Oct 2021 19:43:13 -0700 Subject: [PATCH 50/58] package: Remove unused import to fix pipeline Signed-off-by: Sunil Mohan Adapa --- plinth/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/package.py b/plinth/package.py index 58314d630..617a4b3fd 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -14,7 +14,7 @@ from django.utils.translation import gettext as _ from django.utils.translation import gettext_lazy from plinth import actions -from plinth.errors import ActionError, PlinthError +from plinth.errors import ActionError from plinth.utils import format_lazy logger = logging.getLogger(__name__) From 9faeedbf8f1e8205c598a59a3e70f3a8ba9a3f98 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 5 Oct 2021 15:31:52 -0700 Subject: [PATCH 51/58] tests: Drop installation of pytest-bdd Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- HACKING.md | 1 - container | 2 +- plinth/tests/functional/install.sh | 7 ------- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/HACKING.md b/HACKING.md index 07ba1adb7..5f2f230cf 100644 --- a/HACKING.md +++ b/HACKING.md @@ -449,7 +449,6 @@ host$ pip3 install splinter host$ pip3 install pytest-splinter host$ pip3 install pytest-xdist # optional, to run tests in parallel host$ sudo apt install firefox -host$ sudo apt install python3-pytest-bdd host$ sudo apt install xvfb python3-pytest-xvfb # optional, to avoid opening browser windows host$ sudo apt install smbclient # optional, to test samba ``` diff --git a/container b/container index 068de7962..8c8f56766 100755 --- a/container +++ b/container @@ -199,7 +199,7 @@ apt-get update DEBIAN_FRONTEND=noninteractive apt-get -yq --with-new-pkgs upgrade # Install requirements for tests if not already installed as root -if ! [[ -e /usr/local/bin/geckodriver && -e /usr/local/bin/pytest-bdd ]] +if ! [[ -e /usr/local/bin/geckodriver ]] then /freedombox/plinth/tests/functional/install.sh fi diff --git a/plinth/tests/functional/install.sh b/plinth/tests/functional/install.sh index 81ffad1db..ab8bc93ad 100755 --- a/plinth/tests/functional/install.sh +++ b/plinth/tests/functional/install.sh @@ -8,13 +8,6 @@ sudo apt-get install -yq --no-install-recommends \ python3-pip python3-wheel firefox-esr git smbclient\ xvfb -if [ $(lsb_release --release --short) == '10' ] -then - pip3 install pytest-bdd==3.2.1 -else - pip3 install pytest-bdd -fi - pip3 install splinter pytest-splinter pytest-xvfb echo "Installing geckodriver" From ebd357476dd15b1463767cfa88dc0dcee22ddecd Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 5 Oct 2021 18:54:00 -0700 Subject: [PATCH 52/58] performance: Cleanup code meant for cockpit version < 235 Bullseye and higher has version 239 or higher. Tests: - From performance app, launch the web interface in a testing container. Web interface shows up properly. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/performance/manifest.py | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/plinth/modules/performance/manifest.py b/plinth/modules/performance/manifest.py index f40a63813..23eb84f8e 100644 --- a/plinth/modules/performance/manifest.py +++ b/plinth/modules/performance/manifest.py @@ -3,36 +3,12 @@ FreedomBox app for System Monitoring (cockpit-pcp) in ‘System’. """ -import subprocess -from functools import lru_cache - -from django.utils.functional import lazy from django.utils.translation import gettext_lazy as _ -from plinth.utils import Version - - -@lru_cache() -def _get_url(): - """Return the web client URL based on Cockpit version.""" - process = subprocess.run( - ['dpkg-query', '--showformat=${Version}', '--show', 'cockpit'], - stdout=subprocess.PIPE) - cockpit_version = process.stdout.decode() - if Version(cockpit_version) >= Version('235'): - url = '/_cockpit/metrics' - else: - url = '/_cockpit/system/graphs' - - return url - - -get_url = lazy(_get_url, str) - clients = [{ 'name': _('Cockpit'), 'platforms': [{ 'type': 'web', - 'url': get_url() + 'url': '/_cockpit/metrics' }] }] From 9bd1f80d5c0ea564aa02460339ddbf5ec66312f0 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 5 Oct 2021 19:10:05 -0700 Subject: [PATCH 53/58] *: Always pass check= argument to subprocess.run() - Avoid flake8 warnings. - Makes the call more explicitly readable in case an exception is expected but check=True is not passed by mistake. Tests: - Many tests are skipped since the changes are considered trivial. check=False is already the default for subprocess.run() method. - actions/package: Install an app when it is not installed. - actions/upgrade: Run manual upgrades. - actions/users: Change a user password. Login. Create/remove a user. - actions/zoph: Restore a database. - container: On a fresh repository, run ./container up,ssh,stop,destroy for a testing container. - plinth/action_utils.py: Enable/disable an app that has a running service. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- actions/monkeysphere | 3 +- actions/packages | 2 +- actions/storage | 2 +- actions/upgrades | 6 +-- actions/users | 7 ++- actions/zoph | 2 +- container | 46 +++++++++++-------- plinth/action_utils.py | 11 +++-- plinth/modules/backups/forms.py | 5 +- .../modules/backups/tests/test_ssh_remotes.py | 2 +- plinth/modules/email_server/audit/domain.py | 6 +-- plinth/modules/email_server/audit/home.py | 2 +- plinth/modules/email_server/audit/spam.py | 2 +- plinth/modules/email_server/lock.py | 2 +- plinth/modules/storage/tests/test_storage.py | 11 ++--- plinth/modules/upgrades/views.py | 3 +- plinth/modules/users/tests/test_actions.py | 5 +- 17 files changed, 62 insertions(+), 55 deletions(-) diff --git a/actions/monkeysphere b/actions/monkeysphere index c01e9246e..e9c892a7e 100755 --- a/actions/monkeysphere +++ b/actions/monkeysphere @@ -226,7 +226,8 @@ def _get_ssh_key_file_for_import(original_key_file, service): shutil.copy2(original_key_file, key_file) # Convert OpenSSH format to PEM subprocess.run( - ['ssh-keygen', '-p', '-N', '', '-m', 'PEM', '-f', key_file]) + ['ssh-keygen', '-p', '-N', '', '-m', 'PEM', '-f', key_file], + check=True) yield key_file diff --git a/actions/packages b/actions/packages index 1a907d86c..24517a3cd 100755 --- a/actions/packages +++ b/actions/packages @@ -96,7 +96,7 @@ def subcommand_install(arguments): if arguments.force_missing_configuration: extra_arguments += ['-o', 'Dpkg::Options::=--force-confmiss'] - subprocess.run(['dpkg', '--configure', '-a']) + subprocess.run(['dpkg', '--configure', '-a'], check=False) with apt_hold_freedombox(): run_apt_command(['--fix-broken', 'install']) returncode = run_apt_command(['install'] + extra_arguments + diff --git a/actions/storage b/actions/storage index 9ed372117..814c0adaf 100755 --- a/actions/storage +++ b/actions/storage @@ -273,7 +273,7 @@ def subcommand_mount(arguments): process = subprocess.run([ 'udisksctl', 'mount', '--block-device', arguments.block_device, '--no-user-interaction' - ]) + ], check=False) sys.exit(process.returncode) diff --git a/actions/upgrades b/actions/upgrades index 4edcb1be4..6abcaad9d 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -140,7 +140,7 @@ def parse_arguments(): def _run(): """Run unattended-upgrades""" - subprocess.run(['dpkg', '--configure', '-a']) + subprocess.run(['dpkg', '--configure', '-a'], check=False) run_apt_command(['--fix-broken', 'install']) # In case freedombox package was left in held state by an @@ -453,7 +453,7 @@ def _perform_dist_upgrade(): ['grub-pc grub-pc/install_devices_empty boolean true']) print('Running unattended-upgrade...', flush=True) - subprocess.run(['unattended-upgrade', '--verbose']) + subprocess.run(['unattended-upgrade', '--verbose'], check=False) # Remove obsolete packages that may prevent other packages from # upgrading. @@ -492,7 +492,7 @@ def _perform_dist_upgrade(): # Run unattended-upgrade once more to handle upgrading the # freedombox package. print('Running unattended-upgrade...', flush=True) - subprocess.run(['unattended-upgrade', '--verbose']) + subprocess.run(['unattended-upgrade', '--verbose'], check=False) # Restore original snapshots configuration. if snapshots_supported and apt_snapshots_enabled: diff --git a/actions/users b/actions/users index 5e0656cb8..d7f06db71 100755 --- a/actions/users +++ b/actions/users @@ -373,7 +373,7 @@ def set_samba_user(username, password): """ proc = subprocess.run(['smbpasswd', '-a', '-s', username], input='{0}\n{0}\n'.format(password).encode(), - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, check=False) if proc.returncode != 0: raise RuntimeError('Unable to add Samba user: ', proc.stderr) @@ -580,13 +580,12 @@ def flush_cache(): action_utils.service_reload('apache2') -def _run(arguments, **kwargs): +def _run(arguments, check=True, **kwargs): """Run a command. Check return code and suppress output by default.""" env = dict(os.environ, LDAPSCRIPTS_CONF=LDAPSCRIPTS_CONF) kwargs['stdout'] = kwargs.get('stdout', subprocess.DEVNULL) kwargs['stderr'] = kwargs.get('stderr', subprocess.DEVNULL) - kwargs['check'] = kwargs.get('check', True) - return subprocess.run(arguments, env=env, **kwargs) + return subprocess.run(arguments, env=env, check=check, **kwargs) def main(): diff --git a/actions/zoph b/actions/zoph index 3b6b8a831..b32a5298c 100755 --- a/actions/zoph +++ b/actions/zoph @@ -128,7 +128,7 @@ def subcommand_dump_database(_): def subcommand_restore_database(_): """Restore database from file.""" db_name = _get_db_name() - subprocess.run(['mysqladmin', '--force', 'drop', db_name]) + subprocess.run(['mysqladmin', '--force', 'drop', db_name], check=False) subprocess.run(['mysqladmin', 'create', db_name], check=True) with open(DB_BACKUP_FILE, 'r') as db_restore_file: subprocess.run(['mysql', db_name], stdin=db_restore_file, check=True) diff --git a/container b/container index 8c8f56766..48194ac26 100755 --- a/container +++ b/container @@ -327,7 +327,7 @@ def _check_command(command): else: which = ['sudo', 'which', command] - process = subprocess.run(which, stdout=subprocess.DEVNULL) + process = subprocess.run(which, stdout=subprocess.DEVNULL, check=False) return process.returncode == 0 @@ -341,7 +341,8 @@ def _verify_dependencies(): # it leading to machinectl start failing first time after boot. See # https://github.com/systemd/systemd/issues/13130 . Workaround for old # versions of machinectl. Ignore errors. - subprocess.run(['sudo', 'modprobe', '--all', '--quiet', 'loop']) + subprocess.run(['sudo', 'modprobe', '--all', '--quiet', 'loop'], + check=False) dependencies = { 'systemd-nspawn': 'systemd-container', @@ -370,13 +371,13 @@ def _verify_dependencies(): ' '.join(missing_commands)) process = subprocess.run(['lsb_release', '--id', '--short'], - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, check=False) if process.stdout.decode().strip() != 'Debian': sys.exit(1) logger.info('Running apt for missing packages: %s', ' '.join(missing_commands)) - subprocess.run(['sudo', 'apt', 'install'] + missing_packages) + subprocess.run(['sudo', 'apt', 'install'] + missing_packages, check=False) def _get_systemd_nspawn_version(): @@ -583,7 +584,7 @@ def _setup_nm_connection(distribution): connection_name = f'fbx-{distribution}-shared' process = subprocess.run( ['sudo', 'nmcli', 'connection', 'show', connection_name], - stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, check=False) if not process.returncode: return @@ -600,7 +601,8 @@ def _setup_nm_connection(distribution): subprocess.run(['sudo', 'nmcli', 'connection', 'add'] + list(itertools.chain(*properties.items())), check=True) subprocess.run(['sudo', 'nmcli', 'connection', 'up', connection_name], - stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + check=False) def _setup_users(image_file): @@ -649,7 +651,7 @@ def _setup_ssh(image_file): logger.info('Generating SSH client key %s', key_file) subprocess.run( ['ssh-keygen', '-t', 'ed25519', '-N', '', '-f', - str(key_file)], stdout=subprocess.DEVNULL) + str(key_file)], stdout=subprocess.DEVNULL, check=True) public_key_file = key_file.with_suffix('.pub') public_key = public_key_file.read_bytes() @@ -713,33 +715,35 @@ VirtualEthernet=yes ''' nspawn_file = f'/run/systemd/nspawn/{machine_name}.nspawn' logger.info('Creating systemd-nspawn configuration: %s', nspawn_file) - subprocess.run(['sudo', 'rm', '--force', nspawn_file]) + subprocess.run(['sudo', 'rm', '--force', nspawn_file], check=False) subprocess.run(['sudo', 'tee', nspawn_file], input=nspawn_options.encode(), stdout=subprocess.DEVNULL, check=True) image_link = pathlib.Path(f'/var/lib/machines/{machine_name}.raw') logger.info('Linking systemd-nspawn image %s -> %s', image_link, image_file) - result = subprocess.run(['sudo', 'test', '-e', str(image_link)]) + result = subprocess.run( + ['sudo', 'test', '-e', str(image_link)], check=False) if not result.returncode: - result = subprocess.run(['sudo', 'test', '-L', str(image_link)]) + result = subprocess.run( + ['sudo', 'test', '-L', str(image_link)], check=False) if result.returncode: raise Exception(f'Image file {image_link} is not a symlink.') - subprocess.run(['sudo', 'rm', '--force', str(image_link)]) + subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False) subprocess.run([ 'sudo', 'ln', '--symbolic', str(image_file.resolve()), str(image_link) - ]) + ], check=False) def _get_machine_status(machine_name): """Return the running status of a container.""" process = subprocess.run(['sudo', 'machinectl', 'status', machine_name], stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL) + stderr=subprocess.DEVNULL, check=False) return process.returncode == 0 @@ -756,14 +760,14 @@ def _launch(image_file, distribution): f'fbx-{distribution}-shared') subprocess.run( ['sudo', 'nmcli', 'connection', 'up', f'fbx-{distribution}-shared'], - stdout=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, check=False) def _stop(distribution): """Stop the container.""" machine_name = f'fbx-{distribution}' logger.info('Running `machinectl stop %s`', machine_name) - subprocess.run(['sudo', 'machinectl', 'stop', machine_name]) + subprocess.run(['sudo', 'machinectl', 'stop', machine_name], check=False) _wait_for(lambda: not _get_machine_status(machine_name)) @@ -771,7 +775,8 @@ def _terminate(distribution): """Terminal the container.""" machine_name = f'fbx-{distribution}' logger.info('Running `machinectl terminate %s`', machine_name) - subprocess.run(['sudo', 'machinectl', 'terminate', machine_name]) + subprocess.run(['sudo', 'machinectl', 'terminate', machine_name], + check=False) _wait_for(lambda: not _get_machine_status(machine_name)) @@ -781,16 +786,17 @@ def _destroy(distribution): image_link = pathlib.Path(f'/var/lib/machines/{machine_name}.raw') logger.info('Removing link to systemd-nspawn image %s', image_link) - subprocess.run(['sudo', 'rm', '--force', str(image_link)]) + subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False) nspawn_file = f'/run/systemd/nspawn/{machine_name}.nspawn' logger.info('Removing systemd-nspawn configuration: %s', nspawn_file) - subprocess.run(['sudo', 'rm', '--force', nspawn_file]) + subprocess.run(['sudo', 'rm', '--force', nspawn_file], check=False) overlay_folder = _get_overlay_folder(distribution) logger.info('Removing overlay folder with container written data: %s', overlay_folder) - subprocess.run(['sudo', 'rm', '-r', '--force', overlay_folder]) + subprocess.run(['sudo', 'rm', '-r', '--force', overlay_folder], + check=False) compressed_image = _get_compressed_image_path(distribution) image_file = compressed_image.with_suffix('') @@ -814,7 +820,7 @@ def _destroy(distribution): logger.info('Removing Network Manager connection %s', connection_name) result = subprocess.run( ['sudo', 'nmcli', 'connection', 'delete', connection_name], - capture_output=True) + capture_output=True, check=False) if result.returncode not in (0, 10): # nmcli failed and not due to 'Connection, device, or access point does # not exist.' See diff --git a/plinth/action_utils.py b/plinth/action_utils.py index baba9194b..ccc71a0e6 100644 --- a/plinth/action_utils.py +++ b/plinth/action_utils.py @@ -128,10 +128,10 @@ def service_action(service_name, action): """Perform the given action on the service_name.""" if is_systemd_running(): subprocess.run(['systemctl', action, service_name], - stdout=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, check=False) else: subprocess.run(['service', service_name, action], - stdout=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, check=False) def webserver_is_enabled(name, kind='config'): @@ -371,7 +371,7 @@ Owners: {package} env['DEBCONF_DB_OVERRIDE'] = 'File{' + override_file.name + \ ' readonly:true}' env['DEBIAN_FRONTEND'] = 'noninteractive' - subprocess.run(['dpkg-reconfigure', package], env=env) + subprocess.run(['dpkg-reconfigure', package], env=env, check=False) try: os.remove(override_file.name) @@ -419,7 +419,7 @@ def run_apt_command(arguments): env['DEBIAN_FRONTEND'] = 'noninteractive' process = subprocess.run(command, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, close_fds=False, - env=env) + env=env, check=False) return process.returncode @@ -458,7 +458,8 @@ def apt_hold_freedombox(): def apt_unhold_freedombox(): """Remove any hold on freedombox package, and clear flag.""" subprocess.run(['apt-mark', 'unhold', 'freedombox'], - stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + check=False) if apt_hold_flag.exists(): apt_hold_flag.unlink() diff --git a/plinth/modules/backups/forms.py b/plinth/modules/backups/forms.py index 627fa933c..ac70ad2fa 100644 --- a/plinth/modules/backups/forms.py +++ b/plinth/modules/backups/forms.py @@ -285,12 +285,13 @@ class VerifySshHostkeyForm(forms.Form): # Fetch public keys of ssh remote keyscan = subprocess.run(['ssh-keyscan', hostname], stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, check=False) keys = keyscan.stdout.decode().splitlines() error_message = keyscan.stderr.decode() if keyscan.returncode else None # Generate user-friendly fingerprints of public keys keygen = subprocess.run(['ssh-keygen', '-l', '-f', '-'], - input=keyscan.stdout, stdout=subprocess.PIPE) + input=keyscan.stdout, stdout=subprocess.PIPE, + check=False) fingerprints = keygen.stdout.decode().splitlines() return zip(keys, fingerprints), error_message diff --git a/plinth/modules/backups/tests/test_ssh_remotes.py b/plinth/modules/backups/tests/test_ssh_remotes.py index 5bc6688a8..d0b789ad2 100644 --- a/plinth/modules/backups/tests/test_ssh_remotes.py +++ b/plinth/modules/backups/tests/test_ssh_remotes.py @@ -38,7 +38,7 @@ def fixture_password(): def get_hashed_password(password): res = subprocess.run(['mkpasswd', '--method=md5', password], - stdout=subprocess.PIPE) + stdout=subprocess.PIPE, check=True) return res.stdout.decode().strip() diff --git a/plinth/modules/email_server/audit/domain.py b/plinth/modules/email_server/audit/domain.py index b9205292e..da8c77ea6 100644 --- a/plinth/modules/email_server/audit/domain.py +++ b/plinth/modules/email_server/audit/domain.py @@ -244,8 +244,8 @@ def _action_set_keys(): clean_dict[key] = clean_function(value) # Apply changes (postconf) - postconf_dict = dict(filter(lambda kv: not kv[0].startswith('_'), - clean_dict.items())) + postconf_dict = dict( + filter(lambda kv: not kv[0].startswith('_'), clean_dict.items())) postconf.set_many(postconf_dict) # Apply changes (special) @@ -258,7 +258,7 @@ def _action_set_keys(): with postconf.mutex.lock_all(): # systemctl reload postfix args = ['systemctl', 'reload', 'postfix'] - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Could not reload postfix') diff --git a/plinth/modules/email_server/audit/home.py b/plinth/modules/email_server/audit/home.py index 2b5e24d41..3e7d54326 100644 --- a/plinth/modules/email_server/audit/home.py +++ b/plinth/modules/email_server/audit/home.py @@ -65,7 +65,7 @@ def action_mk(arg_type, user_info): args = ['sudo', '-n', '--user=#' + str(passwd.pw_uid)] args.extend(['/bin/sh', '-c', 'mkdir -p ~']) - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Could not create home directory') diff --git a/plinth/modules/email_server/audit/spam.py b/plinth/modules/email_server/audit/spam.py index fb19f8dee..7809abd82 100644 --- a/plinth/modules/email_server/audit/spam.py +++ b/plinth/modules/email_server/audit/spam.py @@ -140,7 +140,7 @@ def _compile_sieve(): def _run_sievec(sieve_file): logger.info('Compiling sieve script %s', sieve_file) args = ['sievec', '--', sieve_file] - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Sieve compilation failed: ' + sieve_file) diff --git a/plinth/modules/email_server/lock.py b/plinth/modules/email_server/lock.py index e3909039c..8619f1e6a 100644 --- a/plinth/modules/email_server/lock.py +++ b/plinth/modules/email_server/lock.py @@ -89,7 +89,7 @@ class Mutex: args.extend(['/bin/sh', '-c']) args.append('umask 177 && > ' + self.lock_path) - completed = subprocess.run(args, capture_output=True) + completed = subprocess.run(args, capture_output=True, check=False) if completed.returncode != 0: interproc.log_subprocess(completed) raise OSError('Could not create ' + self.lock_path) diff --git a/plinth/modules/storage/tests/test_storage.py b/plinth/modules/storage/tests/test_storage.py index db11baca0..e84ccdb1e 100644 --- a/plinth/modules/storage/tests/test_storage.py +++ b/plinth/modules/storage/tests/test_storage.py @@ -56,7 +56,7 @@ class Disk(): command = 'losetup --show --find {file}'.format( file=self.disk_file.name) process = subprocess.run(command.split(), stdout=subprocess.PIPE, - stderr=subprocess.PIPE) + stderr=subprocess.PIPE, check=False) if process.returncode: if b'cannot find an unused loop device' in process.stderr: pytest.skip('Loopback devices not available') @@ -107,7 +107,7 @@ class Disk(): def _cleanup_loopback(self): """Undo the loopback device setup.""" - subprocess.run(['losetup', '--detach', self.device]) + subprocess.run(['losetup', '--detach', self.device], check=False) def _remove_disk_file(self): """Delete the disk_file.""" @@ -231,16 +231,15 @@ class TestActions: self.assert_aligned(partition_number) @staticmethod - def call_action(action_command, **kwargs): + def call_action(action_command, check=True, **kwargs): """Call the action script.""" test_directory = pathlib.Path(__file__).parent top_directory = (test_directory / '..' / '..' / '..' / '..').resolve() action_command[0] = top_directory / 'actions' / action_command[0] kwargs['stdout'] = kwargs.get('stdout', subprocess.DEVNULL) kwargs['stderr'] = kwargs.get('stderr', subprocess.DEVNULL) - kwargs['check'] = kwargs.get('check', True) env = dict(os.environ, PYTHONPATH=str(top_directory)) - return subprocess.run(action_command, env=env, **kwargs) + return subprocess.run(action_command, env=env, check=check, **kwargs) def check_action(self, action_command): """Return success/failure result of the action command.""" @@ -255,7 +254,7 @@ class TestActions: subprocess.run([ 'parted', '--script', self.device, 'align-check', 'opti', str(partition_number) - ]) + ], check=True) def assert_btrfs_file_system_healthy(self, partition_number): """Perform a successful ext4 file system check.""" diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 3d17ca3a7..911fd3dfa 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -114,7 +114,8 @@ def get_log(): def _is_updating(): """Check if manually triggered update is running.""" command = ['systemctl', 'is-active', 'freedombox-manual-upgrade'] - result = subprocess.run(command, capture_output=True, text=True) + result = subprocess.run(command, capture_output=True, text=True, + check=False) return str(result.stdout).startswith('activ') # 'active' or 'activating' diff --git a/plinth/modules/users/tests/test_actions.py b/plinth/modules/users/tests/test_actions.py index 5c038e814..832077d4e 100644 --- a/plinth/modules/users/tests/test_actions.py +++ b/plinth/modules/users/tests/test_actions.py @@ -138,12 +138,11 @@ def fixture_auto_cleanup_users_groups(needs_root, load_cfg): _delete_group(group) -def _call_action(arguments, **kwargs): +def _call_action(arguments, check=True, **kwargs): """Call the action script.""" kwargs['stdout'] = kwargs.get('stdout', subprocess.PIPE) kwargs['stderr'] = kwargs.get('stderr', subprocess.PIPE) - kwargs['check'] = kwargs.get('check', True) - return subprocess.run([_action_file()] + arguments, **kwargs) + return subprocess.run([_action_file()] + arguments, check=check, **kwargs) def _create_user(username=None, groups=None): From 2c4423baafe99220cf67ea6d3cf26967ad5734a2 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 9 Oct 2021 17:13:34 -0700 Subject: [PATCH 54/58] ttrss: Fix daemon not running sometimes on startup - Sometimes when postgres is not available, the daemon fails to create a database connection. In this case the daemon permanently exits with code 101 instead of trying again. - This happens more prominently when booting the system and postgres may not be available. Although tt-rss.service has Wants= and After= on postgres.service, it appears that postgres does not have proper startup notification with systemd. - This may also happen in other situations such as when temporarily restarting postgres during upgrades or backup/restore operations. - Fix the issue by make the daemon restart after a failure. This seems appropriate because the daemon is coded like a web page to fail and exit on all, even temporary, errors. Tests: - Without the patch, stop postgres@13-main.service. Start tt-rss.service. It will fail permanently and not try to restart. - With the patch, daemon-reload systemd. Notice that the intended changes reflect with systemd status. Start the service. It fails. But retries 2 minutes later with failure again. When postgres is started again, the next attempt succeeds. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- .../usr/lib/systemd/system/tt-rss.service.d/freedombox.conf | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf diff --git a/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf b/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf new file mode 100644 index 000000000..ee82c0fc7 --- /dev/null +++ b/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf @@ -0,0 +1,6 @@ +# Restart the service every 120 seconds always. When tt-rss can't connect to a +# database temporarily, it will exist with exit code 101. 120 seconds is the +# default daemon sleep interval for tt-rss. +[Service] +Restart=always +RestartSec=120s From c7c9d49939a8409725151c4e29f4193f929c8831 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 9 Oct 2021 19:19:46 -0700 Subject: [PATCH 55/58] ttrss: Add systemd security hardening to daemon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit → Overall exposure level for tt-rss.service: 1.1 OK 🙂 Tests: - Run ./setup.py install. systemctl daemon-reload. Subscribe to a new feed and don't wait for it load the feed. Then start/restart the daemon. The daemon successfully fetches the feed. When tt-rss interface is loaded again the feed items are available. - For getting output of the daemon add StandardOutput=journal option to the service file. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- .../system/tt-rss.service.d/freedombox.conf | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf b/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf index ee82c0fc7..e5c1a5d7a 100644 --- a/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf +++ b/plinth/modules/ttrss/data/usr/lib/systemd/system/tt-rss.service.d/freedombox.conf @@ -2,5 +2,34 @@ # database temporarily, it will exist with exit code 101. 120 seconds is the # default daemon sleep interval for tt-rss. [Service] +CacheDirectory=tt-rss +CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE CAP_SETUID CAP_SETGID CAP_SETPCAP CAP_CHOWN CAP_FSETID CAP_SETFCAP CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_IPC_OWNER CAP_NET_ADMIN CAP_AUDIT_CONTROL CAP_AUDIT_READ CAP_AUDIT_WRITE CAP_KILL CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_LINUX_IMMUTABLE CAP_IPC_LOCK CAP_SYS_CHROOT CAP_BLOCK_SUSPEND CAP_LEASE CAP_SYS_PACCT CAP_SYS_TTY_CONFIG CAP_SYS_BOOT CAP_MAC_ADMIN CAP_MAC_OVERRIDE CAP_SYS_NICE CAP_SYS_RESOURCE +DevicePolicy=closed +LockPersonality=yes +NoNewPrivileges=yes +PrivateDevices=yes +PrivateMounts=yes +PrivateTmp=yes +PrivateUsers=yes +ProtectControlGroups=yes +ProtectClock=yes +ProtectHome=yes +ProtectHostname=yes +ProtectKernelLogs=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +ProtectProc=invisible +ProtectSystem=strict +RemoveIPC=yes Restart=always RestartSec=120s +RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 +RestrictNamespaces=yes +RestrictSUIDSGID=yes +RestrictRealtime=yes +StateDirectory=tt-rss +SystemCallArchitectures=native +SystemCallFilter=@system-service +SystemCallFilter=~@resources +SystemCallFilter=~@privileged +SystemCallErrorNumber=EPERM From a9fd85ddf731a5b140f3fae966b6995ac832c77c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 11 Oct 2021 18:26:24 -0400 Subject: [PATCH 56/58] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar_SA/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/bg/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/bn/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/cs/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/da/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/de/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/django.pot | 121 +++++++++--------- plinth/locale/el/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/es/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/fa/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/fake/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/fr/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/gl/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/gu/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/hi/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/hu/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/id/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/it/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/ja/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/kn/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/lt/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/nb/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/nl/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/pl/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/pt/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/ru/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/si/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/sl/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/sq/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/sr/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/sv/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/ta/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/te/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/tr/LC_MESSAGES/django.po | 124 +++++++++--------- plinth/locale/uk/LC_MESSAGES/django.po | 132 +++++++++++--------- plinth/locale/vi/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 121 +++++++++--------- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 121 +++++++++--------- 38 files changed, 2516 insertions(+), 2132 deletions(-) diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 190053fed..9ab75d12b 100644 --- a/plinth/locale/ar_SA/LC_MESSAGES/django.po +++ b/plinth/locale/ar_SA/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "خادم ويب" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1983,7 +1989,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2085,11 +2091,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6594,15 +6600,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6634,32 +6640,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6668,66 +6674,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6749,7 +6751,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6842,20 +6844,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7274,23 +7276,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7590,24 +7592,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 2358e844c..7d569b236 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-29 14:38+0000\n" "Last-Translator: 109247019824 \n" "Language-Team: Bulgarian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "Пощенски сървър" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2015,7 +2021,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2117,11 +2123,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6628,15 +6634,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6668,32 +6674,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6702,66 +6708,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6783,7 +6785,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6876,20 +6878,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7308,23 +7310,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7624,24 +7626,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index daec40353..9eb5eb72e 100644 --- a/plinth/locale/bn/LC_MESSAGES/django.po +++ b/plinth/locale/bn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-06-16 07:33+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1989,7 +1995,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2095,13 +2101,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enabled" msgid "Enabled aliases" msgstr "সক্রিয়" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -6608,15 +6614,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6648,32 +6654,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6682,66 +6688,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6763,7 +6765,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6856,20 +6858,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7288,23 +7290,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7604,24 +7606,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index 609814772..f5cdb2f50 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-25 11:32+0000\n" "Last-Translator: Milan \n" "Language-Team: Czech . Doménu je možné nastavit na stránce nastavení systému." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Chat server" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2251,7 +2257,7 @@ msgstr "Nová záloha" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Aktualizovat" @@ -2369,13 +2375,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Zapnout poškozování" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7676,15 +7682,15 @@ msgstr "Automatické aktualizace zapnuty" msgid "Distribution upgrade disabled" msgstr "Automatické aktualizace vypnuty" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Proces přechodu na novější verze zahájen." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Spouštění přechodu na novější verzi se nezdařilo." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7716,39 +7722,39 @@ msgstr "Přístup ke všem službám a nastavení systému" msgid "Check LDAP entry \"{search_item}\"" msgstr "Zkontrolujte LDAP položku „{search_item}“" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" "Toto uživatelské jméno je už používáno někým jiným nebo vyhrazeno pro systém." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Neplatný název serveru" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "Heslo k účtu správce" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Zobrazit heslo" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7769,23 +7775,23 @@ msgstr "" "skupině správců (admin) se budou moci přihlásit všude. Mohou se k systému " "přihlásit také prostřednictvím SSH a mají práva správy (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Vytvoření LDAP uživatele se nezdařilo." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "Přidání nového uživatele do skupiny {group} se nezdařilo." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Pověřené SSH klíče" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7795,49 +7801,45 @@ msgstr "" "systému i bez zadávání hesla. Klíčů je možné vložit vícero, každý na vlastní " "řádek. Prázdné řádky a ty, které začínají na znak # budou ignorovány." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Přejmenování LDAP uživatele se nezdařilo." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Odebrání uživatele ze skupiny se nezdařilo." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Přidání uživatele do skupiny se nezdařilo." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Nepodařilo se vložit SSH klíče." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Přidání uživatele do skupiny se nezdařilo." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Není možné smazat účet jediného zbývajícího správce systému." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Změna hesla LDAP uživatele se nezdařila." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Přidání nového uživatele do skupiny správců (admin) se nezdařilo." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "Omezení přístupu ke konzoli se nezdařilo." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Uživatelský účet vytvořen, není jste jím přihlášeni" @@ -7859,7 +7861,7 @@ msgid "Create User" msgstr "Vytvořit uživatele" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Smazat uživatele" @@ -7962,20 +7964,20 @@ msgstr "Uživatel %(username)s aktualizován." msgid "Edit User" msgstr "Upravit uživatele" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Uživatel {user} smazán." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Smazání LDAP uživatele se nezdařilo." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Změnit heslo" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Heslo úspěšně změněno." @@ -8470,23 +8472,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Obecné" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Chyba při instalaci" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Instalace" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "stahování" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "změna média" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "soubor s nastaveními: {file}" @@ -8840,24 +8842,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Nainstalovat" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Provádění úkonů před instalací" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Provádění úkonů po instalaci" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Instalace %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% dokončeno" @@ -8866,6 +8875,9 @@ msgstr "%(percentage)s%% dokončeno" msgid "Gujarati" msgstr "gudžarátština" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Není možné smazat účet jediného zbývajícího správce systému." + #~ msgid "Past Vulnerabilities" #~ msgstr "Minulé zranitelnosti zabezpečení" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 692ca88b0..edbd08b91 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish brugernavn@%(domainname)s
. Du kan konfigurere systemets " "domæne på Konfigurer siden." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Chatserver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2215,7 +2221,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Opdater" @@ -2333,13 +2339,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable PageKite" msgid "Enabled aliases" msgstr "Aktiver PageKite" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7613,15 +7619,15 @@ msgstr "Automatisk opdatering aktiveret" msgid "Distribution upgrade disabled" msgstr "Automatisk opdatering deaktiveret" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Opdateringsprocessen er startet." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Kunne ikke starte opdatering." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7653,38 +7659,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrol af LDAP-konfiguration \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Ugyldigt servernavn" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "Administratorkonto" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Vis kodeord" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7706,23 +7712,23 @@ msgstr "" "tjenester. De kan også logge ind på systemet gennem SSH og har " "administratorprivilegier (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Kunne ikke oprette LDAP-bruger." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "Kunne ikke tilføje ny bruger til gruppen {group}." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7732,50 +7738,46 @@ msgstr "" "sikkert ind på systemet uden et kodeord. Der kan defineres flere nøgler, en " "på hver linje. Tomme linjer og linjer som starter med # bliver ignoreret." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Kunne ikke omdøbe LDAP-bruger." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Kunne ikke fjerne bruger fra gruppe." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Kunne ikke tilføje bruger til gruppe." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Kunne ikke tilføje bruger til gruppe." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Kunne ikke ændre LDAP-kodeord." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Kunne ikke tilføje ny bruger til admin-gruppen." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to obtain certificate for domain {domain}: {error}" msgid "Failed to restrict console access: {error}" msgstr "" "Fejl ved forsøg på at erhverve certifikatet for domænet {domain}: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Brugerkonto oprettet, du er nu logget ind" @@ -7797,7 +7799,7 @@ msgid "Create User" msgstr "Opret Bruger" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Slet Bruger" @@ -7899,20 +7901,20 @@ msgstr "Bruger %(username)s opdateret." msgid "Edit User" msgstr "Rediger Bruger" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Brugeren {user} slettet." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Kunne ikke slette LDAP-bruger." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Ændr kodeord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Kodeord blev ændret." @@ -8391,23 +8393,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fejl under installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Installerer" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "downloader" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "medie-ændring" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" @@ -8746,24 +8748,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Udfører før-installationshandlinger" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Udfører efter-installationshandlinger" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installerer %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% færdig" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index d1da77120..09fd6928e 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-26 06:35+0000\n" "Last-Translator: Johannes Keyser \n" "Language-Team: German Systemeinstellungen " "konfigurieren." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-Mail Server" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Betrieben mit Postfix, Dovecot und Rspamd" @@ -2241,7 +2247,7 @@ msgstr "Neuer Wert" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Aktualisieren" @@ -2343,11 +2349,11 @@ msgstr "Interner Fehler in {0}" msgid "Check syslog for more information" msgstr "Prüfen Sie das Syslog für weitere Informationen" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Aktivierte Aliase" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Deaktivierte Aliase" @@ -7672,15 +7678,15 @@ msgstr "Distributions-Upgrade aktiviert" msgid "Distribution upgrade disabled" msgstr "Distributions-Upgrade deaktiviert" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Aktualisierung gestartet." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Starten der Aktualisierung fehlgeschlagen." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Häufige Funktions-Updates aktiviert." @@ -7720,35 +7726,35 @@ msgstr "Zugriff auf alle Anwendungen und Systemeinstellungen" msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP-Eintrag „{search_item}“ prüfen" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Benutzername wird bereits verwendet oder ist reserviert." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Einen gültigen Benutzernamen eingeben." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Erforderlich. Bis zu 150 Zeichen. Nur englische Buchstaben, Ziffern und " "@/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Autorisierungs-Passwort" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" "Geben Sie Ihr aktuelles Kennwort ein, um Kontoänderungen zu autorisieren." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Ungültiges Passwort." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7763,22 +7769,22 @@ msgstr "" "allen Diensten anmelden und sie können sich auch über SSH im System anmelden " "und besitzen Administratorrechte (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Erstellen des LDAP-Benutzers ist fehlgeschlagen:{error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" "Fehler beim Hinzufügen eines neuen Benutzers zur {group}-Gruppe: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Autorisierte SSH-Schlüssel" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7789,46 +7795,42 @@ msgstr "" "eingeben, einen pro Zeile. Leerzeilen und Zeilen, die mit # beginnen, werden " "ignoriert." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Umbenennen des LDAP-Benutzers fehlgeschlagen." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Entfernen des Benutzers von der Gruppe fehlgeschlagen." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Hinzufügen eines Benutzers zur Gruppe ist fehlgeschlagen." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH-Schlüssel kann nicht gesetzt werden." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Fehler beim Ändern des Benutzerstatus." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Der einzige Administrator des Systems kann nicht gelöscht werden." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Ändern des LDAP-Benutzerpassworts ist fehlgeschlagen." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Fehler beim Hinzufügen eines neuen Benutzers zur Administratorgruppe: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Fehler beim Einschränken des Konsolenzugriffs: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Benutzerkonto wurde erstellt, Sie sind jetzt angemeldet" @@ -7850,7 +7852,7 @@ msgid "Create User" msgstr "Benutzer anlegen" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Benutzer löschen" @@ -7955,20 +7957,20 @@ msgstr "Benutzer %(username)s geändert." msgid "Edit User" msgstr "Benutzer bearbeiten" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Benutzer {user} gelöscht." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Löschen von LDAP-Benutzer fehlgeschlagen." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Passwort ändern" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Passwort erfolgreich geändert." @@ -8465,23 +8467,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Allgemein" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fehler bei der Installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Installation läuft" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "herunterladen" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "Medienwechsel" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "Konfigurationsdatei: {file}" @@ -8819,24 +8821,31 @@ msgstr "Diese Anwendung ist in Ihrer Distribution derzeit nicht erhältlich." msgid "Check again" msgstr "Erneut prüfen" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installieren" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Installationsvorbereitungen werden ausgeführt" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Installationsnachbereitungen werden ausgeführt" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s wird installiert: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% abgeschlossen" @@ -8845,6 +8854,9 @@ msgstr "%(percentage)s %% abgeschlossen" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Der einzige Administrator des Systems kann nicht gelöscht werden." + #~ msgid "Past Vulnerabilities" #~ msgstr "Frühere Sicherheitslücken anzeigen" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 2aa87b502..164135fda 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -50,25 +50,25 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" -#: plinth/forms.py:39 +#: plinth/forms.py:36 msgid "Select a domain name to be used with this application" msgstr "" -#: plinth/forms.py:41 +#: plinth/forms.py:38 msgid "" "Warning! The application may not work properly if domain name is changed " "later." msgstr "" -#: plinth/forms.py:49 +#: plinth/forms.py:46 msgid "Language" msgstr "" -#: plinth/forms.py:50 +#: plinth/forms.py:47 msgid "Language to use for presenting this web interface" msgstr "" -#: plinth/forms.py:57 +#: plinth/forms.py:54 msgid "Use the language preference set in the browser" msgstr "" @@ -750,7 +750,7 @@ msgstr "" #: plinth/modules/bepasty/forms.py:27 #: plinth/modules/bepasty/templates/bepasty.html:30 -#: plinth/modules/users/forms.py:103 plinth/modules/users/forms.py:227 +#: plinth/modules/users/forms.py:102 plinth/modules/users/forms.py:228 msgid "Permissions" msgstr "" @@ -1063,7 +1063,7 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:9 -#: plinth/modules/performance/manifest.py:33 +#: plinth/modules/performance/manifest.py:9 msgid "Cockpit" msgstr "" @@ -1617,7 +1617,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: plinth/modules/dynamicdns/forms.py:103 plinth/modules/networks/forms.py:212 -#: plinth/modules/users/forms.py:69 +#: plinth/modules/users/forms.py:68 msgid "Username" msgstr "" @@ -1844,11 +1844,17 @@ msgid "" "Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1978,7 +1984,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2080,11 +2086,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6587,15 +6593,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6627,32 +6633,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6661,66 +6667,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6742,7 +6744,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6835,20 +6837,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7267,23 +7269,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7583,24 +7585,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 38631a365..0b1e6b7bd 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-14 04:27+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek . Μπορείτε να ρυθμίσετε το όνομα της υπηρεσίας στο Ρυθμίστε page." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Διακομιστής συνομιλίας" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2280,7 +2286,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Ενημερωμένη έκδοση" @@ -2396,13 +2402,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Ενεργοποίηση ζημιών" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7785,15 +7791,15 @@ msgstr "Oι αυτόματες ενημερώσεις ενεργοποιήθηκ msgid "Distribution upgrade disabled" msgstr "Oι αυτόματες ενημερώσεις απενεργοποιήθηκαν" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Ξεκίνησε η διαδικασία αναβάθμισης." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Η εκκίνηση της αναβάθμισης απέτυχε." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7834,38 +7840,38 @@ msgstr "Πρόσβαση σε όλες τις υπηρεσίες και τις msgid "Check LDAP entry \"{search_item}\"" msgstr "Ελέγξτε την καταχώρηση LDAP \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Το όνομα χρήστη είναι δεσμευμένο." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Μη έγκυρο όνομα διακομιστή" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "Κωδικός Πρόσβασης Διαχειριστή" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Εμφάνιση κωδικού" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7887,23 +7893,23 @@ msgstr "" "υπηρεσίες. Μπορούν επίσης να συνδεθούν στο σύστημα μέσω του SSH και να έχουν " "δικαιώματα διαχειριστή (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "Η δημιουργία χρήστη LDAP απέτυχε." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "Απέτυχε η προσθήκη νέου χρήστη στην ομάδα {group}." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Εξουσιοδοτημένα κλειδιά SSH" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7914,47 +7920,43 @@ msgstr "" "Μπορείτε να εισαγάγετε πολλαπλά κλειδιά, ένα σε κάθε γραμμή. Οι κενές " "γραμμές και οι γραμμές που ξεκινούν με # θα αγνοηθούν." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Η μετονομασία του χρήστη LDAP απέτυχε." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Απέτυχε η κατάργηση του χρήστη από την ομάδα." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Απέτυχε η προσθήκη χρήστη στην ομάδα." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Δεν ήταν δυνατό να προστεθούν τα κλειδιά SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Απέτυχε η αλλαγή της κατάστασης χρήστη." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Δεν είναι δυνατή η διαγραφή του μοναδικού διαχειριστή στο σύστημα." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Η αλλαγή του κωδικού πρόσβασης χρήστη LDAP απέτυχε." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "Αποτυχία προσθήκης νέου χρήστη στην ομάδα διαχειριστών." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "Απέτυχε ο περιορισμός της πρόσβασης στην κονσόλα." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Ο λογαριασμός χρήστη δημιουργήθηκε, τώρα είστε συνδεδεμένοι" @@ -7976,7 +7978,7 @@ msgid "Create User" msgstr "Δημιουργία χρήστη" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Διαγραφή χρήστη" @@ -8080,20 +8082,20 @@ msgstr "O χρήστης %(username)s ενημερώθηκε." msgid "Edit User" msgstr "Επεξεργασία χρήστη" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Ο χρήστης {user} διαγράφηκε." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Η διαγραφή του χρήστη LDAP απέτυχε." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Αλλαγή κωδικού πρόσβασης" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Ο κωδικός πρόσβασης άλλαξε με επιτυχία." @@ -8584,23 +8586,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Γενικός" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Σφάλμα κατά την εγκατάσταση" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Εγκαθίσταται" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "Λήψη" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "Αλλαγή μέσου" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "αρχείο ρυθμίσεων: {file}" @@ -8960,24 +8962,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Εγκατάσταση" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Εκτελείται διαδικασία πριν από την εγκατάσταση" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Εκτέλεση διαδικασία μετά την εγκατάσταση" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Εγκατάσταση του %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "ολοκληρώθηκε το %(percentage)s%%" @@ -8986,6 +8995,9 @@ msgstr "ολοκληρώθηκε το %(percentage)s%%" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Δεν είναι δυνατή η διαγραφή του μοναδικού διαχειριστή στο σύστημα." + #~ msgid "Past Vulnerabilities" #~ msgstr "Προηγούμενα θέματα ασφαλείας" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index c8a92a329..8f0d26a02 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-03-12 13:03+0000\n" "Last-Translator: Fioddor Superconcentrado \n" "Language-Team: Spanish username@%(domainname)s. Puede configurar su dominio " "en la página de sistema Configurar." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Servidor de Chat" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2247,7 +2253,7 @@ msgstr "Nueva copia de seguridad" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Actualización" @@ -2365,13 +2371,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Activar daño" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7618,15 +7624,15 @@ msgstr "Actualización automática de distibución activada" msgid "Distribution upgrade disabled" msgstr "Actualización automática de distibución desactivada" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Proceso de actualización iniciado." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "No se ha podido iniciar la actualización." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Las actualizaciones funcionales frecuentes están activadas." @@ -7666,33 +7672,33 @@ msgstr "Acceso a todos los servicios y configuraciones del sistema" msgid "Check LDAP entry \"{search_item}\"" msgstr "Comprobar la entrada LDAP \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "El nombre de usuaria/o está en uso o reservado." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Indique un nombre de usuario válido." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "Obligatorio. Hasta 150 caracteres. Solo letras, números y @/./-/_ ." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Contraseña de autorización" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" "Introduce tu contraseña actual para autorizar modificaciones en la cuenta." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Contraseña no válida." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7707,21 +7713,21 @@ msgstr "" "servicios, también podrán acceder al sistema por SSH con privilegios de " "administración (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Ha fallado la creación de usuaria/o LDAP: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Ha fallado añadir usuaria/o nuevo al grupo {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Claves de SSH autorizadas" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7731,45 +7737,41 @@ msgstr "" "de una clave. Puede introducir más de una clave, cada una en una línea. Las " "líneas en blanco y las que empiecen por # se ignorarán." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Ha fallado renombrar al o la usuaria LDAP." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Ha fallado la eliminación del o de la usuaria del grupo." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Ha fallado añadir al o la usuaria al grupo." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "No es posible configurar las claves SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Ha fallado al cambiar el estado del usuario." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "No se puede eliminar la única cuenta de administración del sistema." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Ha fallado cambiar la clave del o de la usuaria LDAP." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Ha fallado añadir usuaria/o nueva/o al grupo admin: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Falló al restringir el acceso a la consola: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Creada cuenta de usuaria/o, ya está usted en el sistema" @@ -7791,7 +7793,7 @@ msgid "Create User" msgstr "Crear usuaria/o" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Eliminar usuaria/o" @@ -7894,20 +7896,20 @@ msgstr "El o la usuaria %(username)s se ha actualizado." msgid "Edit User" msgstr "Editar usuario" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "El o la usuaria {user} se ha eliminado." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Ha fallado la eliminación del o de la usuaria LDAP." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Cambiar clave de acceso" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Clave de acceso cambiada con éxito." @@ -8375,23 +8377,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Genérica" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Error durante la instalación" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "instalando" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "descargando" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "cambio de medio" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "archivo de configuración: {file}" @@ -8725,24 +8727,31 @@ msgstr "Esta aplicación no está disponible actualmente en su distribución." msgid "Check again" msgstr "Volver a coomprobar" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Instalar" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Realizando operaciones previas a la instalación" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Realizando operaciones posteriores a la instalación" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Instalando %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% completado" @@ -8751,6 +8760,9 @@ msgstr "%(percentage)s%% completado" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "No se puede eliminar la única cuenta de administración del sistema." + #~ msgid "Past Vulnerabilities" #~ msgstr "Vulnerabilidades Anteriores" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index b29962b34..930c96263 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-07 11:34+0000\n" "Last-Translator: Seyed mohammad ali Hosseinifard \n" "Language-Team: Persian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "سرور وب" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2212,7 +2218,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2328,13 +2334,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enabled" msgid "Enabled aliases" msgstr "فعال" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7270,15 +7276,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "برنامه نصب شد." -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7310,38 +7316,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "نام کاربری معتبر نیست" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "حساب مدیر" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "رمز را نشان بده" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7350,72 +7356,68 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "ساختن کاربر LDAP شکست خورد." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to {group} group: {error}" msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "افزودن کاربر به گروه مدیران شکست خورد." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to obtain certificate for domain {domain}: {error}" msgid "Failed to restrict console access: {error}" msgstr "گرفتن گواهی برای دامنهٔ {domain} شکست خورد: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "حساب کاربری ساخته شد، شما الان وارد سیستم هستید" @@ -7437,7 +7439,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7538,20 +7540,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -8018,23 +8020,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -8343,24 +8345,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 25d60e5be..1235a4e6d 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers USERNAME@%(domainname)s. YOU CAN SETUP YOUR DOMAIN ON THE SYSTEM " "CONFIGURE PAGE." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "WEB SERVER" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2341,7 +2347,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 #, fuzzy #| msgid "Update URL" msgid "Update" @@ -2463,13 +2469,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable PageKite" msgid "Enabled aliases" msgstr "ENABLE PAGEKITE" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7774,15 +7780,15 @@ msgstr "AUTOMATIC UPGRADES ENABLED" msgid "Distribution upgrade disabled" msgstr "AUTOMATIC UPGRADES DISABLED" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "UPGRADE PROCESS STARTED." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "STARTING UPGRADE FAILED." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7814,38 +7820,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "CHECK LDAP ENTRY \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "INVALID SERVER NAME" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "ADMINISTRATOR ACCOUNT" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "SHOW PASSWORD" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7866,23 +7872,23 @@ msgstr "" "ABLE TO LOG IN TO ALL SERVICES. THEY CAN ALSO LOG IN TO THE SYSTEM THROUGH " "SSH AND HAVE ADMINISTRATIVE PRIVILEGES (SUDO)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "CREATING LDAP USER FAILED." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "FAILED TO ADD NEW USER TO {group} GROUP." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7892,49 +7898,45 @@ msgstr "" "SYSTEM WITHOUT USING A PASSWORD. YOU MAY ENTER MULTIPLE KEYS, ONE ON EACH " "LINE. BLANK LINES AND LINES STARTING WITH # WILL BE IGNORED." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "RENAMING LDAP USER FAILED." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "FAILED TO REMOVE USER FROM GROUP." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "FAILED TO ADD USER TO GROUP." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "FAILED TO ADD USER TO GROUP." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "CHANGING LDAP USER PASSWORD FAILED." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "FAILED TO ADD NEW USER TO ADMIN GROUP." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to obtain certificate for domain {domain}: {error}" msgid "Failed to restrict console access: {error}" msgstr "FAILED TO OBTAIN CERTIFICATE FOR DOMAIN {domain}: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "USER ACCOUNT CREATED, YOU ARE NOW LOGGED IN" @@ -7956,7 +7958,7 @@ msgid "Create User" msgstr "CREATE USER" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "DELETE USER" @@ -8058,20 +8060,20 @@ msgstr "USER %(username)s UPDATED." msgid "Edit User" msgstr "EDIT USER" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "USER {user} DELETED." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "DELETING LDAP USER FAILED." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "CHANGE PASSWORD" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "PASSWORD CHANGED SUCCESSFULLY." @@ -8550,27 +8552,27 @@ msgstr "PPPOE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 #, fuzzy #| msgid "Installation" msgid "installing" msgstr "INSTALLATION" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "SETTING UNCHANGED" -#: plinth/package.py:164 +#: plinth/package.py:167 #, fuzzy, python-brace-format #| msgid "Configuration" msgid "configuration file: {file}" @@ -8916,24 +8918,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "INSTALL" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "INSTALLING %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% COMPLETE" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index ca52b76f4..550e3f8e7 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-31 22:13+0000\n" "Last-Translator: Coucouf \n" "Language-Team: French Configurer." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Serveur de discussion" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2278,7 +2284,7 @@ msgstr "Nouvelle sauvegarde" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Mises à jour" @@ -2396,13 +2402,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Activer les blessures" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7778,15 +7784,15 @@ msgstr "Mise à niveau de la distribution activée" msgid "Distribution upgrade disabled" msgstr "Mise à niveau de la distribution désactivée" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Mise à jour lancée." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Le lancement de la mise à niveau a échoué." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Mise à jour régulière des fonctionnalités activée." @@ -7826,36 +7832,36 @@ msgstr "Accès à tous les services et à la configuration du système" msgid "Check LDAP entry \"{search_item}\"" msgstr "Vérification de l’entrée LDAP « {search_item} »" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Le nom d'utilisateur est déjà pris ou est réservé." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Entrez un nom d’utilisateur valide." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Requis. 150 caractères ou moins. Lettres anglaises, chiffres et @/./-/_ " "uniquement." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Mot de passe actuel" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" "Veuillez saisir votre mot de passe actuel pour confirmer ces modifications " "de compte." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Mot de passe incorrect." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7870,21 +7876,21 @@ msgstr "" "peuvent également se connecter au système avec Secure Shell (SSH) et obtenir " "les privilèges de superutilisateur (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "La création de l’utilisateur LDAP a échoué : {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "L’ajout du nouvel utilisateur au groupe {group} a échoué : {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Clés SSH autorisées" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7895,46 +7901,42 @@ msgstr "" "plusieurs clefs, une sur chaque ligne. Les lignes vides et celles commençant " "par # sont ignorées." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Le changement du nom de l’utilisateur LDAP a échoué." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Échec du retrait de l’utilisateur du groupe." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Échec de l’ajout de l’utilisateur au groupe." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Échec du paramétrage des clefs SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Échec du changement de statut de l’utilisateur." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Impossible de supprimer le seul administrateur de ce système." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Le changement du mot de passe de l’utilisateur LDAP a échoué." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "L’ajout du nouvel utilisateur au groupe admin a échoué : {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" "La mise en place des restrictions d’accès à la console à échoué : {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Compte utilisateur créé, vous êtes maintenant connecté" @@ -7956,7 +7958,7 @@ msgid "Create User" msgstr "Créer un utilisateur" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Supprimer Utilisateur" @@ -8061,20 +8063,20 @@ msgstr "Utilisateur %(username)s mis à jour." msgid "Edit User" msgstr "Modification de l’utilisateur" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Utilisateur {user} supprimé." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "La suppression de l’utilisateur LDAP a échoué." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Changer Mot de Passe" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Le mot de passe a été changé." @@ -8551,23 +8553,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Générique" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Erreur pendant l’installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "installation en cours" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "téléchargement en cours" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "changement de support" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "fichier de configuration : {file}" @@ -8907,24 +8909,31 @@ msgstr "" msgid "Check again" msgstr "Vérifier à nouveau" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Préinstallation en cours" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Postinstallation en cours" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installation de %(package_names)s : %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% effectué" @@ -8933,6 +8942,9 @@ msgstr "%(percentage)s%% effectué" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Impossible de supprimer le seul administrateur de ce système." + #~ msgid "Past Vulnerabilities" #~ msgstr "Anciennes failles" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 8327bd88f..ba72258fd 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Galician Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "Servidor web" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1986,7 +1992,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2090,11 +2096,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6619,15 +6625,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6659,32 +6665,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6693,66 +6699,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6774,7 +6776,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6867,20 +6869,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7301,23 +7303,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7617,24 +7619,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 319e38622..713c33efc 100644 --- a/plinth/locale/gu/LC_MESSAGES/django.po +++ b/plinth/locale/gu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati username@%(domainname)s. તમે સિસ્ટમ પર તમારા ડોમેન સેટ કરી શકો છો રૂપરેખાંકિત કરો પાનું." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "ચેટ સર્વર" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2164,7 +2170,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2276,13 +2282,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enabled" msgid "Enabled aliases" msgstr "સક્ષમ કરેલું" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -6905,15 +6911,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "વપરાશકર્તા રજીસ્ટ્રેશન અક્ષમ છે" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6945,36 +6951,36 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "અમાન્ય સર્વર નામ" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "પાસવર્ડ બતાવો" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6983,66 +6989,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7064,7 +7066,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7157,20 +7159,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7615,23 +7617,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7946,24 +7948,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index d0214c508..b1c64ff6c 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hindi username@%(domainname)s. आपका डोमेन सिसटेम पर सेटअप कर सकता है कॉन्फ़िगर पेजॅ." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "चाट सर्वर" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2265,7 +2271,7 @@ msgstr "बैकअप" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "अपडेट" @@ -2383,13 +2389,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "क्षति को सक्षम करें" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7596,15 +7602,15 @@ msgstr "ऑटोमेटिक अपग्रेडस सक्षम कि msgid "Distribution upgrade disabled" msgstr "ऑटोमेटिक अपग्रेडस अक्षम किया गया" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "अपग्रेड प्रक्रिया शुरू हुई." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "अपग्रेड प्रारंभ करना विफल रहा." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7636,38 +7642,38 @@ msgstr "सब सर्विसस और सिस्टम सेटिं msgid "Check LDAP entry \"{search_item}\"" msgstr "एलडीएपी प्रविष्टि चेक करें \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "यूसरनाम लिया है या आरक्षित है." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "सर्वर नाम अमान्य है" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "व्यवस्थापक पासवर्ड" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "शो पासवर्ड" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7687,23 +7693,23 @@ msgstr "" "

एडमिन ग्रुप के यूसरस सब सर्विसस पर लॉग इन कर सकेगें. SSH के माध्यम से भी " "सिस्टम पर लॉग इन कर सकते है अाैर उनको प्रशासनिक विशेषाधिकार (sudo) है." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "एलडीएपी यूसर बनाना विफल रहा." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "{group} समूह में नया यूसर जोड़ने में विफल." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7713,49 +7719,45 @@ msgstr "" "बिना सिस्टम में प्रवेश करने की अनुमति देगा. आप एकाधिक कीज़ दर्ज कर सकते हैं, हर लाइन रक " "एक. खाली लाइनस या # से प्रारंभ होने वाले लाइनस अनदेखा कर दिया जाएगा." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "एलडीएपी यूसर का नाम बदलना विफल रहा." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "समूह से यूसर को हटाने में विफल." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "समूह से यूसर को जोड़ने में विफल." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "एसएसएच कीज़ सेट करने में असमर्थ." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "समूह से यूसर को जोड़ने में विफल." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "सिस्टम में केवल व्यवस्थापक को नहीं हटा सकता." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "एलडीएपी यूसर का पासवर्ड बदलना विफल रहा." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "व्यवस्थापक समूह में नया यूसर जोड़ने में विफल." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "कंसोल एक्सेस प्रतिबंधित करने में विफल." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "युसर अकाउंट बनाया, अब आप लॉगड इन हैं" @@ -7777,7 +7779,7 @@ msgid "Create User" msgstr "यूसर बनाये" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "यूसर हटाइये" @@ -7880,20 +7882,20 @@ msgstr "युसर %(username)s अपडेट किया." msgid "Edit User" msgstr "यूसर संपादित करें" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "यूसर {user} हटाया." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "एलडीएपी यूसरको हटाने में असफल रहा." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "पासवर्ड बदलिये" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "पासवर्ड सफलतापूर्वक बदल गया." @@ -8379,23 +8381,23 @@ msgstr "पीपीपीअोइ" msgid "Generic" msgstr "जेनेरिक" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "इंस्टालेशन करते समय पर त्रुटि" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "इंस्टॉलिंग" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "डाउनलोडिंग" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "मीडिया बदलाव" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "कॉंफ़िगरेशन फ़ाइल: {file}" @@ -8735,24 +8737,31 @@ msgstr "यह एप्लिकेशन अभी अापका वित msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "इंस्टॉल करें" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "प्री-इंस्टॉलेशन ऑपरेशन कर रहा है" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "पोस्ट-इंस्टॉलेशन ऑपरेशन कर रहा है" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s:%(status)s इंस्टॉलेशन किया" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% पूर्ण" @@ -8761,6 +8770,9 @@ msgstr "%(percentage)s%% पूर्ण" msgid "Gujarati" msgstr "" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "सिस्टम में केवल व्यवस्थापक को नहीं हटा सकता." + #~ msgid "Message Archive Management enabled" #~ msgstr "संदेश संग्रह प्रबंधन सक्षम किया गया है" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 6d32b806c..0fc17ec53 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-22 21:32+0000\n" "Last-Translator: Benedek Nagy \n" "Language-Team: Hungarian username@%(domainname)s. Beállíthatod a " "rendszered domain nevét a Beállítások lapon." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Chat szerver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2245,7 +2251,7 @@ msgstr "Új biztonsági másolat" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Frissítés" @@ -2363,13 +2369,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Sérülés engedélyezése" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7534,15 +7540,15 @@ msgstr "Disztribúció frissítés engedélyezve" msgid "Distribution upgrade disabled" msgstr "Disztribúció frissítés letiltva" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "A frissítési folyamat elkezdődött." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "A frissítést nem sikerült elindítani." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7574,32 +7580,32 @@ msgstr "Hozzáférés az összes szolgáltatáshoz és rendszerbeállításhoz" msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP bejegyzés ellenőrzése: \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "A felhasználói név (már) foglalt." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Adjon meg egy érvényes felhasználónevet." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Hitelesítési jelszó" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Érvénytelen jelszó." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7615,21 +7621,21 @@ msgstr "" "képesek bejelentkezni a rendszerbe, ahol adminisztrátori jogosultságokkal " "rendelkeznek (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP felhasználó létrehozása sikertelen: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Az új felhasználó hozzáadása {group} csoporthoz nem sikerült: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Engedélyezett SSH kulcsok" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7639,47 +7645,43 @@ msgstr "" "jelszó nélkül jelentkezzen be. Több kulcs is megadható; soronként egy. Az " "üres, illetve # jellel kezdődő sorok nem számítanak." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "LDAP felhasználó átnevezése sikertelen." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Nem sikerült eltávolítani a felhasználót a csoportból." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Nem sikerült hozzáadni a felhasználót a csoporthoz." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH kulcsok beállítása sikertelen." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Nem sikerült a felhasználói állapot megváltoztatása." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Nem lehet törölni a rendszer egyetlen rendszergazdáját." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "LDAP felhasználó jelszavának megváltoztatása sikertelen." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Nem sikerült hozzáadni az új felhasználót a rendszergazdai csoporthoz: " "{error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Nem sikerült a konzol hozzáférés korlátozása: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Felhasználói fiók létrehozva, bejelentkezés sikeres" @@ -7701,7 +7703,7 @@ msgid "Create User" msgstr "Felhasználó létrehozása" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Felhasználó törlése" @@ -7800,20 +7802,20 @@ msgstr "%(username)s nevű felhasználó frissítve." msgid "Edit User" msgstr "Felhasználó szerkesztése" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "{user} nevű felhasználó törölve." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "LDAP felhasználó törlése sikertelen." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Jelszómódosítás" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "A jelszó módosítása sikeres." @@ -8240,23 +8242,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Általános" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Hiba lépett fel a telepítés során" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "telepítés" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "letöltés" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "adathordozó csere" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurációs fájl: {file}" @@ -8588,24 +8590,31 @@ msgstr "Ez az alkalmazás jelenleg nem hozzáférhető ebben a disztribúcióban msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Telepítés" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Telepítés előtti műveletek végrehajtása" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Telepítés utáni műveletek végrehajtása" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s telepítése: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "befejezettségi szint: %(percentage)s%%" @@ -8614,6 +8623,9 @@ msgstr "befejezettségi szint: %(percentage)s%%" msgid "Gujarati" msgstr "Gudzsaráti" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Nem lehet törölni a rendszer egyetlen rendszergazdáját." + #~ msgid "Past Vulnerabilities" #~ msgstr "Múltbéli biztonsági rések" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 4e00d36b7..1def9b229 100644 --- a/plinth/locale/id/LC_MESSAGES/django.po +++ b/plinth/locale/id/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Indonesian (FreedomBox)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-06-24 00:42+0000\n" "Last-Translator: Reza Almanda \n" "Language-Team: Indonesian nama pengguna @%(domainname)s. Anda dapat mengatur " "domain Anda pada sistem Konfigurasi halaman." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Server obrolan" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2214,7 +2220,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Memperbarui" @@ -2330,13 +2336,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Aktifkan kerusakan" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7051,15 +7057,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "Pembaruan distribusi dinonaktifkan" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7091,34 +7097,34 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Masukkan sebuah nama pengguna yang valid." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "Akun Administrator" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Kata sandi tidak valid." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7127,68 +7133,64 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Gagal membuat pengguna LDAP. {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Gagal menambahkan pengguna baru ke kelompok {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "Gagal menambahkan pengguna baru ke kelompok admin." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Gagal menambahkan pengguna baru ke kelompok admin. {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7210,7 +7212,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7305,20 +7307,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Insan {user} dipangkar." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7761,23 +7763,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Galat saat pemasangan" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "memasang" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "mengunduh" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -8086,24 +8088,31 @@ msgstr "Aplikasi ini belum tersedia dalam distribusi Anda." msgid "Check again" msgstr "Periksa kembali" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Pasang" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Melakukan operasi pra-pemasangan" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Melakukan operasi pasca pemasangan" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Memasang %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% selesai" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 8a6294b71..d190cea7c 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-21 20:38+0000\n" "Last-Translator: Dietmar \n" "Language-Team: Italian . Configura " "la pagina ." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "Server e-mail" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2189,7 +2195,7 @@ msgstr "Nuovo valore" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2291,11 +2297,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Alias abilitati" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Alias disabilitati" @@ -7193,15 +7199,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7233,32 +7239,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Inserisci un nome utente valido." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Password di autorizzazione" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Password non valida." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7267,66 +7273,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Fallito l'inserimento di un nuovo utente nel gruppo {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Aggiunta del nuovo utente al gruppo admin fallita: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Fallito la limitazione dell'accesso alla console: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7348,7 +7350,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7441,20 +7443,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7873,23 +7875,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -8197,24 +8199,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% completata" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 93c32f10c..4f6890e89 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-20 12:32+0000\n" "Last-Translator: Jacque Fresco \n" "Language-Team: Japanese Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1980,7 +1986,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2082,11 +2088,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6589,15 +6595,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6629,32 +6635,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6663,66 +6669,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6744,7 +6746,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6837,20 +6839,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7269,23 +7271,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7585,24 +7587,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index 2a50336ba..543179373 100644 --- a/plinth/locale/kn/LC_MESSAGES/django.po +++ b/plinth/locale/kn/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1980,7 +1986,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2082,11 +2088,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6591,15 +6597,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6631,32 +6637,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6665,66 +6671,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6746,7 +6748,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6839,20 +6841,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7271,23 +7273,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7587,24 +7589,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index 97c69ce33..372a70dbc 100644 --- a/plinth/locale/lt/LC_MESSAGES/django.po +++ b/plinth/locale/lt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-02-22 10:50+0000\n" "Last-Translator: Kornelijus Tvarijanavičius \n" "Language-Team: Lithuanian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1981,7 +1987,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2083,11 +2089,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6590,15 +6596,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6630,32 +6636,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6664,66 +6670,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6745,7 +6747,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6838,20 +6840,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7270,23 +7272,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7586,24 +7588,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 6a6e83827..5733a18e8 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-08-19 13:51+0000\n" "Last-Translator: Petter Reinholdtsen \n" "Language-Team: Norwegian Bokmål username@%(domainname)s. Du kan sette opp ditt domene på " "systemsiden Configure ." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Nettprat-tjener" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2248,7 +2254,7 @@ msgstr "Ny sikkerhetskopi" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Oppdater" @@ -2366,13 +2372,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Aktiver skade" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7683,15 +7689,15 @@ msgstr "Automatiske oppgraderinger aktivert" msgid "Distribution upgrade disabled" msgstr "Automatiske oppgraderinger avslått (deaktivert)" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Oppgraderingsprosessen (upgrade process) har startet." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Å starte oppgradering (upgrade) mislyktes." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7730,39 +7736,39 @@ msgstr "Tilgang til alle tjenester og systeminnstillinger" msgid "Check LDAP entry \"{search_item}\"" msgstr "Sjekk LDAP-oppføring «{search_item}»" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Brukernavnet er opptatt eller reservert." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Ugyldig tjenernavn" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Påkrevd. 150 tegn eller mindre. Kun engelske bokstaver, tall og @/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "Administratorpassord" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Vis passord" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7783,21 +7789,21 @@ msgstr "" "gruppen kan logge seg på alle tjenester. De kan også logge inn på systemet " "via SSH, og ha administrative rettigheter (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Oppretting av LDAP-bruker mislyktes: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Klarte ikke å legge ny bruker til i {group}-gruppen: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Autoriserte SSH-nøkler" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7807,47 +7813,43 @@ msgstr "" "på systemet uten å bruke passord. Du kan legge inn multiple (flere) nøkler, " "én på hver linje. Blanke linjer og linjer som starter med # vil bli ignorert." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Klarte ikke å bytte navn på LDAP-bruker." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Klarte ikke å slette bruker fra gruppe." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Klarte ikke legge bruker til gruppe." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Klarte ikke sette SSH-nøkler." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "Klarte ikke legge bruker til gruppe." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Kan ikke å slette kun administratoren i systemet." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Klarte ikke å bytte passord for LDAP-bruker." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Klarte ikke å legge til en ny bruker i admin-gruppen: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Klarte ikke å begrense konsolltilgang: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Brukerkonto er opprettet, du er nå logget inn" @@ -7869,7 +7871,7 @@ msgid "Create User" msgstr "Opprett bruker" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Slett bruker" @@ -7969,20 +7971,20 @@ msgstr "Bruker %(username)s oppdatert." msgid "Edit User" msgstr "Rediger bruker" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Bruker {user} slettet." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Klarte ikke slette LDAP-bruker." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Endre passord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Vellykket passordbytte." @@ -8474,23 +8476,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Generisk" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Feil under installasjon" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "installering" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "laster ned" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "mediaendring" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "oppsettsfil: {file}" @@ -8831,24 +8833,31 @@ msgstr "Dette programmet er for tiden ikke tilgjengelig for din distribusjon." msgid "Check again" msgstr "Sjekk på nytt" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Utfører en forhåndsinstallasjon" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Utfører en etterinstallasjon" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installere %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% fullført" @@ -8857,6 +8866,9 @@ msgstr "%(percentage)s%% fullført" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Kan ikke å slette kun administratoren i systemet." + #, fuzzy #~| msgid "Show security vulnerabilities" #~ msgid "Past Vulnerabilities" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 90ef00bfa..23400b7b8 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-18 13:33+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch username@%(domainname)s. Het domein kan worden ingesteld op " "de Instellingen pagina." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-mailserver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Maakt gebruik van Postfix, Dovecot & Rspamd" @@ -2219,7 +2225,7 @@ msgstr "Nieuwe waarde" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Update" @@ -2321,11 +2327,11 @@ msgstr "Interne fout in {0}" msgid "Check syslog for more information" msgstr "Controleer syslog voor meer informatie" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Aktieve aliassen" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Inactieve aliassen" @@ -7605,15 +7611,15 @@ msgstr "Distributie bijwerken ingeschakeld" msgid "Distribution upgrade disabled" msgstr "Distributie bijwerken uitgeschakeld" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Upgrade-proces gestart." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Starten van de upgrade is mislukt." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Tussentijdse Software Updates zijn ingeschakeld." @@ -7653,32 +7659,32 @@ msgstr "Toegang tot alle diensten en systeeminstellingen" msgid "Check LDAP entry \"{search_item}\"" msgstr "Zoek LDAP item \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Gebruikersnaam is in gebruik of is gereserveerd." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Voer een geldige gebruikersnaam in." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "Vereist. 150 tekens of minder. Alleen letters, cijfers en @/./-/_ ." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Authorisatie-wachtwoord" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Voer je huidige wachtwoord in om accountwijzigingen toe te staan." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Ongeldig wachtwoord." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7693,21 +7699,21 @@ msgstr "" "ook op het systeem inloggen met SSH en kunnen systeemadministratie doen " "(sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP gebruiker aanmaken mislukt: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Toevoegen van gebruiker aan groep {group} mislukt: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Geautoriseerde SSH-sleutels" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7718,45 +7724,41 @@ msgstr "" "meerdere sleutels toevoegen, één op elke regel. Lege regels en regels die " "beginnen met # worden genegeerd." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "LDAP gebruiker hernoemen mislukt." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Gebruiker uit groep verwijderen mislukt." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Gebruiker aan groep toevoegen mislukt." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Kan de SSH-sleutels niet instellen." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Gebruikerstatus aanpassen mislukt." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Kan de enige beheerder in het systeem niet verwijderen." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Wijzigen LDAP gebruikerswachtwoord mislukt." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Toevoegen van gebruiker aan admin groep mislukt: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Consoletoegang beperken is mislukt: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Gebruikersaccount aangemaakt, je bent nu ingelogd" @@ -7778,7 +7780,7 @@ msgid "Create User" msgstr "Nieuwe gebruiker registreren" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Gebruiker verwijderen" @@ -7881,20 +7883,20 @@ msgstr "Gebruiker %(username)s bijgewerkt." msgid "Edit User" msgstr "Gebruiker wijzigen" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Gebruiker {user} verwijderd." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Verwijderen van LDAP gebruiker mislukt." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Wijzig wachtwoord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Wachtwoord succesvol gewijzigd." @@ -8367,23 +8369,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Generiek" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fout tijdens installatie" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "installeren" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "downloaden" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "media wijzigen" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "configuratiebestand: {file}" @@ -8718,24 +8720,31 @@ msgstr "Deze toepassing is momenteel niet beschikbaar in jouw distributie." msgid "Check again" msgstr "Controleer opnieuw" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installeer" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Pre-Install bewerkingen worden uitvoerd" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Post-install bewerkingen worden uitgevoerd" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installeren van %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% voltooid" @@ -8744,6 +8753,9 @@ msgstr "%(percentage)s%% voltooid" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Kan de enige beheerder in het systeem niet verwijderen." + #~ msgid "Past Vulnerabilities" #~ msgstr "Kwetsbaarheden in het verleden" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index f62764e87..5e165d0a1 100644 --- a/plinth/locale/pl/LC_MESSAGES/django.po +++ b/plinth/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-03-03 16:50+0000\n" "Last-Translator: Karol Werner \n" "Language-Team: Polish . Możesz ustawić swoją domenę na stronie Konfiguruj." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Serwer czatu" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2194,7 +2200,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2310,13 +2316,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Włącz zniszczenia" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7049,15 +7055,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "Rejestracja użytkowników wyłączona" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7089,38 +7095,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "Niewłaściwa nazwa użytkownika" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "Konto Administratora" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "Pokaż hasło" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7129,68 +7135,64 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Tworzenie użytkownika LDAP nie udało się: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Nieudane dodanie użytkownika do {group} grupy:{error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add new user to admin group." msgid "Failed to change user status." msgstr "Nieudane dodawanie użytkownika do grupy admin." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Nieudane dodawanie użytkownika do grupy admin: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Utworzono konto użytkownika, możesz się teraz zalogować" @@ -7212,7 +7214,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7310,20 +7312,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7794,23 +7796,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "plik konfiguracyjny: {file}" @@ -8159,24 +8161,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index 87b608372..52f4822dc 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-08 22:33+0000\n" "Last-Translator: ssantos \n" "Language-Team: Portuguese Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "Servidor Web" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2091,7 +2097,7 @@ msgstr "Novo Backup" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2203,13 +2209,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Applications" msgid "Enabled aliases" msgstr "Aplicações" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6896,15 +6902,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "Aplicações" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6936,36 +6942,36 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid domain name" msgid "Enter a valid username." msgstr "Nome de domínio inválido" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Upload Password" msgid "Invalid password." msgstr "Palavra-passe de Envio" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6974,66 +6980,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7055,7 +7057,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7149,20 +7151,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7617,25 +7619,25 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 #, fuzzy #| msgid "Setting unchanged" msgid "media change" msgstr "Definição inalterada" -#: plinth/package.py:164 +#: plinth/package.py:167 #, fuzzy, python-brace-format #| msgid "Configuration" msgid "configuration file: {file}" @@ -7942,24 +7944,31 @@ msgstr "Atualmente, esta aplicação não está disponível na sua distribuiçã msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Instalar" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "A executar a operação de pré-instalação" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "A executar a operação de pós-Instalação" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "A instalar %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% concluída" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index bd732ef93..a3490f4b0 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-10 07:34+0000\n" "Last-Translator: Artem \n" "Language-Team: Russian username@%(domainname)s. Вы можете " "настроить ваш домен на странице Настройка." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Чат-сервер" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2231,7 +2237,7 @@ msgstr "Резервные копии" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Обновление" @@ -2349,13 +2355,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Включить урон" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7652,15 +7658,15 @@ msgstr "Автоматические обновления включены" msgid "Distribution upgrade disabled" msgstr "Автоматические обновления отключены" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Начался процесс обновления." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Сбой при запуске обновления." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Активированы частые обновления функций." @@ -7701,33 +7707,33 @@ msgstr "Доступ ко всем сервисам и настройкам си msgid "Check LDAP entry \"{search_item}\"" msgstr "Проверьте запись LDAP \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Имя пользователя уже занято." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Введите действительное имя пользователя." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Требуется. 150 символов или меньше. Только английские буквы, цифры и @/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Пароль авторизации" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Введите свой текущий пароль, чтобы разрешить изменение учетной записи." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Неправильный пароль." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7741,21 +7747,21 @@ msgstr "" "Пользователи в группе администратора имеют доступ ко всем службам. Они также " "могут войти в систему через SSH и иметь административные привилегии (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не удалось создать пользователя LDAP: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Не удалось добавить нового пользователя в группу {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Авторизованные SSH ключи" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7766,46 +7772,42 @@ msgstr "" "на каждой строке. Пустые строки и строки, начинающиеся с # будут " "игнорироваться." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Переименование пользователя LDAP не удалось." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Не удалось удалить пользователя из группы." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Не удалось добавить пользователя в группу." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Не удалось задать ключи SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Не удалось изменить статус пользователя." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Невозможно удалить единственного администратора в системе." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Изменение LDAP пароля пользователя не удалось." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Не удалось добавить нового пользователя в группу администраторов: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Не удалось ограничить доступ к консоли: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Учетная запись пользователя создана, теперь вы вошли" @@ -7827,7 +7829,7 @@ msgid "Create User" msgstr "Создать пользователя" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Удаление пользователя" @@ -7930,20 +7932,20 @@ msgstr "Пользователь %(username)s обновлен." msgid "Edit User" msgstr "Редактирование пользователя" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Пользователь {user} удален." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Сбой при удалении LDAP пользователя." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Изменить пароль" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Пароль успешно изменён." @@ -8398,23 +8400,23 @@ msgstr "PPPоE" msgid "Generic" msgstr "Универсальный" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Ошибка во время установки" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Установка" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "Загрузка" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "изменение медиа" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "Файл настроек: {file}" @@ -8750,24 +8752,31 @@ msgstr "Это приложение в настоящее время недос msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Установка" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Выполнение операции предварительной установки" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Выполнение операции после установки" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Установка %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% завершено" @@ -8776,6 +8785,9 @@ msgstr "%(percentage)s%% завершено" msgid "Gujarati" msgstr "Гуджарати" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Невозможно удалить единственного администратора в системе." + #~ msgid "Past Vulnerabilities" #~ msgstr "Прошлые уязвимости" diff --git a/plinth/locale/si/LC_MESSAGES/django.po b/plinth/locale/si/LC_MESSAGES/django.po index ba940985f..2af902dbf 100644 --- a/plinth/locale/si/LC_MESSAGES/django.po +++ b/plinth/locale/si/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: HelaBasa \n" "Language-Team: Sinhala Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1980,7 +1986,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2082,11 +2088,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6589,15 +6595,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6629,32 +6635,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6663,66 +6669,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6744,7 +6746,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6837,20 +6839,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7269,23 +7271,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7585,24 +7587,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index de73c2b74..f7da25c1c 100644 --- a/plinth/locale/sl/LC_MESSAGES/django.po +++ b/plinth/locale/sl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "Strežnik z imenom domene" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2134,7 +2140,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2242,11 +2248,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6821,15 +6827,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6861,36 +6867,36 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid hostname" msgid "Enter a valid username." msgstr "Neveljavno ime gostitelja" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Invalid hostname" msgid "Invalid password." msgstr "Neveljavno ime gostitelja" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6899,66 +6905,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6980,7 +6982,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7073,20 +7075,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7537,23 +7539,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7853,24 +7855,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sq/LC_MESSAGES/django.po b/plinth/locale/sq/LC_MESSAGES/django.po index 2ec17075c..174e44061 100644 --- a/plinth/locale/sq/LC_MESSAGES/django.po +++ b/plinth/locale/sq/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-06-07 12:34+0000\n" "Last-Translator: Besnik Bleta \n" "Language-Team: Albanian Formësoni e sistemit." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "Shërbyes Fjalosjesh" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2235,7 +2241,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Përditësoje" @@ -2351,13 +2357,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "Aktivizo dëmtim" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7530,15 +7536,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7570,32 +7576,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Jepni një emër përdoruesi të vlefshëm." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Fjalëkalim Autorizimi" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Fjalëkalim i pavlefshëm." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7604,66 +7610,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -7685,7 +7687,7 @@ msgid "Create User" msgstr "Krijoni Përdorues" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Fshi Përdorues" @@ -7778,20 +7780,20 @@ msgstr "" msgid "Edit User" msgstr "Përpunoni Përdorues" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Ndryshoni Fjalëkalimin" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Fjalëkalimi u ndryshua me sukses." @@ -8216,23 +8218,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Elementar" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Gabim gjatë instalimit" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "po instalohet" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "po shkarkohet" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "ndryshim media" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "kartelë formësimi: {file}" @@ -8532,24 +8534,31 @@ msgstr "Ky aplikacion aktualisht s’mund të kihet në shpërndarjen tuaj." msgid "Check again" msgstr "Rikontrollo" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Instaloje" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 92625dda8..94d3db14c 100644 --- a/plinth/locale/sr/LC_MESSAGES/django.po +++ b/plinth/locale/sr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "Domain Name Server" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2058,7 +2064,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2164,11 +2170,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6689,15 +6695,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6729,32 +6735,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6763,66 +6769,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6844,7 +6846,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6937,20 +6939,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7369,23 +7371,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7685,24 +7687,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index addee5164..ec2563f61 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-21 20:38+0000\n" "Last-Translator: Michael Breidenbach \n" "Language-Team: Swedish användarnamn@%(domainname)s. Du kan ställa in " "din domän på systemet Konfigurera sidan." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-postserver" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Drivs av Postfix, Dovecot och Rspamd" @@ -2205,7 +2211,7 @@ msgstr "Nytt värde" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Uppdatera" @@ -2307,11 +2313,11 @@ msgstr "Internt fel i {0}" msgid "Check syslog for more information" msgstr "Kontrollera syslog för mer information" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Aktiverade alias" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Inaktiverade alias" @@ -7540,15 +7546,15 @@ msgstr "Distributionsuppgradering aktiverad" msgid "Distribution upgrade disabled" msgstr "Distributionsuppgradering inaktiverad" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Uppgraderingsprocessen påbörjades." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Det gick inte att starta uppgraderingen." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Frekventa funktionsuppdateringar aktiverade." @@ -7587,34 +7593,34 @@ msgstr "Tillgång till alla tjänster och Systeminställningar" msgid "Check LDAP entry \"{search_item}\"" msgstr "Kontrollera LDAP-posten \"{search_item}\"" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Användarnamnet är upptaget eller är reserverade." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Ange ett giltigt användarnamn." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Krävs. 150 tecken eller färre. Engelska bokstäver, siffror och endast @/./-/" "_ ." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Auktoriseringslösenord" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Ange ditt nuvarande lösenord för att auktorisera kontomodifieringar." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Ogiltigt lösenord." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7628,21 +7634,21 @@ msgstr "" "administratörsgruppen kommer att kunna logga in på alla tjänster. De kan " "också logga in på systemet via SSH och har administratörsprivilegier (sudo)." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Det gick inte att skapa LDAP-användare: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Det gick inte att lägga till ny användare i gruppen {group} : {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Auktoriserade SSH-nycklar" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7652,46 +7658,42 @@ msgstr "" "systemet utan att använda ett lösenord. Du kan ange flera nycklar, en på " "varje rad. Tomma rader och rader som börjar med # kommer att ignoreras." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Det gick inte att byta namn på LDAP-användare." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Det gick inte att ta bort användare från gruppen." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Det gick inte att lägga till användare i gruppen." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Det går inte att ange SSH-nycklar." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Det gick inte att ändra användarstatus." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Det går inte att ta bort den enda administratören i systemet." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Det gick inte att ändra användarlösenordet för LDAP." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" "Det gick inte att lägga till ny användare i administratörsgruppen: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Det gick inte att begränsa konsolåtkomst: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Användarkonto skapat, du är nu inloggad" @@ -7713,7 +7715,7 @@ msgid "Create User" msgstr "Skapa användare" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Ta bort användare" @@ -7816,20 +7818,20 @@ msgstr "Användaren %(username)s har uppdaterats." msgid "Edit User" msgstr "Redigera användar" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Användare {user} borttagen." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Det gick inte att ta bort LDAP-användare." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Ändra lösenord" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Lösenordet har ändrats." @@ -8311,23 +8313,23 @@ msgstr "Pppoe" msgid "Generic" msgstr "Generiska" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Fel vid installation" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "Installera" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "ladda ner" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "Mediabyte" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "konfigurationsfil: {file}" @@ -8663,24 +8665,31 @@ msgstr "Denna ansökan är för närvarande inte tillgänglig i din distribution msgid "Check again" msgstr "Kontrollera igen" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Installera" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Utföra för installationsåtgärd" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Utföra åtgärder efter installationen" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Installerar %(package_names)s:%(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% färdigt" @@ -8689,6 +8698,9 @@ msgstr "%(percentage)s %% färdigt" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Det går inte att ta bort den enda administratören i systemet." + #~ msgid "Past Vulnerabilities" #~ msgstr "Tidigare sårbarheter" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index 706ead7bd..8058d3824 100644 --- a/plinth/locale/ta/LC_MESSAGES/django.po +++ b/plinth/locale/ta/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,25 +51,25 @@ msgstr "" msgid "Cannot connect to {host}:{port}" msgstr "" -#: plinth/forms.py:39 +#: plinth/forms.py:36 msgid "Select a domain name to be used with this application" msgstr "" -#: plinth/forms.py:41 +#: plinth/forms.py:38 msgid "" "Warning! The application may not work properly if domain name is changed " "later." msgstr "" -#: plinth/forms.py:49 +#: plinth/forms.py:46 msgid "Language" msgstr "" -#: plinth/forms.py:50 +#: plinth/forms.py:47 msgid "Language to use for presenting this web interface" msgstr "" -#: plinth/forms.py:57 +#: plinth/forms.py:54 msgid "Use the language preference set in the browser" msgstr "" @@ -751,7 +751,7 @@ msgstr "" #: plinth/modules/bepasty/forms.py:27 #: plinth/modules/bepasty/templates/bepasty.html:30 -#: plinth/modules/users/forms.py:103 plinth/modules/users/forms.py:227 +#: plinth/modules/users/forms.py:102 plinth/modules/users/forms.py:228 msgid "Permissions" msgstr "" @@ -1064,7 +1064,7 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:9 -#: plinth/modules/performance/manifest.py:33 +#: plinth/modules/performance/manifest.py:9 msgid "Cockpit" msgstr "" @@ -1618,7 +1618,7 @@ msgid "Use HTTP basic authentication" msgstr "" #: plinth/modules/dynamicdns/forms.py:103 plinth/modules/networks/forms.py:212 -#: plinth/modules/users/forms.py:69 +#: plinth/modules/users/forms.py:68 msgid "Username" msgstr "" @@ -1845,11 +1845,17 @@ msgid "" "Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -1979,7 +1985,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2081,11 +2087,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6588,15 +6594,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6628,32 +6634,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6662,66 +6668,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6743,7 +6745,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6836,20 +6838,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7268,23 +7270,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7584,24 +7586,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index ec5b2b01f..ea9d08ac0 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-05-17 18:31+0000\n" "Last-Translator: chilumula vamshi krishna \n" "Language-Team: Telugu kaanfigar పేజీలో సెటప్ చేయవచ్చు." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Chat Server" msgid "Email Server" msgstr "కబుర్ల సేవిక" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2214,7 +2220,7 @@ msgstr "బ్యాకప్స్" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "నవీకరణ" @@ -2332,12 +2338,12 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy msgid "Enabled aliases" msgstr "PageKite ప్రారంభించు" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7503,15 +7509,15 @@ msgstr "స్వయంచాలక నవీకరణలు ప్రారం msgid "Distribution upgrade disabled" msgstr "స్వయంచాలక నవీకరణలు నిలిపివేయబడ్డాయి" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "అప్గ్రేడ్ ప్రక్రియ ప్రారంభించబడింది." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "నవీకరణ ప్రారంభం విఫలమైంది." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7543,38 +7549,38 @@ msgstr "అన్ని సేవలకు మరియు సిస్టమ్ msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP నమోదు \"{search_item}\" తనిఖీ" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "యూజర్ పేరు తీసుకోబడింది లేదా రిజర్వ్ చేయబడింది." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "సేవిక పేరు చెలదు" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Password" msgid "Authorization Password" msgstr "నిర్వాహకుని రహస్యపదం" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "రహస్యపదం కనబర్చు" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7583,72 +7589,68 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "ఎల్.డి.ఏ.పి వాడుకరి సృష్టించడంలో విఫలమైంది." -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "వినియోగదారుని {group} సముహానికి జోడించడంలో విఫలం." -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "అధీకృత SSH కీలు" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "ఎల్.డి.ఏ.పి వాడుకరి పేరుమార్పులో విఫలం." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "సమూహంలోంచి వినియోగదారుని తొలగించడంలో విఫలం." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "సమూహంలోకి వినియోగదారుని జోడించడంలో విఫలం." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH కీలను సెట్ చేయడం సాధ్యం కాలేదు." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "సమూహంలోకి వినియోగదారుని జోడించడంలో విఫలం." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "సిస్టమ్‌లోని ఏకైక నిర్వాహకుడిని తొలగించలేరు." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "ఎల్.డి.ఏ.పి వాడుకరి పాస్‌వర్డ్ మార్పిడి విఫలం." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "కొత్త వాడుకరి ను అడ్మిన్ సమూహంలో జోడించడం విఫలమైనది." -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "console ప్రవేశమును పరిమితి చెయడంలొ విఫలమైంది." -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "వాడుకరి ఖాతా సృస్టించబడింది, మీరు లాగిన్ చేయబడ్డారు" @@ -7670,7 +7672,7 @@ msgid "Create User" msgstr "వినియోగదారుని సృష్టించు" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "వినియోగదారుని తొలగించు" @@ -7772,20 +7774,20 @@ msgstr "వినియోగదారి %(username)s నావీకరిం msgid "Edit User" msgstr "వినియోగదారి మార్పు" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "వినియోగదారి {user} తొలగించబడ్డాడు." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "ఎల్.డి.ఏ.పి వినియోగదారి తొలగింపు విఫలం." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "పాస్‌వర్డ్ మార్చు" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "పాస్‌వర్డ్ విజయవంతంగా మార్చబడినది." @@ -8263,23 +8265,23 @@ msgstr "పిపిపిఒఇ" msgid "Generic" msgstr "సాధారణమైన" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "సంస్థాపన ఒక పొరపాటు జరిగింది" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "వ్యవస్థాపిస్తోంది" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "దిగుమతి అవుతోంది" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "ప్రసార మాధ్యమం మార్పు" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "ఆకృతీకరణ ఫైలు: {file}" @@ -8616,24 +8618,31 @@ msgstr "ప్రస్తుతం ఈ అనువర్తనం మీ ప msgid "Check again" msgstr "మళ్ళీ ప్రయత్నించు" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "నిక్షిప్తం చేయు" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "ప్రీ-ఇన్‌స్టాల్ ఆపరేషన్ జరుగుతోంది" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "ఇన్స్తల్ల్ తర్వాత ప్రక్రియ జరుగుతోంది" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "%(package_names)s నిక్షిప్తం అవుతోంది: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s %% పూర్తి" @@ -8642,6 +8651,9 @@ msgstr "%(percentage)s %% పూర్తి" msgid "Gujarati" msgstr "గుజరాతీ" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "సిస్టమ్‌లోని ఏకైక నిర్వాహకుడిని తొలగించలేరు." + #~ msgid "Past Vulnerabilities" #~ msgstr "గత దుర్బలతలు" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 73bf97be9..b32530798 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-21 20:38+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish Yapılandır sayfasında " "ayarlayabilirsiniz." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "E-posta Sunucusu" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Postfix, Dovecot ve Rspamd tarafından desteklenmektedir" @@ -2207,7 +2213,7 @@ msgstr "Yeni değer" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Güncelle" @@ -2309,11 +2315,11 @@ msgstr "{0} içinde dahili hata" msgid "Check syslog for more information" msgstr "Daha fazla bilgi için syslog'u gözden geçirin" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Etkinleştirilmiş kod adları" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Etkisizleştirilmiş kod adları" @@ -7566,15 +7572,15 @@ msgstr "Dağıtım yükseltmesi etkinleştirildi" msgid "Distribution upgrade disabled" msgstr "Dağıtım yükseltmesi etkisizleştirildi" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Yükseltme işlemi başladı." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Yükseltmeyi başlatma başarısız oldu." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Sık yapılan özellik güncellemeleri etkinleştirildi." @@ -7614,34 +7620,34 @@ msgstr "Tüm hizmetlere ve sistem ayarlarına erişim" msgid "Check LDAP entry \"{search_item}\"" msgstr "LDAP \"{search_item}\" girişini denetleme" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "Kullanıcı adı alınmış veya ayrılmış." -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Geçerli bir kullanıcı adı girin." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Zorunlu. 150 veya daha az karakter. Sadece İngilizce harfler, rakamlar ve " "@/./-/_ karakterleri." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Yetkilendirme Parolası" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Hesap değişikliklerini yetkilendirmek için şu anki parolanızı girin." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Geçersiz parola." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7655,21 +7661,21 @@ msgstr "" "kullanıcılar tüm hizmetlere oturum açabilecektir. Ayrıca SSH aracılığıyla " "sisteme oturum açabilir ve yönetici yetkilerine (sudo) sahip olabilirler." -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "LDAP kullanıcısı oluşturma başarısız oldu: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "{group} grubuna yeni kullanıcı ekleme başarısız oldu: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Yetkili SSH Anahtarları" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7680,45 +7686,41 @@ msgstr "" "tane olmak üzere birden çok anahtar girebilirsiniz. Boş satırlar ve # ile " "başlayan satırlar yoksayılacaktır." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "LDAP kullanıcısının yeniden adlandırılması başarısız oldu." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Kullanıcıyı gruptan kaldırma başarısız oldu." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Kullanıcıyı gruba ekleme başarısız oldu." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "SSH anahtarları ayarlanamıyor." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Kullanıcı durumunu değiştirme başarısız oldu." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Sistemdeki tek yönetici silinemez." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "LDAP kullanıcı parolasının değiştirilmesi başarısız oldu." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Admin grubuna yeni kullanıcı ekleme başarısız oldu: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Konsol erişimini kısıtlama başarısız oldu: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Kullanıcı hesabı oluşturuldu, şu an oturum açtınız" @@ -7740,7 +7742,7 @@ msgid "Create User" msgstr "Kullanıcı Oluştur" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Kullanıcıyı Sil" @@ -7843,20 +7845,20 @@ msgstr "%(username)s kullanıcısı güncellendi." msgid "Edit User" msgstr "Kullanıcıyı Düzenle" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "{user} kullanıcısı silindi." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "LDAP kullanıcısının silinmesi başarısız oldu." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Parolayı Değiştir" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Parola başarılı olarak değiştirildi." @@ -8336,23 +8338,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "Genel" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Kurulum sırasında hata oldu" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "yükleniyor" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "indiriliyor" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "ortam değiştirme" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "yapılandırma dosyası: {file}" @@ -8686,24 +8688,31 @@ msgstr "Bu uygulama şu anda dağıtımınızda mevcut değil." msgid "Check again" msgstr "Tekrar denetle" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Yükle" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Yükleme öncesi işlemi gerçekleştiriliyor" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Yükleme sonrası işlemi gerçekleştiriliyor" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Yüklenen %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%%%(percentage)s tamamlandı" @@ -8712,6 +8721,9 @@ msgstr "%%%(percentage)s tamamlandı" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Sistemdeki tek yönetici silinemez." + #~ msgid "Past Vulnerabilities" #~ msgstr "Geçmiş Güvenlik Açığı" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index ba6def4d6..4d3b60cf5 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-10-02 21:38+0000\n" "Last-Translator: Andrij Mizyk \n" "Language-Team: Ukrainian username@%(domainname)s. Ви можете налаштувати свій " "домен на системній сторінці Налаштувати." -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 msgid "Email Server" msgstr "Сервер електронної пошти" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "Працює на Postfix, Dovecot та Rspamd" @@ -2164,7 +2170,7 @@ msgstr "Нове значення" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Оновити" @@ -2266,11 +2272,11 @@ msgstr "Внутрішня помилка в {0}" msgid "Check syslog for more information" msgstr "Перевірте системний журнал, щоб дізнатися більше" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "Дозволені аліяси" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "Вимкнені аліяси" @@ -6920,8 +6926,8 @@ msgid "" "%(box_name)s has been updated to version %(version)s. See the release announcement." msgstr "" -"%(box_name)s оновлено до версії %(version)s. Дивіться анонс випуску." +"%(box_name)s оновлено до версії %(version)s. Дивіться анонс випуску." #: plinth/modules/upgrades/templates/upgrades-new-release.html:22 #: plinth/templates/notifications.html:44 @@ -7001,15 +7007,15 @@ msgstr "Дозволено оновлення дистрибутиву" msgid "Distribution upgrade disabled" msgstr "Вимкнено оновлення дистрибутиву" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "Процес оновлення розпочато." -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "Не вдалося розпочати оновлення." -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "Оновлення частих можливостей активовано." @@ -7049,33 +7055,33 @@ msgstr "Доступ до всіх сервісів і налаштувань с msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "Уведіть коректне імʼя користувача." -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" "Обовʼязково. 150 знаків, не більше. Лише англійські букви, цифри і @/./-/_." -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "Пароль для авторизації" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "Уведіть свій поточний пароль для авторизування змін обліківки." -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "Неправильний пароль." -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -7084,21 +7090,21 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "Не вдалося створити користувача LDAP: {error}" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "Не вдалося додати нового користувача до групи {group}: {error}" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "Ключі SSH для авторизації" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7108,45 +7114,41 @@ msgstr "" "систему без використання пароля. Ви можете вказати декілька ключів, один на " "кожен рядок. Порожні рядки і рядки, що починаються на # іґноруються." -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "Не вдалося перейменувати користувача LDAP." -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "Не вдалося вилучити користувача з групи." -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "Не вдалося додати користувача до групи." -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "Не можливо задати ключі SSH." -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "Не вдалося змінити стан користувача." -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "Не можливо видалити лише адміністратора системи." - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "Не вдалося змінити пароль користувача LDAP." -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "Не вдалося додати нового користувача до адмінської групи: {error}" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "Не вдалося обмежити доступ до консолі: {error}" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "Обліківку користувача створено, Ви ввійшли в систему" @@ -7168,7 +7170,7 @@ msgid "Create User" msgstr "Створити користувача" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "Видалити користувача" @@ -7266,20 +7268,20 @@ msgstr "Користувача %(username)s оновлено." msgid "Edit User" msgstr "Зміни користувача" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "Користувача {user} видалено." -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "Не вдалося видалити користувача LDAP." -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "Зберегти пароль" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "Пароль змінено успішно." @@ -7703,23 +7705,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "Помилка під час установлення" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "установлення" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "завантаження" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "зміна медія" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "файл конфіґурації: {file}" @@ -7749,8 +7751,8 @@ msgid "" "freedombox-team/freedombox/issues\">issue tracker." msgstr "" "Якщо Ви вірите, що ця сторінка має існувати, будь ласка, надішліть ваду у відстежувач помилок проєкту служби FreedomBox (Plinth)." +"href=\"https://salsa.debian.org/freedombox-team/freedombox/issues" +"\">відстежувач помилок проєкту служби FreedomBox (Plinth)." #: plinth/templates/500.html:10 msgid "500" @@ -8046,24 +8048,31 @@ msgstr "Цей застосунок поки що не доступний у В msgid "Check again" msgstr "Перевірити знову" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "Установити" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "Виконання передінсталяційних операцій" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "Виконання післяінсталяційних операцій" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "Установлюється %(package_names)s: %(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "%(percentage)s%% завершено" @@ -8072,6 +8081,9 @@ msgstr "%(percentage)s%% завершено" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Cannot delete the only administrator in the system." +#~ msgstr "Не можливо видалити лише адміністратора системи." + #~ msgid "Past Vulnerabilities" #~ msgstr "Минулі вразливості" diff --git a/plinth/locale/vi/LC_MESSAGES/django.po b/plinth/locale/vi/LC_MESSAGES/django.po index 0458a7bc0..700f63653 100644 --- a/plinth/locale/vi/LC_MESSAGES/django.po +++ b/plinth/locale/vi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-07-28 08:34+0000\n" "Last-Translator: bruh \n" "Language-Team: Vietnamese Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "Máy chủ tên miền" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2185,7 +2191,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "Cập nhật" @@ -2293,11 +2299,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6803,15 +6809,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6843,32 +6849,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6877,66 +6883,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6958,7 +6960,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -7051,20 +7053,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7483,23 +7485,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7799,24 +7801,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index 314ac7dad..91d0014ab 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-09-18 13:33+0000\n" "Last-Translator: 池边树下 \n" "Language-Team: Chinese (Simplified) 。你可以在系统的配置中设置你" "的域名。" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Web Server" msgid "Email Server" msgstr "Web 服务器" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2166,7 +2172,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "更新" @@ -2284,13 +2290,13 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 #, fuzzy #| msgid "Enable damage" msgid "Enabled aliases" msgstr "启用伤害" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 #, fuzzy #| msgid "Disabled" msgid "Disabled aliases" @@ -7520,15 +7526,15 @@ msgstr "已启用自动升级" msgid "Distribution upgrade disabled" msgstr "已禁用自动升级" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "升级过程开始。" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "开始升级失败。" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -7560,38 +7566,38 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "请检查 LDAP 条目“{search_item}”" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "用户名已经占用或保留。" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 #, fuzzy #| msgid "Invalid server name" msgid "Enter a valid username." msgstr "服务器名称无效" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 #, fuzzy #| msgid "Administrator Account" msgid "Authorization Password" msgstr "管理员帐户" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 #, fuzzy #| msgid "Show password" msgid "Invalid password." msgstr "显示密码" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 #, fuzzy #| msgid "" #| "Select which services should be available to the new user. The user will " @@ -7610,23 +7616,23 @@ msgstr "" "支持单一登录的服务。

管理员(admin)组中的用户将能够登录所有服务。他" "们还可以通过 SSH 登录到系统并具有管理权限(sudo)。" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, fuzzy, python-brace-format #| msgid "Creating LDAP user failed." msgid "Creating LDAP user failed: {error}" msgstr "创建 LDAP 用户失败。" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, fuzzy, python-brace-format #| msgid "Failed to add new user to {group} group." msgid "Failed to add new user to {group} group: {error}" msgstr "未能将新用户添加到 {group}。" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " @@ -7635,49 +7641,45 @@ msgstr "" "设置 SSH 公钥将允许此用户安全地登录到系统不使用密码。您可以输入多个密钥,每行" "一个。将忽略空行和以 # 开头的行。" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "重命名 LDAP 用户失败。" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "无法从组中删除用户。" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "无法将用户添加到组。" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "不能设置 SSH 密钥。" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 #, fuzzy #| msgid "Failed to add user to group." msgid "Failed to change user status." msgstr "无法将用户添加到组。" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "更改 LDAP 用户密码失败。" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, fuzzy, python-brace-format #| msgid "Failed to add new user to admin group." msgid "Failed to add new user to admin group: {error}" msgstr "未能将新用户添加到管理员组。" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, fuzzy, python-brace-format #| msgid "Failed to restrict console access." msgid "Failed to restrict console access: {error}" msgstr "限制命令行访问失败。" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "用户帐户已创建,您现在可以登录" @@ -7699,7 +7701,7 @@ msgid "Create User" msgstr "创建用户" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "删除用户" @@ -7797,20 +7799,20 @@ msgstr "用户 %(username)s 已更新。" msgid "Edit User" msgstr "编辑用户" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "用户 {user} 已删除。" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "删除 LDAP 用户失败。" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "更改密码" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "已成功更改密码。" @@ -8313,23 +8315,23 @@ msgstr "PPPoE" msgid "Generic" msgstr "通用" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "安装时错误" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "安装" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "下载中" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "媒体改变" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "配置文件:{file}" @@ -8691,24 +8693,31 @@ msgstr "这项应用现在在你不中无法使用" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "安装" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "执行安装前操作" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "执行安装后操作" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "正在安装 %(package_names)s:%(status)s" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "已完成 %(percentage)s%%" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index f720a5413..c49e980fc 100644 --- a/plinth/locale/zh_Hant/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hant/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-27 18:44-0400\n" +"POT-Creation-Date: 2021-10-11 18:24-0400\n" "PO-Revision-Date: 2021-04-27 13:32+0000\n" "Last-Translator: James Pan \n" "Language-Team: Chinese (Traditional) Configure page." msgstr "" -#: plinth/modules/email_server/__init__.py:48 +#: plinth/modules/email_server/__init__.py:55 +msgid "" +"During installation, any other email servers in the system will be " +"uninstalled." +msgstr "" + +#: plinth/modules/email_server/__init__.py:66 #, fuzzy #| msgid "Domain Name Server" msgid "Email Server" msgstr "域名服務器 DNS" -#: plinth/modules/email_server/__init__.py:80 +#: plinth/modules/email_server/__init__.py:97 msgid "Powered by Postfix, Dovecot & Rspamd" msgstr "" @@ -2003,7 +2009,7 @@ msgstr "" #: plinth/modules/upgrades/__init__.py:77 #: plinth/modules/upgrades/templates/update-firstboot-progress.html:11 #: plinth/modules/upgrades/templates/update-firstboot.html:11 -#: plinth/templates/setup.html:62 +#: plinth/templates/setup.html:73 msgid "Update" msgstr "" @@ -2109,11 +2115,11 @@ msgstr "" msgid "Check syslog for more information" msgstr "" -#: plinth/modules/email_server/views.py:179 +#: plinth/modules/email_server/views.py:180 msgid "Enabled aliases" msgstr "" -#: plinth/modules/email_server/views.py:180 +#: plinth/modules/email_server/views.py:181 msgid "Disabled aliases" msgstr "" @@ -6616,15 +6622,15 @@ msgstr "" msgid "Distribution upgrade disabled" msgstr "" -#: plinth/modules/upgrades/views.py:126 +#: plinth/modules/upgrades/views.py:127 msgid "Upgrade process started." msgstr "" -#: plinth/modules/upgrades/views.py:128 +#: plinth/modules/upgrades/views.py:129 msgid "Starting upgrade failed." msgstr "" -#: plinth/modules/upgrades/views.py:138 +#: plinth/modules/upgrades/views.py:139 msgid "Frequent feature updates activated." msgstr "" @@ -6656,32 +6662,32 @@ msgstr "" msgid "Check LDAP entry \"{search_item}\"" msgstr "" -#: plinth/modules/users/forms.py:37 +#: plinth/modules/users/forms.py:36 msgid "Username is taken or is reserved." msgstr "" -#: plinth/modules/users/forms.py:64 +#: plinth/modules/users/forms.py:63 msgid "Enter a valid username." msgstr "" -#: plinth/modules/users/forms.py:71 +#: plinth/modules/users/forms.py:70 msgid "" "Required. 150 characters or fewer. English letters, digits and @/./-/_ only." msgstr "" -#: plinth/modules/users/forms.py:79 +#: plinth/modules/users/forms.py:78 msgid "Authorization Password" msgstr "" -#: plinth/modules/users/forms.py:80 +#: plinth/modules/users/forms.py:79 msgid "Enter your current password to authorize account modifications." msgstr "" -#: plinth/modules/users/forms.py:88 +#: plinth/modules/users/forms.py:87 msgid "Invalid password." msgstr "" -#: plinth/modules/users/forms.py:105 +#: plinth/modules/users/forms.py:104 msgid "" "Select which services should be available to the new user. The user will be " "able to log in to services that support single sign-on through LDAP, if they " @@ -6690,66 +6696,62 @@ msgid "" "SSH and have administrative privileges (sudo)." msgstr "" -#: plinth/modules/users/forms.py:150 plinth/modules/users/forms.py:394 +#: plinth/modules/users/forms.py:149 plinth/modules/users/forms.py:393 #, python-brace-format msgid "Creating LDAP user failed: {error}" msgstr "" -#: plinth/modules/users/forms.py:163 +#: plinth/modules/users/forms.py:162 #, python-brace-format msgid "Failed to add new user to {group} group: {error}" msgstr "" -#: plinth/modules/users/forms.py:177 +#: plinth/modules/users/forms.py:176 msgid "Authorized SSH Keys" msgstr "" -#: plinth/modules/users/forms.py:179 +#: plinth/modules/users/forms.py:178 msgid "" "Setting an SSH public key will allow this user to securely log in to the " "system without using a password. You may enter multiple keys, one on each " "line. Blank lines and lines starting with # will be ignored." msgstr "" -#: plinth/modules/users/forms.py:266 +#: plinth/modules/users/forms.py:263 msgid "Renaming LDAP user failed." msgstr "" -#: plinth/modules/users/forms.py:279 +#: plinth/modules/users/forms.py:276 msgid "Failed to remove user from group." msgstr "" -#: plinth/modules/users/forms.py:291 +#: plinth/modules/users/forms.py:288 msgid "Failed to add user to group." msgstr "" -#: plinth/modules/users/forms.py:304 +#: plinth/modules/users/forms.py:301 msgid "Unable to set SSH keys." msgstr "" -#: plinth/modules/users/forms.py:322 +#: plinth/modules/users/forms.py:319 msgid "Failed to change user status." msgstr "" -#: plinth/modules/users/forms.py:330 -msgid "Cannot delete the only administrator in the system." -msgstr "" - -#: plinth/modules/users/forms.py:365 +#: plinth/modules/users/forms.py:364 msgid "Changing LDAP user password failed." msgstr "" -#: plinth/modules/users/forms.py:405 +#: plinth/modules/users/forms.py:404 #, python-brace-format msgid "Failed to add new user to admin group: {error}" msgstr "" -#: plinth/modules/users/forms.py:424 +#: plinth/modules/users/forms.py:423 #, python-brace-format msgid "Failed to restrict console access: {error}" msgstr "" -#: plinth/modules/users/forms.py:437 +#: plinth/modules/users/forms.py:436 msgid "User account created, you are now logged in" msgstr "" @@ -6771,7 +6773,7 @@ msgid "Create User" msgstr "" #: plinth/modules/users/templates/users_delete.html:11 -#: plinth/modules/users/views.py:122 +#: plinth/modules/users/views.py:134 msgid "Delete User" msgstr "" @@ -6864,20 +6866,20 @@ msgstr "" msgid "Edit User" msgstr "" -#: plinth/modules/users/views.py:132 +#: plinth/modules/users/views.py:144 #, python-brace-format msgid "User {user} deleted." msgstr "" -#: plinth/modules/users/views.py:139 +#: plinth/modules/users/views.py:151 msgid "Deleting LDAP user failed." msgstr "" -#: plinth/modules/users/views.py:148 +#: plinth/modules/users/views.py:160 msgid "Change Password" msgstr "" -#: plinth/modules/users/views.py:149 +#: plinth/modules/users/views.py:161 msgid "Password changed successfully." msgstr "" @@ -7296,23 +7298,23 @@ msgstr "" msgid "Generic" msgstr "" -#: plinth/package.py:136 +#: plinth/package.py:139 msgid "Error during installation" msgstr "" -#: plinth/package.py:158 +#: plinth/package.py:161 msgid "installing" msgstr "" -#: plinth/package.py:160 +#: plinth/package.py:163 msgid "downloading" msgstr "" -#: plinth/package.py:162 +#: plinth/package.py:165 msgid "media change" msgstr "" -#: plinth/package.py:164 +#: plinth/package.py:167 #, python-brace-format msgid "configuration file: {file}" msgstr "" @@ -7612,24 +7614,31 @@ msgstr "" msgid "Check again" msgstr "" -#: plinth/templates/setup.html:60 +#: plinth/templates/setup.html:55 +msgid "" +"Conflicting Packages: Some packages installed on the system " +"conflict with the installation of this app. The following packages will be " +"removed if you proceed:" +msgstr "" + +#: plinth/templates/setup.html:71 msgid "Install" msgstr "" -#: plinth/templates/setup.html:72 +#: plinth/templates/setup.html:83 msgid "Performing pre-install operation" msgstr "" -#: plinth/templates/setup.html:77 +#: plinth/templates/setup.html:88 msgid "Performing post-install operation" msgstr "" -#: plinth/templates/setup.html:83 +#: plinth/templates/setup.html:94 #, python-format msgid "Installing %(package_names)s: %(status)s" msgstr "" -#: plinth/templates/setup.html:93 +#: plinth/templates/setup.html:104 #, python-format msgid "%(percentage)s%% complete" msgstr "" From 35a368929c0ec678a408360bc6860af43404eb1c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 11 Oct 2021 18:54:28 -0400 Subject: [PATCH 57/58] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/ReleaseNotes.raw.wiki | 36 ++++++++++++++++++++++++++++ doc/manual/es/MatrixSynapse.raw.wiki | 3 ++- doc/manual/es/ReleaseNotes.raw.wiki | 36 ++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index a4a9d9608..1b82580b3 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -10,6 +10,42 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 21.11 (2021-10-11) == + +=== Highlights === + + * ttrss: Fix daemon not running sometimes on startup + +=== Other Changes === + + * *: Always pass check= argument to subprocess.run() + * *: Convert all functional tests to python format + * *: Move all systemd service files from /lib to /usr + * calibre: Run service only if when installed + * d/control: Allow building with python interpreter of any arch + * d/rules: Don't install and enable other systemd service files + * d/rules: Don't use setup.py to invoke tests, invoke directly instead + * email: Manage known installation conflicts + * locale: Update translation for Bulgarian, Ukrainian + * package: Add functions for removing packages + * performance: Cleanup code meant for cockpit version < 235 + * pyproject.toml: Merge contents of .converagerc + * pyproject.toml: Merge contents of pytest.ini + * settings: Choose password hashing complexity suitable for SBCs + * setup: Show and remove conflicts before installation + * sso, translation: Help set language cookie when user logins in + * storage: tests: functional: Fix tests always getting skipped + * tests: Add some missed marks for functional tests + * tests: Add tests for action utilities + * tests: Improve handling of tests skipped by default + * tests: help: Add help view tests + * translation: Always set language cookie when switching language + * ttrss: Add systemd security hardening to daemon + * ttrss: tests: functional: Make subscription faster + * user: Accommodate Django 3.1 change for model choice iteration + * users: Help set language cookie when user profile is edited + * wordpress: Run service only if when installed and configured + == FreedomBox 21.10 (2021-09-27) == === Highlights === diff --git a/doc/manual/es/MatrixSynapse.raw.wiki b/doc/manual/es/MatrixSynapse.raw.wiki index ef9fbb744..3eea26714 100644 --- a/doc/manual/es/MatrixSynapse.raw.wiki +++ b/doc/manual/es/MatrixSynapse.raw.wiki @@ -82,7 +82,8 @@ Si tu !FreedomBox está detrás de un router, necesitarás configurar la redirec * Sitio web de Matrix: https://matrix.org * Sección de Synapse: https://matrix.org/docs/projects/server/synapse - * Documentación de uso: https://matrix.org/docs/guides + * Documentación de uso: https://matrix.org/docs/guides+ + * Video tutorial para instalar Matrix Synapse sobre una instancia en la nube: https://youtu.be/8snpMHHbymI ## END_INCLUDE diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki index a4a9d9608..1b82580b3 100644 --- a/doc/manual/es/ReleaseNotes.raw.wiki +++ b/doc/manual/es/ReleaseNotes.raw.wiki @@ -10,6 +10,42 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f The following are the release notes for each !FreedomBox version. +== FreedomBox 21.11 (2021-10-11) == + +=== Highlights === + + * ttrss: Fix daemon not running sometimes on startup + +=== Other Changes === + + * *: Always pass check= argument to subprocess.run() + * *: Convert all functional tests to python format + * *: Move all systemd service files from /lib to /usr + * calibre: Run service only if when installed + * d/control: Allow building with python interpreter of any arch + * d/rules: Don't install and enable other systemd service files + * d/rules: Don't use setup.py to invoke tests, invoke directly instead + * email: Manage known installation conflicts + * locale: Update translation for Bulgarian, Ukrainian + * package: Add functions for removing packages + * performance: Cleanup code meant for cockpit version < 235 + * pyproject.toml: Merge contents of .converagerc + * pyproject.toml: Merge contents of pytest.ini + * settings: Choose password hashing complexity suitable for SBCs + * setup: Show and remove conflicts before installation + * sso, translation: Help set language cookie when user logins in + * storage: tests: functional: Fix tests always getting skipped + * tests: Add some missed marks for functional tests + * tests: Add tests for action utilities + * tests: Improve handling of tests skipped by default + * tests: help: Add help view tests + * translation: Always set language cookie when switching language + * ttrss: Add systemd security hardening to daemon + * ttrss: tests: functional: Make subscription faster + * user: Accommodate Django 3.1 change for model choice iteration + * users: Help set language cookie when user profile is edited + * wordpress: Run service only if when installed and configured + == FreedomBox 21.10 (2021-09-27) == === Highlights === From dc6282676d0116193ce54137007fd7e4c5f9be9c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 11 Oct 2021 18:55:46 -0400 Subject: [PATCH 58/58] Release v21.11 to unstable Signed-off-by: James Valleroy --- debian/changelog | 73 ++++++++++++++++++++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 04b7d00bf..37fac0f36 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,76 @@ +freedombox (21.11) unstable; urgency=medium + + [ Fioddor Superconcentrado ] + * test: help: Add help view tests + * test: Add tests for action utilities + * tests: Improve handling of tests skipped by default + * package: Add functions for removing packages + * setup: Show and remove conflicts before installation + * email: Manage known installation conflicts + + [ 109247019824 ] + * Translated using Weblate (Bulgarian) + + [ Andrij Mizyk ] + * Translated using Weblate (Ukrainian) + + [ James Valleroy ] + * openvpn: Convert functional tests to non-BDD python format + * pagekite: Convert functional tests to non-BDD python format + * privoxy: Convert functional tests to non-BDD python format + * tests: Add backups mark for openvpn, pagekite, privoxy + * quassel: Convert functional tests to non-BDD python format + * radicale: Convert functional tests to non-BDD python format + * roundcube: Convert functional tests to non-BDD python format + * searx: Convert functional tests to non-BDD python format + * security: Convert functional tests to non-BDD python format + * shadowsocks: Convert functional tests to non-BDD python format + * sharing: Convert functional tests to non-BDD python format + * snapshot: Convert functional tests to non-BDD python format + * ssh: Convert functional tests to non-BDD python format + * sso: Convert functional tests to non-BDD python format + * storage: Convert functional tests to non-BDD python format + * syncthing: Convert functional tests to non-BDD python format + * tahoe: Convert functional tests to non-BDD python format + * tor: Convert functional tests to non-BDD python format + * transmission: Convert functional tests to non-BDD python format + * ttrss: Convert functional tests to non-BDD python format + * upgrades: Convert functional tests to non-BDD python format + * zoph: Convert functional tests to non-BDD python format + * users: Convert functional tests to non-BDD python format + * tests: Add some missed marks for functional tests + * tests: Drop step definitions + * conftest: Skip functional tests if splinter not importable + * locale: Update translation strings + * doc: Fetch latest manual + + [ Sunil Mohan Adapa ] + * d/control: Allow building with python interpreter of any arch + * user: Accommodate Django 3.1 change for model choice iteration + * settings: Choose password hashing complexity suitable for SBCs + * pyproject.toml: Merge contents of pytest.ini + * pyproject.toml: Merge contents of .converagerc + * d/rules: Don't use setup.py to invoke tests, invoke directly instead + * users: Help set language cookie when user profile is edited + * sso, translation: Help set language cookie when user logins in + * translation: Always set language cookie when switching language + * *: Move all systemd service files from /lib to /usr + * wordpress: Run service only if when installed and configured + * calibre: Run service only if when installed + * d/rules: Don't install and enable other systemd service files + * storage: tests: functional: Fix tests always getting skipped + * package: Remove unused import to fix pipeline + * tests: Drop installation of pytest-bdd + * performance: Cleanup code meant for cockpit version < 235 + * *: Always pass check= argument to subprocess.run() + * ttrss: Fix daemon not running sometimes on startup + * ttrss: Add systemd security hardening to daemon + + [ Joseph Nuthalapati ] + * ttrss: tests: functional: Make subscription faster + + -- James Valleroy Mon, 11 Oct 2021 18:55:20 -0400 + freedombox (21.10) unstable; urgency=medium [ Veiko Aasa ] diff --git a/plinth/__init__.py b/plinth/__init__.py index a8e21d7a6..4a959920c 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '21.10' +__version__ = '21.11'