From 9e8e1436ab41a93f137b45eddb31d68df1955ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=C4=9Fuz=20Ersen?= Date: Sat, 6 Feb 2021 11:46:14 +0000 Subject: [PATCH 01/20] Translated using Weblate (Turkish) Currently translated at 100.0% (1441 of 1441 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 5dcd3c157..3c5f9865e 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 23:02-0500\n" -"PO-Revision-Date: 2021-02-01 18:42+0000\n" -"Last-Translator: Burak Yavuz \n" +"PO-Revision-Date: 2021-02-06 17:55+0000\n" +"Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -7088,7 +7088,7 @@ msgstr "FreedomBox Güncellendi" #: plinth/modules/upgrades/__init__.py:210 msgid "Could not start distribution update" -msgstr "" +msgstr "Dağıtım güncellemesi başlatılamadı" #: plinth/modules/upgrades/__init__.py:212 #, python-format @@ -7098,17 +7098,20 @@ msgid "" "total space, is free. Distribution update will be retried after 24 hours, if " "enabled." msgstr "" +"Dağıtım güncellemesini başlatmak için kök bölümde yeterli boş alan yok. " +"Lütfen en az 5 GB ve toplam alanın en az %10'unun boş olduğundan emin olun. " +"Dağıtım güncellemesi, etkinleştirilirse 24 saat sonra yeniden denenecek." #: plinth/modules/upgrades/__init__.py:223 -#, fuzzy -#| msgid "Distribution upgrade disabled" msgid "Distribution update started" -msgstr "Dağıtım yükseltmesi etkisizleştirildi" +msgstr "Dağıtım güncellemesi başladı" #: plinth/modules/upgrades/__init__.py:225 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" +"Bir sonraki kararlı sürüme güncelleme başladı. Bunun tamamlanması uzun zaman " +"alabilir." #: plinth/modules/upgrades/forms.py:15 msgid "Enable auto-update" From de299049c1f418e1d8fb895088ce7b226bb95c5f Mon Sep 17 00:00:00 2001 From: ikmaak Date: Sat, 6 Feb 2021 21:19:48 +0000 Subject: [PATCH 02/20] Translated using Weblate (Dutch) Currently translated at 100.0% (1441 of 1441 strings) --- plinth/locale/nl/LC_MESSAGES/django.po | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index dbd04fff4..c4b2bab6a 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 23:02-0500\n" -"PO-Revision-Date: 2021-02-01 18:42+0000\n" +"PO-Revision-Date: 2021-02-08 06:50+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch \n" @@ -7129,7 +7129,7 @@ msgstr "FreedomBox geaktualiseerd" #: plinth/modules/upgrades/__init__.py:210 msgid "Could not start distribution update" -msgstr "" +msgstr "Kan distributie-update niet starten" #: plinth/modules/upgrades/__init__.py:212 #, python-format @@ -7139,17 +7139,19 @@ msgid "" "total space, is free. Distribution update will be retried after 24 hours, if " "enabled." msgstr "" +"Er is niet genoeg vrije ruimte in de root partitie om de distributie-update " +"te starten. Zorg ervoor dat ten minste 5 GB en ten minste 10% van de totale " +"ruimte vrij is. Als ingeschakeld, wordt de distributie-update na 24 uur " +"opnieuw geprobeerd." #: plinth/modules/upgrades/__init__.py:223 -#, fuzzy -#| msgid "Distribution upgrade disabled" msgid "Distribution update started" -msgstr "Distributie bijwerken uitgeschakeld" +msgstr "Distributie-update gestart" #: plinth/modules/upgrades/__init__.py:225 msgid "" "Started update to next stable release. This may take a long time to complete." -msgstr "" +msgstr "Update naar volgende stabiele release gestart. Dit kan lang duren." #: plinth/modules/upgrades/forms.py:15 msgid "Enable auto-update" From c9dd30bfef9800062ce9bb29ea4405e996be0f64 Mon Sep 17 00:00:00 2001 From: Burak Yavuz Date: Sat, 6 Feb 2021 17:55:40 +0000 Subject: [PATCH 03/20] Translated using Weblate (Turkish) Currently translated at 100.0% (1441 of 1441 strings) --- plinth/locale/tr/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 3c5f9865e..1c2e93222 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 23:02-0500\n" -"PO-Revision-Date: 2021-02-06 17:55+0000\n" -"Last-Translator: Oğuz Ersen \n" +"PO-Revision-Date: 2021-02-08 06:50+0000\n" +"Last-Translator: Burak Yavuz \n" "Language-Team: Turkish \n" "Language: tr\n" @@ -7100,7 +7100,7 @@ msgid "" msgstr "" "Dağıtım güncellemesini başlatmak için kök bölümde yeterli boş alan yok. " "Lütfen en az 5 GB ve toplam alanın en az %10'unun boş olduğundan emin olun. " -"Dağıtım güncellemesi, etkinleştirilirse 24 saat sonra yeniden denenecek." +"Dağıtım güncellemesi, etkinleştirildiyse 24 saat sonra yeniden denenecektir." #: plinth/modules/upgrades/__init__.py:223 msgid "Distribution update started" From aa1af9d1007143084326f365f9e27fe505bdd9b4 Mon Sep 17 00:00:00 2001 From: Michael Breidenbach Date: Sun, 7 Feb 2021 06:42:51 +0000 Subject: [PATCH 04/20] Translated using Weblate (Swedish) Currently translated at 99.9% (1440 of 1441 strings) --- plinth/locale/sv/LC_MESSAGES/django.po | 79 ++++++++++++++++++-------- 1 file changed, 54 insertions(+), 25 deletions(-) diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 4fac6ba8b..85bbd6541 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 23:02-0500\n" -"PO-Revision-Date: 2021-02-01 18:42+0000\n" -"Last-Translator: ikmaak \n" +"PO-Revision-Date: 2021-02-08 06:50+0000\n" +"Last-Translator: Michael Breidenbach \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -154,10 +154,12 @@ msgid "" "Enable an automatic backup schedule for data safety. Prefer an encrypted " "remote backup location or an extra attached disk." msgstr "" +"Aktivera ett automatiskt reservschema för datasäkerhet. Föredra en krypterad " +"plats för fjärrbackup eller en extra ansluten disk." #: plinth/modules/backups/__init__.py:203 msgid "Enable a Backup Schedule" -msgstr "" +msgstr "Aktivera ett schema för säkerhetskopiering" #: plinth/modules/backups/__init__.py:207 #: plinth/modules/backups/__init__.py:254 @@ -172,12 +174,12 @@ msgid "" "A scheduled backup failed. Past {error_count} attempts for backup did not " "succeed. The latest error is: {error_message}" msgstr "" +"En schemalagd säkerhetskopiering misslyckades. Tidigare {error_count} försök " +"för säkerhetskopiering lyckades inte. Det senaste felet är: {error_message}" #: plinth/modules/backups/__init__.py:250 -#, fuzzy -#| msgid "Existing Backups" msgid "Error During Backup" -msgstr "Befintliga säkerhetskopior" +msgstr "Fel under säkerhetskopiering" #: plinth/modules/backups/forms.py:33 #, python-brace-format @@ -186,37 +188,45 @@ msgstr "{app} (Inga data att säkerhetskopiera)" #: plinth/modules/backups/forms.py:53 msgid "Enable scheduled backups" -msgstr "" +msgstr "Aktivera schemalagda säkerhetskopior" #: 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 "" +"Om aktiverad tas en säkerhetskopia varje dag, varje vecka och varje månad. " +"Äldre säkerhetskopior tas bort." #: plinth/modules/backups/forms.py:58 msgid "Number of daily backups to keep" -msgstr "" +msgstr "Antal dagliga säkerhetskopior att behålla" #: 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 "" +"Så här många senaste säkerhetskopior hålls och resten tas bort. Ett värde av " +"\"0\" inaktiverar säkerhetskopior av den här typen. Utlöses vid angiven " +"timme varje dag." #: plinth/modules/backups/forms.py:64 msgid "Number of weekly backups to keep" -msgstr "" +msgstr "Antal veckovisa säkerhetskopior att behålla" #: 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 "" +"Så här många senaste säkerhetskopior hålls och resten tas bort. Ett värde av " +"\"0\" inaktiverar säkerhetskopior av den här typen. Utlöses vid angiven " +"timme varje dag." #: plinth/modules/backups/forms.py:71 msgid "Number of monthly backups to keep" -msgstr "" +msgstr "Antal månatliga säkerhetskopior att behålla" #: plinth/modules/backups/forms.py:73 msgid "" @@ -224,14 +234,17 @@ msgid "" "disables backups of this type. Triggered at specified hour first day of " "every month." msgstr "" +"Så här många senaste säkerhetskopior hålls och resten tas bort. Ett värde av " +"\"0\" inaktiverar säkerhetskopior av den här typen. Utlöses vid angiven " +"timme första dagen i varje månad." #: plinth/modules/backups/forms.py:78 msgid "Hour of the day to trigger backup operation" -msgstr "" +msgstr "Timme på dagen för att utlösa säkerhetskopiering" #: plinth/modules/backups/forms.py:79 msgid "In 24 hour format." -msgstr "" +msgstr "I 24-timmarsformat." #: plinth/modules/backups/forms.py:82 plinth/modules/backups/forms.py:104 msgid "Included apps" @@ -503,7 +516,7 @@ msgstr "Den här databasen är krypterad" #: plinth/modules/backups/templates/backups_repository.html:29 msgid "Schedule" -msgstr "" +msgstr "Schema" #: plinth/modules/backups/templates/backups_repository.html:40 msgid "Unmount Location" @@ -636,13 +649,11 @@ msgstr "Verifiera Host" #: plinth/modules/backups/views.py:55 msgid "Backup schedule updated." -msgstr "" +msgstr "Backup schema uppdaterat." #: plinth/modules/backups/views.py:74 -#, fuzzy -#| msgid "Create Backup" msgid "Schedule Backups" -msgstr "Skapa säkerhetskopia" +msgstr "Schemalägg säkerhetskopior" #: plinth/modules/backups/views.py:106 msgid "Archive created." @@ -3785,22 +3796,28 @@ msgid "" "Automatic (DHCP): Configure automatically, use Internet connection from this " "network" msgstr "" +"Automatiskt (DHCP): Konfigurera automatiskt, använd Internetanslutning från " +"det här nätverket" #: plinth/modules/networks/forms.py:44 msgid "" "Shared: Act as a router, provide Internet connection to other devices on " "this network" msgstr "" +"Delad: Agera som en router, ge Internet-anslutning till andra enheter i det " +"här nätverket" #: plinth/modules/networks/forms.py:47 plinth/modules/networks/forms.py:85 msgid "" "Manual: Use manually specified parameters, use Internet connection from this " "network" msgstr "" +"Manuell: Använd manuellt angivna parametrar, använd Internet-anslutning från " +"det här nätverket" #: plinth/modules/networks/forms.py:50 msgid "Disabled: Do not configure this addressing method" -msgstr "" +msgstr "Inaktiverad: Konfigurera inte den här adresseringsmetoden" #: plinth/modules/networks/forms.py:57 msgid "Netmask" @@ -3857,16 +3874,20 @@ msgstr "IPv6-Addresseringsmetod" msgid "" "Automatic: Configure automatically, use Internet connection from this network" msgstr "" +"Automatiskt: Konfigurera automatiskt, använd Internetanslutning från det här " +"nätverket" #: plinth/modules/networks/forms.py:82 msgid "" "Automatic (DHCP only): Configure automatically, use Internet connection from " "this network" msgstr "" +"Endast automatiskt (Endast DHCP): Konfigurera automatiskt, använd " +"Internetanslutning från det här nätverket" #: plinth/modules/networks/forms.py:87 msgid "Ignore: Ignore this addressing method" -msgstr "" +msgstr "Ignorera: Ignorera den här adresseringsmetoden" #: plinth/modules/networks/forms.py:92 msgid "Prefix" @@ -4155,6 +4176,10 @@ msgid "" "that you have other means to access %(box_name)s before altering this " "connection." msgstr "" +"Detta är den primära anslutningen som %(box_name)s är beroende av för " +"Internet-anslutning. Ändra det kan göra din %(box_name)s onåbar. Se till att " +"du har andra sätt att komma åt %(box_name)s innan du ändrar den här " +"anslutningen." #: plinth/modules/networks/templates/connection_show.html:36 msgid "Edit connection" @@ -6963,7 +6988,7 @@ msgstr "" #: plinth/modules/transmission/__init__.py:32 msgid "Please do not change the default port of the transmission daemon." -msgstr "" +msgstr "Vänligen ändra inte standardporten för transmissionsdemonen." #: plinth/modules/transmission/__init__.py:53 #: plinth/modules/transmission/manifest.py:6 @@ -7042,27 +7067,31 @@ msgstr "FreedomBox uppdaterad" #: plinth/modules/upgrades/__init__.py:210 msgid "Could not start distribution update" -msgstr "" +msgstr "Det gick inte att starta distributionsuppdatering" #: plinth/modules/upgrades/__init__.py:212 -#, python-format +#, fuzzy, python-format msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB, and at least 10% of the " "total space, is free. Distribution update will be retried after 24 hours, if " "enabled." msgstr "" +"Det finns inte tillräckligt med ledigt utrymme i rotpartitionen för att " +"starta distributionsuppdateringen. Se till att minst 5 GB, och minst 10 % ov " +"det totala utrymmet, är ledigt. Distributionsuppdateringen kommer att prövas " +"igen efter 24 timmar, om den är aktiverad." #: plinth/modules/upgrades/__init__.py:223 -#, fuzzy -#| msgid "Distribution upgrade disabled" msgid "Distribution update started" -msgstr "Distributionsuppgradering inaktiverad" +msgstr "Distributionsuppdateringen har startats" #: plinth/modules/upgrades/__init__.py:225 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" +"Startade uppdateringen till nästa stabila utgåva. Det kan ta lång tid att " +"slutföra." #: plinth/modules/upgrades/forms.py:15 msgid "Enable auto-update" From 60d3fd6473358e5d8cee26235655354b5c9cca7f Mon Sep 17 00:00:00 2001 From: Michalis Date: Mon, 8 Feb 2021 23:11:23 +0000 Subject: [PATCH 05/20] Translated using Weblate (Greek) Currently translated at 73.9% (1065 of 1441 strings) --- plinth/locale/el/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index b690ddbbe..6601d13e7 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-05 23:02-0500\n" -"PO-Revision-Date: 2021-01-18 12:32+0000\n" -"Last-Translator: ikmaak \n" +"PO-Revision-Date: 2021-02-09 23:50+0000\n" +"Last-Translator: Michalis \n" "Language-Team: Greek \n" "Language: el\n" @@ -3669,7 +3669,7 @@ msgstr "Δημοσίευση κλειδιού στο διακομιστή κλε #: plinth/modules/monkeysphere/templates/monkeysphere.html:27 msgid "Cancel" -msgstr "Ακύρωση" +msgstr "Άκυρο" #: plinth/modules/monkeysphere/templates/monkeysphere.html:36 #: plinth/modules/monkeysphere/templates/monkeysphere_details.html:41 @@ -4389,7 +4389,7 @@ msgstr "Διακομιστής DNS" #: plinth/modules/networks/templates/connection_show.html:248 #: plinth/modules/storage/forms.py:139 msgid "Default" -msgstr "Προεπιλεγμένο" +msgstr "Προεπιλογή" #: plinth/modules/networks/templates/connection_show.html:213 msgid "IPv6" @@ -6764,7 +6764,7 @@ msgstr "Υποκατάλογος (προαιρετικό)" #: plinth/modules/storage/forms.py:143 msgid "Share" -msgstr "Μέρισμα" +msgstr "Κοινοποίηση" #: plinth/modules/storage/forms.py:151 msgid "Other directory (specify below)" @@ -6969,7 +6969,7 @@ msgstr "Συνδεδεμένοι εισαγωγείς" #: plinth/modules/tahoe/templates/tahoe-post-setup.html:82 msgid "Remove" -msgstr "Καταργήστε" +msgstr "Αφαίρεση" #: plinth/modules/tor/__init__.py:35 msgid "" From 22ddeb64aed2a28822f3695e3ad508a3ab1af631 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 7 Feb 2021 09:45:28 -0500 Subject: [PATCH 06/20] upgrades: Mark string as no-python-format Signed-off-by: James Valleroy --- plinth/modules/upgrades/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index b8f0c9edd..5bd6c62f5 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -209,6 +209,7 @@ def check_dist_upgrade(_): logger.warning('Skip dist upgrade: Not enough free space in /.') title = ugettext_noop('Could not start distribution update') message = ugettext_noop( + # xgettext:no-python-format 'There is not enough free space in the root partition to ' 'start the distribution update. Please ensure at least 5 GB, ' 'and at least 10% of the total space, is free. Distribution ' From 879f37de73415729b08e27104e7986bfed994373 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 9 Feb 2021 19:11:46 -0500 Subject: [PATCH 07/20] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar_SA/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/bg/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/bn/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/cs/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/da/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/de/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/django.pot | 10 +++++----- plinth/locale/el/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/es/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/fa/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/fake/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/fr/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/gl/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/gu/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/hi/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/hu/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/id/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/it/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/ja/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/kn/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/lt/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/nb/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/nl/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/pl/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/pt/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/ru/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/sl/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/sr/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/sv/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/ta/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/te/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/tr/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/uk/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 10 +++++----- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 10 +++++----- 35 files changed, 175 insertions(+), 175 deletions(-) diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 8dd76d6ea..47d1b8089 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-02-05 23:02-0500\n" +"POT-Creation-Date: 2021-02-09 19:11-0500\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) \n" "Language-Team: Bulgarian \n" "Language-Team: Bengali \n" "Language-Team: Czech \n" "Language-Team: Danish \n" "Language-Team: German \n" "Language-Team: LANGUAGE \n" @@ -6159,8 +6159,8 @@ msgstr "" msgid "Could not start distribution update" msgstr "" -#: plinth/modules/upgrades/__init__.py:212 -#, python-format +#: plinth/modules/upgrades/__init__.py:213 +#, no-python-format msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB, and at least 10% of the " @@ -6168,11 +6168,11 @@ msgid "" "enabled." msgstr "" -#: plinth/modules/upgrades/__init__.py:223 +#: plinth/modules/upgrades/__init__.py:224 msgid "Distribution update started" msgstr "" -#: plinth/modules/upgrades/__init__.py:225 +#: plinth/modules/upgrades/__init__.py:226 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 6601d13e7..9a5d5bf4f 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-02-05 23:02-0500\n" +"POT-Creation-Date: 2021-02-09 19:11-0500\n" "PO-Revision-Date: 2021-02-09 23:50+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek \n" "Language-Team: Spanish \n" "Language-Team: Persian \n" "Language-Team: Plinth Developers \n" "Language-Team: French \n" "Language-Team: Galician \n" "Language-Team: Gujarati \n" "Language-Team: Hindi \n" "Language-Team: Hungarian \n" "Language-Team: Indonesian \n" "Language-Team: Italian \n" "Language-Team: LANGUAGE \n" @@ -6160,8 +6160,8 @@ msgstr "" msgid "Could not start distribution update" msgstr "" -#: plinth/modules/upgrades/__init__.py:212 -#, python-format +#: plinth/modules/upgrades/__init__.py:213 +#, no-python-format msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB, and at least 10% of the " @@ -6169,11 +6169,11 @@ msgid "" "enabled." msgstr "" -#: plinth/modules/upgrades/__init__.py:223 +#: plinth/modules/upgrades/__init__.py:224 msgid "Distribution update started" msgstr "" -#: plinth/modules/upgrades/__init__.py:225 +#: plinth/modules/upgrades/__init__.py:226 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index 8121bbab4..bcfecf9ba 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-02-05 23:02-0500\n" +"POT-Creation-Date: 2021-02-09 19:11-0500\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada \n" "Language-Team: Lithuanian \n" "Language-Team: Norwegian Bokmål \n" "Language-Team: Dutch \n" "Language-Team: Polish \n" "Language-Team: Portuguese \n" "Language-Team: Russian \n" "Language-Team: Slovenian \n" "Language-Team: Serbian \n" "Language-Team: Swedish \n" "Language-Team: LANGUAGE \n" @@ -6160,8 +6160,8 @@ msgstr "" msgid "Could not start distribution update" msgstr "" -#: plinth/modules/upgrades/__init__.py:212 -#, python-format +#: plinth/modules/upgrades/__init__.py:213 +#, no-python-format msgid "" "There is not enough free space in the root partition to start the " "distribution update. Please ensure at least 5 GB, and at least 10% of the " @@ -6169,11 +6169,11 @@ msgid "" "enabled." msgstr "" -#: plinth/modules/upgrades/__init__.py:223 +#: plinth/modules/upgrades/__init__.py:224 msgid "Distribution update started" msgstr "" -#: plinth/modules/upgrades/__init__.py:225 +#: plinth/modules/upgrades/__init__.py:226 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index ce52f4aca..3c23d3364 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-02-05 23:02-0500\n" +"POT-Creation-Date: 2021-02-09 19:11-0500\n" "PO-Revision-Date: 2020-10-26 13:27+0000\n" "Last-Translator: Praveen Illa \n" "Language-Team: Telugu \n" "Language-Team: Turkish \n" "Language-Team: Ukrainian \n" "Language-Team: Chinese (Simplified) \n" "Language-Team: Chinese (Traditional) Date: Fri, 5 Feb 2021 11:11:08 -0800 Subject: [PATCH 08/20] gitignore: Ignore files generated during package build Signed-off-by: John Lines Reviewed-by: Sunil Mohan Adapa --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 849b4ff89..db26474e7 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,13 @@ debian/freedombox/ debian/plinth.debhelper.log debian/plinth.substvars debian/plinth/ +debian/tmp/ +debian/freedombox-doc-en.debhelper.log +debian/freedombox-doc-en.substvars +debian/freedombox-doc-en/ +debian/freedombox-doc-es.debhelper.log +debian/freedombox-doc-es.substvars +debian/freedombox-doc-es/ *.pytest_cache/ .container/ From 84e671c919a15be4e05fa34bd3c066e561c7b366 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 10 Feb 2021 01:04:17 -0800 Subject: [PATCH 09/20] tests: functional: Introduce step def. to check if app is enabled - Useful in case the site can't be checked and daemon is not available. Signed-off-by: Sunil Mohan Adapa --- plinth/tests/functional/__init__.py | 7 +++++++ plinth/tests/functional/step_definitions.py | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index 11fbd6018..b3c14d9c3 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -379,6 +379,13 @@ def app_disable(browser, app_name): _change_app_status(browser, app_name, 'disabled') +def app_is_enabled(browser, app_name): + """Return whether the app is enabled.""" + nav_to_module(browser, app_name) + should_enable_field = browser.find_by_id('id_should_enable') + return should_enable_field.value == 'False' + + def app_can_be_disabled(browser, app_name): """Return whether the application can be disabled.""" nav_to_module(browser, app_name) diff --git a/plinth/tests/functional/step_definitions.py b/plinth/tests/functional/step_definitions.py index a20f0a0fd..9bb445f70 100644 --- a/plinth/tests/functional/step_definitions.py +++ b/plinth/tests/functional/step_definitions.py @@ -58,6 +58,13 @@ def 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, From f978d2f0d0b2a729cd08a0bb47f61b2882be97ba Mon Sep 17 00:00:00 2001 From: John Lines Date: Sun, 20 Dec 2020 18:05:23 +0000 Subject: [PATCH 10/20] zoph: Add new app to organize photos - Identify Freedbombox admin who installed the app to be zoph admin. - Implement backup and restore. - Photos directory should remain at /var/lib/zoph, for proper operation of backups. - There remains an issue that the App is enabled before it is configured but will not work correctly until configuration. - OpenStreetMap mapping is enabled. These should be configurable before installation. - Add initial forms.py and views.py to Zoph app, however these are currently unused as urls.py does not invoke the view. When the view is not invoked the Zoph App installs, with single signon, currently as the first LDAP user, rather than the plinth user. - The first user's preferences are not set, and need to be manually set to avoid other errors. * Sunil's changes - Squash commits and re-split them. - Drop documentation as it will be auto populated from wiki later. - Remove outdated validation code from manifest. - Drop some dead code. - Don't send MySQL password over command line for improved security. Instead rely on Unix authentication of root user similar to backup/restore process. - Use JSON for exchanging configuration dump to avoid encoding errors. - Add username validation to avoid a potential SQL injection. - Update description for neural tone and brevity. Add information about how user accounts work in FreedomBox - Fix functional tests. - Drop all code related to changing photos path until it is ready. - Update URL from /zoph to /zoph/ to avoid another redirect. - Fix disabling the app. - Use icon that Zoph uses for favicon as logo. Update copyright file. - Fix spelling unzip. - Minor refactors. Run yapf and isort. - Use subprocess.run() instead of os.popen() everywhere for better security with argument parsing. - Enable OpenStreetMap by default. User have a choice to disable it before using the app. Add label to explain privacy concerns. - Fix dropping database by using --force argument. - Cleanup enabling the app to not enable the app when updating configuration. - Use AppView's default template instead of overriding. - Update functional tests to just check if the app is enabled/disabled as expected. Checking that Zoph site is available will require reliable handling of admin user. Signed-off-by: John Lines Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- actions/zoph | 147 +++++ debian/copyright | 2 + plinth/modules/zoph/__init__.py | 130 +++++ .../zoph/data/etc/plinth/modules-enabled/zoph | 1 + plinth/modules/zoph/forms.py | 16 + plinth/modules/zoph/manifest.py | 21 + .../zoph/templates/zoph-pre-setup.html | 31 ++ plinth/modules/zoph/tests/__init__.py | 0 plinth/modules/zoph/tests/test_functional.py | 19 + plinth/modules/zoph/tests/zoph.feature | 27 + plinth/modules/zoph/urls.py | 13 + plinth/modules/zoph/views.py | 74 +++ static/themes/default/icons/zoph.png | Bin 0 -> 29654 bytes static/themes/default/icons/zoph.svg | 522 ++++++++++++++++++ 14 files changed, 1003 insertions(+) create mode 100755 actions/zoph create mode 100644 plinth/modules/zoph/__init__.py create mode 100644 plinth/modules/zoph/data/etc/plinth/modules-enabled/zoph create mode 100644 plinth/modules/zoph/forms.py create mode 100644 plinth/modules/zoph/manifest.py create mode 100644 plinth/modules/zoph/templates/zoph-pre-setup.html create mode 100644 plinth/modules/zoph/tests/__init__.py create mode 100644 plinth/modules/zoph/tests/test_functional.py create mode 100644 plinth/modules/zoph/tests/zoph.feature create mode 100644 plinth/modules/zoph/urls.py create mode 100644 plinth/modules/zoph/views.py create mode 100644 static/themes/default/icons/zoph.png create mode 100644 static/themes/default/icons/zoph.svg diff --git a/actions/zoph b/actions/zoph new file mode 100755 index 000000000..3b6b8a831 --- /dev/null +++ b/actions/zoph @@ -0,0 +1,147 @@ +#!/usr/bin/python3 +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Configuration helper for Zoph server. +""" + +import argparse +import configparser +import json +import os +import re +import subprocess + +from plinth import action_utils + +APACHE_CONF = '/etc/apache2/conf-available/zoph.conf' +DB_BACKUP_FILE = '/var/lib/plinth/backups-data/zoph-database.sql' + + +def parse_arguments(): + """Return parsed command line arguments as dictionary.""" + parser = argparse.ArgumentParser() + subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + + subparsers.add_parser('pre-install', + help='Perform Zoph pre-install configuration') + subparser = subparsers.add_parser('setup', + help='Perform Zoph configuration setup') + subparsers.add_parser('get-configuration', + help='Return the current configuration') + subparser = subparsers.add_parser('set-configuration', + help='Configure zoph') + subparser.add_argument('--admin-user', help='Name of the admin user') + subparser.add_argument('--enable-osm', help='Enable OpenSteetMap maps') + subparsers.add_parser('is-configured', help='return true if configured') + subparsers.add_parser('dump-database', help='Dump database to file') + subparsers.add_parser('restore-database', + help='Restore database from file') + + subparsers.required = True + return parser.parse_args() + + +def subcommand_pre_install(_): + """Preseed debconf values before packages are installed.""" + action_utils.debconf_set_selections([ + 'zoph zoph/dbconfig-install boolean true', + 'zoph zoph/mysql/admin-user string root' + ]) + + +def subcommand_get_configuration(_): + """Return the current configuration.""" + configuration = {} + process = subprocess.run(['zoph', '--dump-config'], stdout=subprocess.PIPE, + check=True) + for line in process.stdout.decode().splitlines(): + name, value = line.partition(':')[::2] + configuration[name.strip()] = value[1:] + + print(json.dumps(configuration)) + + +def _zoph_configure(key, value): + """Set a configure value in Zoph.""" + subprocess.run(['zoph', '--config', key, value], check=True) + + +def subcommand_setup(_): + """Setup Zoph configuration.""" + _zoph_configure('import.enable', 'true') + _zoph_configure('import.upload', 'true') + _zoph_configure('import.rotate', 'true') + _zoph_configure('path.unzip', 'unzip') + _zoph_configure('path.untar', 'tar xvf') + _zoph_configure('path.ungz', 'gunzip') + + # Maps using OpenStreetMap is enabled by default. + _zoph_configure('maps.provider', 'osm') + + +def _get_db_name(): + """Return the name of the database configured by dbconfig.""" + config = configparser.ConfigParser() + config.read_file(open('/etc/zoph.ini', 'r')) + return config['zoph']['db_name'].strip('"') + + +def subcommand_set_configuration(arguments): + """Setup Zoph Apache configuration.""" + _zoph_configure('interface.user.remote', 'true') + + # Note that using OpenSteetmap as a mapping provider is a very nice + # feature, but some people may regard its use as a privacy issue + if arguments.enable_osm: + value = 'osm' if arguments.enable_osm == 'True' else '' + _zoph_configure('maps.provider', value) + + if arguments.admin_user: + # Edit the database to rename the admin user to FreedomBox admin user. + admin_user = arguments.admin_user + if not re.match(r'^[\w.@][\w.@-]+\Z', admin_user, flags=re.ASCII): + # Check to avoid SQL injection + raise ValueError('Invalid username') + + query = f"UPDATE zoph_users SET user_name='{admin_user}' \ + WHERE user_name='admin';" + + subprocess.run(['mysql', _get_db_name()], input=query.encode(), + check=True) + + +def subcommand_is_configured(_): + """Print whether zoph app is configured.""" + subprocess.run(['zoph', '--get-config', 'interface.user.remote'], + check=True) + + +def subcommand_dump_database(_): + """Dump database to file.""" + db_name = _get_db_name() + os.makedirs(os.path.dirname(DB_BACKUP_FILE), exist_ok=True) + with open(DB_BACKUP_FILE, 'w') as db_backup_file: + subprocess.run(['mysqldump', db_name], stdout=db_backup_file, + check=True) + + +def subcommand_restore_database(_): + """Restore database from file.""" + db_name = _get_db_name() + subprocess.run(['mysqladmin', '--force', 'drop', db_name]) + 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) + + +def main(): + """Parse arguments and perform all duties.""" + arguments = parse_arguments() + + subcommand = arguments.subcommand.replace('-', '_') + subcommand_method = globals()['subcommand_' + subcommand] + subcommand_method(arguments) + + +if __name__ == '__main__': + main() diff --git a/debian/copyright b/debian/copyright index 3491ea7f6..c0cdc3f70 100644 --- a/debian/copyright +++ b/debian/copyright @@ -69,6 +69,8 @@ Files: static/themes/default/icons/diaspora.png static/themes/default/icons/privoxy.png static/themes/default/icons/privoxy.svg static/themes/default/icons/radicale.svg + static/themes/default/icons/zoph.png + static/themes/default/icons/zoph.svg static/themes/default/img/network-connection.svg static/themes/default/img/network-connection-vertical.svg static/themes/default/img/network-ethernet.svg diff --git a/plinth/modules/zoph/__init__.py b/plinth/modules/zoph/__init__.py new file mode 100644 index 000000000..94cc8dd45 --- /dev/null +++ b/plinth/modules/zoph/__init__.py @@ -0,0 +1,130 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +FreedomBox app to configure Zoph web application +""" + +import json +import logging + +from django.utils.translation import ugettext_lazy as _ + +from plinth import actions +from plinth import app as app_module +from plinth import cfg, frontpage, menu +from plinth.modules.apache.components import Webserver +from plinth.modules.backups.components import BackupRestore +from plinth.modules.firewall.components import Firewall +from plinth.utils import format_lazy + +from . import manifest + +logger = logging.getLogger(__name__) + +version = 1 + +managed_packages = ['zoph'] + +_description = [ + format_lazy( + _('Zoph manages your photo collection. Photos are stored on your ' + '{box_name}, under your control. Instead of focusing on galleries ' + 'for public display, Zoph focuses on managing them for your own ' + 'use, organizing them by who took them, where they were taken, ' + 'and who is in them. Photos can be linked to multiple hierarchical ' + 'albums and categories. It is easy to find all photos containing a ' + 'person, or photos taken on a date, or photos taken at a location ' + 'using search, map and calendar views. Individual photos can be ' + 'shared with others by sending a direct link.'), + box_name=_(cfg.box_name)), + format_lazy( + _('The {box_name} user who setup Zoph will also become the ' + 'administrator in Zoph. For additional users, accounts must be ' + 'created both in {box_name} and in Zoph with the same user name.'), + box_name=_(cfg.box_name)) +] + +app = None + + +class ZophApp(app_module.App): + """FreedomBox app for Zoph.""" + + app_id = 'zoph' + + def __init__(self): + """Create components for the app.""" + super().__init__() + info = app_module.Info(app_id=self.app_id, version=version, + name=_('Zoph'), icon_filename='zoph', + short_description=_('Photo Organizer'), + description=_description, manual_page='Zoph', + clients=manifest.clients) + self.add(info) + + menu_item = menu.Menu('menu-zoph', info.name, info.short_description, + info.icon_filename, 'zoph:index', + parent_url_name='apps') + self.add(menu_item) + + shortcut = frontpage.Shortcut('shortcut-zoph', info.name, + short_description=info.short_description, + icon=info.icon_filename, url='/zoph/', + clients=info.clients, + login_required=True) + self.add(shortcut) + + firewall = Firewall('firewall-zoph', info.name, + ports=['http', 'https'], is_external=True) + self.add(firewall) + + webserver = Webserver('webserver-zoph', 'zoph', + urls=['https://{host}/zoph/']) + self.add(webserver) + + backup_restore = ZophBackupRestore('backup-restore-zoph', + **manifest.backup) + self.add(backup_restore) + + +def setup(helper, old_version=None): + """Install and configure the module.""" + helper.call('pre', actions.superuser_run, 'zoph', ['pre-install']) + helper.install(managed_packages) + helper.call('post', actions.superuser_run, 'zoph', ['setup']) + helper.call('post', app.enable) + + +def set_configuration(admin_user=None, enable_osm=None): + """Configure Zoph.""" + args = [] + if admin_user: + args += ['--admin-user', admin_user] + + if enable_osm is not None: + args += ['--enable-osm', str(enable_osm)] + + actions.superuser_run('zoph', ['set-configuration'] + args) + + +def is_configured(): + """Return whether the Zoph app is configured.""" + output = actions.superuser_run('zoph', ['is-configured']) + return output.strip() == 'true' + + +def get_configuration(): + """Return full configuration of Zoph.""" + configuration = actions.superuser_run('zoph', ['get-configuration']) + return json.loads(configuration) + + +class ZophBackupRestore(BackupRestore): + """Component to backup/restore Zoph database""" + + def backup_pre(self, packet): + """Save database contents.""" + actions.superuser_run('zoph', ['dump-database']) + + def restore_post(self, packet): + """Restore database contents.""" + actions.superuser_run('zoph', ['restore-database']) diff --git a/plinth/modules/zoph/data/etc/plinth/modules-enabled/zoph b/plinth/modules/zoph/data/etc/plinth/modules-enabled/zoph new file mode 100644 index 000000000..a33721589 --- /dev/null +++ b/plinth/modules/zoph/data/etc/plinth/modules-enabled/zoph @@ -0,0 +1 @@ +plinth.modules.zoph diff --git a/plinth/modules/zoph/forms.py b/plinth/modules/zoph/forms.py new file mode 100644 index 000000000..11a149e88 --- /dev/null +++ b/plinth/modules/zoph/forms.py @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +FreedomBox app for configuring Zoph. +""" + +from django import forms +from django.utils.translation import ugettext_lazy as _ + + +class ZophForm(forms.Form): + """Zoph application configuration form.""" + + enable_osm = forms.BooleanField( + label=_('Enable OpenStreetMap for maps'), required=False, + help_text=_('When enabled, requests will be made to OpenStreetMap ' + 'servers from user\'s browser. This impacts privacy.')) diff --git a/plinth/modules/zoph/manifest.py b/plinth/modules/zoph/manifest.py new file mode 100644 index 000000000..bf6ea5268 --- /dev/null +++ b/plinth/modules/zoph/manifest.py @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later + +from django.utils.translation import ugettext_lazy as _ + +clients = [{ + 'name': _('Zoph'), + 'platforms': [{ + 'type': 'web', + 'url': '/zoph/', + }] +}] + +backup = { + 'data': { + 'files': ['/var/lib/plinth/backups-data/zoph-database.sql'], + 'directories': ['/var/lib/zoph/'] + }, + 'secrets': { + 'files': ['/etc/zoph.ini'], + } +} diff --git a/plinth/modules/zoph/templates/zoph-pre-setup.html b/plinth/modules/zoph/templates/zoph-pre-setup.html new file mode 100644 index 000000000..0eb12544e --- /dev/null +++ b/plinth/modules/zoph/templates/zoph-pre-setup.html @@ -0,0 +1,31 @@ +{% extends "app.html" %} +{% comment %} +# SPDX-License-Identifier: AGPL-3.0-or-later +{% endcomment %} + +{% load bootstrap %} +{% load i18n %} + +{% block pagetitle %} +

{{ name }}

+{% endblock %} + + +{% block configuration %} +

{% trans "Setup" %}

+ +

+ {% blocktrans trimmed with username=request.user.username %} + User account {{ username }} will become the administrator + account for Zoph. + {% endblocktrans %} +

+ +
+ {% csrf_token %} + + +
+ +{% endblock %} diff --git a/plinth/modules/zoph/tests/__init__.py b/plinth/modules/zoph/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/plinth/modules/zoph/tests/test_functional.py b/plinth/modules/zoph/tests/test_functional.py new file mode 100644 index 000000000..f0ebab73a --- /dev/null +++ b/plinth/modules/zoph/tests/test_functional.py @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for zoph app. +""" + +from pytest_bdd import given, parsers, scenarios + +from plinth.tests import functional + +scenarios('zoph.feature') + + +@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') + button = session_browser.find_by_css('input[name="zoph_setup"]') + if button: + functional.submit(session_browser, element=button) diff --git a/plinth/modules/zoph/tests/zoph.feature b/plinth/modules/zoph/tests/zoph.feature new file mode 100644 index 000000000..e7c655794 --- /dev/null +++ b/plinth/modules/zoph/tests/zoph.feature @@ -0,0 +1,27 @@ +# 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 diff --git a/plinth/modules/zoph/urls.py b/plinth/modules/zoph/urls.py new file mode 100644 index 000000000..15e49d964 --- /dev/null +++ b/plinth/modules/zoph/urls.py @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +URLs for the Zoph module. +""" + +from django.conf.urls import url + +from .views import SetupView, ZophAppView + +urlpatterns = [ + url(r'^apps/zoph/setup/$', SetupView.as_view(), name='setup'), + url(r'^apps/zoph/$', ZophAppView.as_view(app_id='zoph'), name='index') +] diff --git a/plinth/modules/zoph/views.py b/plinth/modules/zoph/views.py new file mode 100644 index 000000000..067179853 --- /dev/null +++ b/plinth/modules/zoph/views.py @@ -0,0 +1,74 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +FreedomBox app for configuring Zoph photo organiser. +""" + +import logging + +from django.contrib import messages +from django.http import HttpResponseRedirect +from django.shortcuts import redirect +from django.urls import reverse_lazy +from django.utils.translation import ugettext as _ +from django.views.generic import TemplateView + +from plinth import views +from plinth.errors import ActionError +from plinth.modules import zoph + +from .forms import ZophForm + +logger = logging.getLogger(__name__) + + +class SetupView(TemplateView): + """Show zoph setup page.""" + template_name = 'zoph-pre-setup.html' + success_url = reverse_lazy('zoph:index') + + def get_context_data(self, *args, **kwargs): + """Provide context data to the template.""" + context = super().get_context_data(**kwargs) + context['title'] = zoph.app.info.name + context['app_info'] = zoph.app.info + return context + + def post(self, _request, *args, **kwargs): + """Handle form submission.""" + admin_user = self.request.user.get_username() + zoph.set_configuration(admin_user=admin_user) + return HttpResponseRedirect(reverse_lazy('zoph:index')) + + +class ZophAppView(views.AppView): + """App configuration page.""" + form_class = ZophForm + app_id = 'zoph' + + def dispatch(self, request, *args, **kwargs): + """Redirect to setup page if setup is not done yet.""" + if not zoph.is_configured(): + return redirect('zoph:setup') + + return super().dispatch(request, *args, **kwargs) + + def get_initial(self): + """Get the current settings from Zoph.""" + status = super().get_initial() + config = zoph.get_configuration() + status['enable_osm'] = (config['maps.provider'] == 'osm') + return status + + def form_valid(self, form): + """Apply the changes submitted in the form.""" + old_status = form.initial + new_status = form.cleaned_data + if old_status['enable_osm'] != new_status['enable_osm']: + try: + zoph.set_configuration(enable_osm=new_status['enable_osm']) + messages.success(self.request, _('Configuration updated.')) + except ActionError: + messages.error(self.request, + _('An error occurred during configuration.')) + + return super().form_valid(form) diff --git a/static/themes/default/icons/zoph.png b/static/themes/default/icons/zoph.png new file mode 100644 index 0000000000000000000000000000000000000000..cc8b9d0930fff65df2896378e883ee4d4a2b3b85 GIT binary patch literal 29654 zcmY&=byyW&)b&u8Zls$Fg489XySp2tySux)QzQfd>6UH~5tI^^vQ<05w||PZw%QGbbx|Glto`|E?1JcU9cW)7HfuP%v}wGN;z` zw6b%ya^HElVF$0%{NE$I+%2pCTTf3{0d{tKJ0~YI3pOV&4?7E6Ge<`@3x7N7En@(n z2IQs0wR}Gu_4uSh=lx#a2H1TMn4McyUE&ZX#t03=Zz*{t@24PSF0CNo=GFBO!$a^< zSo&y%lGj|)&8=c3A%V+n#!ecK+BpS~cD3s-MSujuAX^nZK671=A|H0k~R{WPHHB@{wxTO9WP9oC_tXo^ZRvEa@C z+rjgIWC=hAt_Ha6fXa(LZizlyoZ?RI>ut6_xnhz_cHbXVzn7vtpJXa~K>!}qCvC7( z;U4M6n?kNO6WD)JTv;aLlVTKyHQipf^$F9C|HB3@DXxqTLW#>Ri-NAIO`fjRRsXh! z@*kjby9S>B8)xsM9{(5P%NPrfV$Gc zaq&=`e>NevF(J1;vcf5)G7)gxYLU7oL0PX5HyA>>WQB7Oq|&Vx8rg&P6}M!C(@GJ+ zJK3(^hH2buXIp8<6`2uVUR{0c>LSyre#J6Qd42gNTq9l%8a_9tt)!$xO_@?nQ4V)D z4+KBB+W2%&r2?dkgVpuD0?5S`u6;VyBh8Z{=rKcXh|P;+>0{8SVIchXslFxEH{I zu@!t++op0P;cMRKi*Qg(pz?P7*{$Vz9<6XUO^E^BhilAI16@ogoQZ<}zY!Gr*5s%| z=Pf}Q9HZ_(#~vAP;A;L~LoLr1CWCdDHSH~PWi`1hi6QoDPVVj+$kgt)Tmt^w#9{~} z#5K`e7?QDzZZz+_NM>4j~F9~1+h$)oRqrOY!TI) z%zI~48gEog$W(tEav42IC^bse=EYE?#+q{Wc15zOz$iR;O$-vb9>^rDPcRa*iX(@j z{^U$>$;4=OemV8pYuFYR3YrO%m;3p=hb^DUY)v>y@60ARwLF36b?o4PJ;61FiZMk&<*AD& zf!l}DyoKqHU=09J%lq&eF;=FO-U+}KM4^%PPITq_knLE=pDs_q0rnnfv}lMCLdB@n zI1N;AA|;D-ds0>G*rXT!LP-ESjfn&6$%kU{ki)ba(w?*=w-RS zxN@x2zkAH``!D3;OW&_Qwa^UGtw==g_Q|5U*aJ7vO<<2_F`|i-e}f!ADp&r?;1KBp@K4r@WL^7HdwB}1QQ>1>Stn^06I?YnQL8{j^;s>zd9|6NEK zG56hiE&A0kXKgrd)`r8|8G|wfnJ1s3J6bf;?>D@DIxYsJvAH=3c?;Y1@LJi?$w@n) z^XX)TYzR1^S|>=s{I4C71S1!7XyG5#h^Yc^;Y4oFA`lAaro(aWG5%YD8GwBH=o>1p z%`=Qp{AvF70YC-Tdpp8zAHK1YR$4fEj=;}R7#fXxhPZ`abUW;abGHSabweCSsTFqm`dLAMy?NJT>B4&A25N;N!e} zcRSHBn*-O~uq*zp)P(vI*c*(N;%^k->TqeZ&W}5lc0#EWHbXv9vmaT++MG!@_+nz4 z&;F)Yo7-+UDNpgA`NWUy z?d@fdPrp`r1OSCz?TUSJ=w}v%7iOgA`W`H?OyAJ|I%_%%albJLtyLs>BUlZr!iXq- zPe}YI2pk|`F;i*=bktqt<>@+w=s5WxCx z=uq?*a}ZraEWEb#?w=LSEG#T$XE*(j2tqn@E>OSG1NC#DCj#xI>)^U~mvRa8`qVGf z;^=`LSw8g{f*2AmtTm{z0QcV{i=m24^~jv*$&SczA~bB9J$a-$6sVLObT;)7Pye)P zFiA(9QbPgSMHOP`n}XK?7%x+{+!&*7FHJu+1-OZmWDp|;z9SQEeONl?adL8sIux!b zl_}-;hKc~k-!|{zwHVV3^(7@WE?uPUMsww)6V*SxBS!|O!q`xu5WrB1N}5!@>cQ`M z)LIXhM)^Y^4D;2xWf+2MXE{C}mUYJ6A0LD|LW3ki4jzbn6)RqRs%!?_f5Q}ca&p2B zKcy4UZCnxa!#=<=mP)M?;?SzS7LLKVrwLFNkflk`k?cj9+S=}2oJ&1+ZMe2?&Q7|K zi#%1TZa&^!lrn)FAG|^d3t=#z2RW;K-yxU z9KVM;(^6FClrCBQou`cdQt{st1~jIDD-r6UA(Dpwib0K8D^L8s`Pakg)AQ+oCC^4} z8(WUB2oYXZA<~%~N2sjICp&6vOYj8_BU4{cLgPlvQ?0HFb0Tq!{O_3_@A~dNY+DVW z_;D-a-g zC;s-k_X%G|mDK7VKM5JTN*baEn#YMb)G+E;81d!a{>j&)WpYGuM&26j(&<1h(C~gY zex#8YLb;7K^Yv|y(zv%ExP8DMLzMWawiA+Vb-pkeNZNO2*oQg@BMAqc71?UiL>2oO z=VulhR6!?{Z#WL#Hg)fSZ)p&@-)FL7V&ct+#&VZ;Um*lCtW~7&+CG(Bu@WgVw1uIQ zyT||{JY3+*!&=N*U$s9QKztcp#LCJV)cF?<8}xVUxP#xmef!KZ?gH$wJhG4`(2{CH zfv%P4kZ1O1B>#Ybc%2zvA*{YhY>Ci<0tzAGkWfp`G@6~3ccBE16(nNkyZdw96C&wW zK*v(Y=~ejBv5cx}ut0yb4}KF%#Q&mIs+U{Ln)>QCq+f@Zpq~#B=HNJYIS^>1laNI6 zm4b0|Uxu@ci_%4Y*6EEK$y(28Z1lJt4|&RQ?f6i&HEhl?Y_6^}sbuEvj+YMI#y^q# z36xATf|%ooC&2nH1ByCkiT58)otmAEC^$Y&_d^gUIN{G3&-$~v8eCtOAqWqyUb@hM zfq^x;$VWPwVXXt=yzjo}BkWr~A*Vj$kZVU@URMw-fY`Va{{p;yC;>iBdV{_bHMJ=* zWZIUS4)a_nrLK+*5rO9R>ABm(N}*~)9*SkTPHkViyBgs7n0 z1!USrjKDC0w{;6gbNU`l%v^07j`Z^L$$TG<$74sg%Hr;DO#v|-yoLowQxZs{uh69Q z_X{Bb0RbE|CM9ZJ?M*+CA5x;*-d(zFZEaMGgol`rv$JptQquc16q*-8dPjc31SIz7 zS@x|>d?GU#u>uwp1%7A8rm?9h{J54?8$RS0F;EN(14piF1?$ahA}PS=EuFkIHNBcF z2aR7@S;2@f)h861WHuqa1x;b$^6F}Dh$+6X7}!^mvCq%JwWC{iJfWg&UK5p?6=$*` z|Fm0LzGTvuth^H~w<*U-7{Nh}dDU|h2?N9${f4(t+l|&#ukXARB_|0Oh|F z6`5K!6s{suFETaeYD8*v5>$ikGkpJzz3$H*3(B!VWv;INv%LK6C_%=;>)9F`Ik1-k zARuhU99!lK&HPh8XMcXgH5sZAKXNBMyvaeo$29)IS7F~lQd07TBJ_QHw3-5v!v2#j zx4(~-)%H|KXoOY$YZRNw!nX_=^1MSZN`=YQ!Mi@e=oIgyjr)b9XmKalCuk^Bc8`mS@?}{_h1K!I*!YrTmgYYBD=RRihll#C z1tX7-Gk180`impN;MO^5{=SApZ2U88VQ_(ka>~_C9B0lDD%dfHf(Nd$Un8(Y@ag55 z{wOqTN40-F-}N`Ku!*?g7Ty1PUCds3sHxD{+8Vc=Wi=<)d5*kQ+!Sa|5(vKEo=z^itUOsVFc1g1t%mItvc=^z>AVG33dGF)NN@ zSDxuDwof^WRm^{7{QiA1>V!3y$jja2*5!gaEU}YXoGFSCE!RX(4EC9Fgf!(fOpvQo z28os70VBYW(2ksHR-zRhZnkZuq8=< z9+%BgIQ6B5LI6qhep%)D4~#i%*0YxkVT>C0XpHxAJDQ%lOO^G zSpGefV2G`g{|XX8X`MkLQ;I8-fy$793!Wz*4cp>(WkF817;tC7JBRZ1{+Y@NR%6Oa zzz8a9==}mInhe<_0gy%}E?J=RGMbwB(J``Gagp#iQPAM?1YTT>qskdqVOOgDwFA%2 z9G8{O*4J)-Kbis+szui*;V^j9SR76TCJNffL{qBcT5L3y@j+8qzd6UyhUcJtW50d# zpe6T!BhP>-_n;-Gc>R3XmhTxUr4g!y##{b_bViAEt8bY*6jVtv+L%FQ-~d%40&uV2 z!vPB1pF~@m0^SP|lT!Y~QP^OoMT7r3N+m`xGGRm#J@(lm5~qPB|D5!%4!yNLVK_A{ zd9rCh0NH?8gJn-NS}brYsIb4Lq@q$c=f3G?0sLnNASBTpz&bq5Uk*lT77AG*cHld< zH8-hQ^TN8PfNAp*cr@cMG;Mru#=*?oE>o@EilZwzHK$X-BqW-<2?f{TP;U=XdO(GQN`O?1Zi%Aj>h*^QW zM?7XdQ9{DFo{`bAB6b8K&0i|UvX|N6;bDolugRGZ6l+2kN;^@26(b3VlSyD~DUtNNHe74raJM)ZXeUNoO#_ETUIt;(}LH@1a zj5}cJ*Wc)+?eL-f&>z+@W0qR>Yt_P@Z}IlTaf2(j5W)Z*og6SSw0uKHsVb4KK=$O` z*xZA8+SxV$xUXN_;UuCfPbO7Phvsv9U1=1Q%%BlQ8!DR&4lrAGXEE{kCIzdLely zTc^E1g^xTrGwlaZo(&`;Fg!}phPAeONzvhcb3gAOAZUV0rqiqG>s$uuN3$qa`k=`Z zq{%V#pMNkH;(oKL$kA%zw9HK$9i~z-nK`7u1za6Z6k$y7KK&3=6%@+R?lAi{0A?*?epn+uEZL7@o|5)m=ZZ1JS_ z;nmLFOo&WftH{Kn8h#6eZt=IjV{7s8EN-oR1;Q(3HX=vw06W}T19IvOO@)n{hx364 zDsyjd=lbZPblCgEy~ES6@$CtzhHZwN942=o= zju)IHW#Zob;hj89T;9IEQJ*(O*g-cAd}v>8Ztm@xhtKaMIFR=ekWzn?l=v2cxvtdn z6)96&p?bEYrw3D5SlHIZMb;w$8LP|VCDJ%H2uGxhAe>P`j)5jt;`*K1bzC}%I8H==l#w; zq1#w6zeYUSa)R*BHJ>Cj#5nW5)zpMjixEUAAko7yF4)YA+_w`7JDU&_AIS#D8t#Os zLo`(dreqN6vFO{=QG&m@UQFXVd$Pz9f< z%iFPIN_-PdOi6iR0y=deVh{*KWC%84BF?dM?1WRIWzncNK}@_S8}h=`;?pv;?Jij= z94V72?Y1fpO-F^|%Y#c91cvEjkrHPT?yA}M63bl=Kt7q_17(Fl19?J4ksoJ4AC{PY znt2@J;^Lxd>mrsD8#dkG2CUBHX>Y1t5hZNSK57MAiADn)*%x{;CF(|ZXJ`yxUyqB_ zN2c}>Q&GK`*jxYCY3#r)89-z&Oa$oZY`6zK1rd{yOX;c-EwlMJMR)XsYe3WGp?Gdk zJXB}~Dim))R~V%m30C=ntgWv#73a?jSE zg&m!>lFNk{&xEimW|3ls(z4Lr5K|NF5}objyV#%&R8dPX32R=}iwX!Vvdhne0B2-# zs_)?HH>Outqh~8*r`Og}vUdn=uaJo5tsR*VZ~M_q;RW z`)b~}j&5>0SZJtQalR2lwK))hEd78A$5%Mkeg|60!fsDgO4W z4h~2|u!g1M_{a$x`o9`g19c%pqAv^V4IPziZg>*UL2ofaNhm3wJrwr)WV06BB5_=W zVnCWWF{xnW+aAg?8?RiPV{4B@HgtH)ZFo~(B4u>zl~-};;NpP*!`F)V>yT|`lYs>G z-uBaTULKyatopz*+YlNAkQwfK>gx01v;R#Op103b!@{mBa)u*@5;n9E3L>ue=;?4} ze=rfxnv0&v4f979h9gs}t(f64v9a5}H9Zz+eKOvT<3OZ1K5oDLE1j5}*uUZWD`}5j zU5cAfnuSyvTGjnJ{goj<1#_l>IQRQ|9P|Az^LK&0U2SdRk8ew=yO39}t|Yluvk}S& z1O)}p9-dq~j1+M3qd$pG2>!Ni-HdxpHL4o&FQKGEQ-O+o42X`7W>Zt>lSN@NF@}W7 z3|SmK`U%}Ua@o2#thI@-E8>+*+g9aCBTn14yzh0w)QTGz_%|0u#t50b*xNhMk|<9> zwbcK*v%?TRKy6^SWIDAw|4IG=UNr-mWxR@mT_y_-0~rwh_+bRByXIKkE@D){Fq=AhQsz#8GV%wH8+2R`Iv*kCbl=oViC3%YzdHH!T3rkm8D8H)LSXtSrK`N)Sz0#1zei9D`r zOU^qwiP+AvBB1EuYI1X4xN-PUDt9KY{=y0z1|SqB5F`r!#l zynjW|C&g4|l&mXQ^tX=gMJ@vkqHs@7yU&fvyLzkUg$-}s0Y}a(Oa*Pi4r-n@9$d7_ zT|i6mQ49+~jv?cPi{_K^F?FpK+C0+5{UEiadR;`Ykm|o*0o3 z#X*Td!<|tWNDj(Q zQ9taf4GLmMN^Wnr^4o*2NO^d8i)RVZ_2Of7`BRGVz9&u3uhkzgV8jgNzJI@b(@Lc+ zmmYb3{=oP0CrW6)^7I$ryxQJdZ*X36R~bARhM`I(ssZ_2-xL7sRs33rh|(Ef6X-Di|`>+>X1Q(H^XZepAcH3~kY zaCCOwIp!rz0`19^eanAuwp!O4dA~VG3*RLkxS7%So`}63(xZYM)6>)@nQb+pG`YTb z<>rz(nVTog8~gX& znR*CrV(Wggfh%KaNe~1DRrVX1P*menNcSpc`!X8_CT0oPGDXFNg$Vo43d02=L7kEW z(sO64CU;pjZU?`_#xkNT@xbdS*;CR7Ne;R$1h_9#Q#fD0{)`y&3vK)I zDV!I>`4{qH?+EvSF}@EetHl%~(0*y=C_t_vC27F;oWj5|b8UBYa8P2kcW1|1$osjm z#A3ynm(934_GUGt{@}dl(72}FZ+cOubE-kdki42IWz_9-RoJM@`_-)GY=A#8RK5xw zfstPNZ)cRd+r?I?&x5*xn0PS(E3E>XFcN^KhBn9udQCleoWW45v5#D=`q>=M>mqDI z!5l-sFd=mRnU*g)M*N@g5@qNfMMSO3ZLZ(egK%1~?Q~$yQkPh)ic-9FU5&P&t#S;h zZK>8@gO6Zv;%Jrfy2sqvxp&XMr>BQL<#cZ^RHn2tu3=|q=Q}45B>rixy8gc|t=oQ; zvW$+k2r1U#wz9S+4K6xW!w88q6GKJ*-cW2xBZ&&1{#k=B;yXd+o9!PnuQFzk-r81$ z%J_$L?m@-@mZ4A!k~8wK=&j;ecjSWu%oqthBRw%6RbEnOz5kaBplWU6qsq?HZ7kOm zk7W!2$r&4e_E;&}shICykFpSv*FP*GgS5YW7Y!Qx4$%&l@MrpB4cZPPdNK(VB?e99 z5%OPkX%G-O_rutgO+ZtrS4JpB3{$&BBXl!90XVenrnsyuFo z#GV{(U?(EA@+;_MEvg)WyinQDwGJJxD_Bu z(>KbE8QPB=DG@>^t%V#HQ0TFwsxZ@#W6g~uq>`}Xg{>A3BEFeoLN3ELrbM9u%>&5t zxeowj`KxsDvFjb1+AR8J+qG{kGuXFK!Pc7oIXc)}T7WAfz*u;R*JOvN9TVT2tctS` zR#y}Mu)CVtOEP`yj}wjXgPS=`-12>i1Db*dN&z9B0FttkjpOUepbjJjCU*l5O|Z-N%eee(| zn!iqzBcNtoqFpd5UM5RPgQ$~$L_R4=Fs$Un1^ihNZi$ZdbLBhI)7KwcYU}Nd{!QqW zCX9nYjaSJ!{70Rk=p)Q0*x#BILzC)Vi}4$=w~74ZXcqP*BF>^J)e)*z1xqZQ;O(

HyHiW^^~=b~k~X@$*5wJBJ&H8%FsqH&6$v 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 DY;X4B literal 0 HcmV?d00001 diff --git a/static/themes/default/icons/zoph.svg b/static/themes/default/icons/zoph.svg new file mode 100644 index 000000000..f718e008a --- /dev/null +++ b/static/themes/default/icons/zoph.svg @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Jakub Steiner + + + http://jimmac.musichall.cz + Photo Camera + + + camera + photo + SLR + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f83c763ab718d7286111bc12536aea4e80159392 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 9 Feb 2021 19:42:22 -0500 Subject: [PATCH 11/20] upgrades: Only check free space bytes before dist upgrade Remove the percentage check, which was incorrectly checking used percent, not free percent. Closes: #2046. Tests: - Fill up disk space so that 4.5G is free. Dist upgrade does not start due to not enough free space. - Fill up disk space so that 5.5G is free. Dist upgrade can be started. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- actions/upgrades | 7 +++---- plinth/modules/upgrades/__init__.py | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/actions/upgrades b/actions/upgrades index b52e01499..87f20888b 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -366,10 +366,9 @@ def _check_dist_upgrade(test_upgrade=False): if check_dist == 'testing' and not test_upgrade: return (False, 'test-not-set') - output = subprocess.check_output(['df', '--output=avail,pcent', '/']) - output = output.decode().split('\n')[1].split() - free_space, free_percent = int(output[0]), int(output[1][:-1]) - if free_space < 5000000 or free_percent < 10: + output = subprocess.check_output(['df', '--output=avail', '/']) + free_space = int(output.decode().split('\n')[1]) + if free_space < 5000000: return (False, 'not-enough-free-space') logging.info('Upgrading from %s to %s...', dist, codename) diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 5bd6c62f5..e6ca2d2aa 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -209,11 +209,10 @@ def check_dist_upgrade(_): logger.warning('Skip dist upgrade: Not enough free space in /.') title = ugettext_noop('Could not start distribution update') message = ugettext_noop( - # xgettext:no-python-format 'There is not enough free space in the root partition to ' - 'start the distribution update. Please ensure at least 5 GB, ' - 'and at least 10% of the total space, is free. Distribution ' - 'update will be retried after 24 hours, if enabled.') + 'start the distribution update. Please ensure at least 5 GB ' + 'is free. Distribution update will be retried after 24 hours,' + ' if enabled.') Notification.update_or_create( id='upgrades-dist-upgrade-free-space', app_id='upgrades', severity='warning', title=title, message=message, actions=[{ From 72716366c1af38930132b8d979ff98eca19aeee0 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 7 Feb 2021 20:30:03 -0500 Subject: [PATCH 12/20] upgrades: Add 10 minute delay before apt update Ensure that plinth is fully started so that it can detect the apt update, and perform force_upgrades. Test: Perform dist upgrade. At the end, all packages have been upgraded. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- actions/upgrades | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/actions/upgrades b/actions/upgrades index 87f20888b..f5740fa64 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -12,6 +12,7 @@ import pathlib import re import subprocess import sys +import time from plinth.action_utils import (apt_hold, debconf_set_selections, run_apt_command, service_daemon_reload, @@ -452,7 +453,9 @@ def _perform_dist_upgrade(): print('Restarting FreedomBox service...', flush=True) service_restart('plinth') - # Update apt cache again to trigger force_upgrades. + # After 10 minutes, update apt cache again to trigger force_upgrades. + print('Waiting for 10 minutes...', flush=True) + time.sleep(10 * 60) print('Updating Apt cache...', flush=True) run_apt_command(['update']) From 4db96b17e5de087d40f3618ca0cd84a988d54ccd Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sun, 7 Feb 2021 15:39:46 -0500 Subject: [PATCH 13/20] upgrades: Disable apt snapshots during dist upgrade Take a snapshot before dist upgrade, if supported. Tests: - Ran dist upgrade test with apt snapshots enabled. Snapshot is taken at beginning. Apt snapshots are enabled at end. - Ran dist upgrade test with apt snapshots disabled. Snapshot is taken at beginning. Apt snapshots are disabled at end. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- actions/upgrades | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/actions/upgrades b/actions/upgrades index f5740fa64..5e7e711be 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -18,6 +18,9 @@ from plinth.action_utils import (apt_hold, debconf_set_selections, run_apt_command, service_daemon_reload, service_restart) from plinth.modules.apache.components import check_url +from plinth.modules.snapshot import (is_apt_snapshots_enabled, is_supported as + snapshot_is_supported, load_augeas as + snapshot_load_augeas) from plinth.modules.upgrades import (BACKPORTS_SOURCES_LIST, SOURCES_LIST, get_current_release, is_backports_current) @@ -397,6 +400,26 @@ def _check_dist_upgrade(test_upgrade=False): def _perform_dist_upgrade(): """Perform upgrade to next release of Debian.""" + # Take a snapshot if supported and enabled, then disable snapshots. + snapshots_supported = snapshot_is_supported() + if snapshots_supported: + print('Taking a snapshot before dist upgrade...', flush=True) + subprocess.run(['/usr/share/plinth/actions/snapshot', 'create'], + check=True) + aug = snapshot_load_augeas() + apt_snapshots_enabled = is_apt_snapshots_enabled(aug) + if apt_snapshots_enabled: + print('Disable apt snapshots during dist upgrade...', flush=True) + subprocess.run([ + '/usr/share/plinth/actions/snapshot', 'disable-apt-snapshot', + 'yes' + ], check=True) + else: + print('Apt snapshots already disabled.', flush=True) + else: + print('Snapshots are not supported, skip taking a snapshot.', + flush=True) + # Hold freedombox package during entire dist upgrade. print('Holding freedombox package...', flush=True) with apt_hold(): @@ -448,6 +471,13 @@ def _perform_dist_upgrade(): print('Running unattended-upgrade...', flush=True) subprocess.run(['unattended-upgrade', '--verbose']) + # Restore original snapshots configuration. + if snapshots_supported and apt_snapshots_enabled: + print('Re-enable apt snapshots...', flush=True) + subprocess.run([ + '/usr/share/plinth/actions/snapshot', 'disable-apt-snapshot', 'no' + ], check=True) + # Restart FreedomBox service to ensure it is using the latest # dependencies. print('Restarting FreedomBox service...', flush=True) From 9d7793e53d6bd616f7d5e48f5dc80d53f939e695 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 10 Feb 2021 13:25:13 -0800 Subject: [PATCH 14/20] zoph: Make app unavailable in Buster Closes: #2050. Current implementation of Zoph does not work with version 0.9.9 in Buster. As an easy hack to make the app only available in Bullseye, php7.4 dependency has been added. After making the last release for Buster, this can be removed to allow compatibility with newer versions of PHP that become available. An incomplete list of problems with current implementation with Buster: - zoph --get-config is unavailable. Can be circumvented by querying the DB directly. - zoph --dump-config is unavailable. Can be circumvented by querying the DB directly. - interface.user.remote and authentication based on REMOTE_USER are unavailable. The Apache configuration shipped by Debian package does not include FreedomBox related LDAP configuration. - interface.user.cli defaults to "0" instead of "1". This cases running zoph from command line. This can be circumvented by setting this configuration value to "1" via DB interaction. Tests: - On stable container, zoph is not available for installation. - On testing container, zoph can be installed, setup and used. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/zoph/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plinth/modules/zoph/__init__.py b/plinth/modules/zoph/__init__.py index 94cc8dd45..60a9ec00d 100644 --- a/plinth/modules/zoph/__init__.py +++ b/plinth/modules/zoph/__init__.py @@ -22,7 +22,11 @@ logger = logging.getLogger(__name__) version = 1 -managed_packages = ['zoph'] +# XXX: This implementation of Zoph does not work with version 0.9.9 in Buster. +# As an easy hack to make the app only available in Bullseye, php7.4 dependency +# has been added. After making the last release for Buster, this can be removed +# to allow compatibility with newer versions of PHP that become available. +managed_packages = ['zoph', 'php7.4'] _description = [ format_lazy( From d4139098a37db6492a7f4811326a439410921346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Couderc?= Date: Sat, 6 Feb 2021 19:57:35 +0000 Subject: [PATCH 15/20] sharing: Improve shares group access description Reviewed-by: Sunil Mohan Adapa --- plinth/modules/sharing/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/sharing/forms.py b/plinth/modules/sharing/forms.py index 29b067e8c..78f3ec1fd 100644 --- a/plinth/modules/sharing/forms.py +++ b/plinth/modules/sharing/forms.py @@ -31,7 +31,7 @@ class AddShareForm(forms.Form): groups = forms.MultipleChoiceField( choices=UsersAndGroups.get_group_choices, widget=forms.CheckboxSelectMultiple, required=False, - label=_('User groups that can read the files in the share'), + label=_('User groups that can read the files in the share:'), help_text=_( 'Users of the selected user groups will be able to read the ' 'files in the share.')) From 0915c30ef9c0d141a10a4f5a981bb3ff0ce778ed Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Fri, 9 Oct 2020 16:23:45 +0000 Subject: [PATCH 16/20] HACKING: Link download page for Geckodriver. Reviewed-by: Sunil Mohan Adapa --- HACKING.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/HACKING.md b/HACKING.md index 4ad6b9301..630f96e11 100644 --- a/HACKING.md +++ b/HACKING.md @@ -396,9 +396,11 @@ host$ sudo apt install xvfb python3-pytest-xvfb # optional, to avoid opening br host$ sudo apt install smbclient # optional, to test samba ``` -- Install the latest version of geckodriver. It is usually a single binary which - you can place at /usr/local/bin/geckodriver . Geckodriver will use whichever - binary is named 'firefox' for launching the browser and interacting with it. +- Install the latest version of + [geckodriver](https://github.com/mozilla/geckodriver/releases). It is usually + a single binary which you can place at `/usr/local/bin/geckodriver` . + Geckodriver will use whichever binary is named 'firefox' for launching the + browser and interacting with it. #### Run FreedomBox Service From 0e893c6404a70edbfa772830d4da95d855654bee Mon Sep 17 00:00:00 2001 From: Fioddor Superconcentrado Date: Wed, 10 Feb 2021 18:01:18 +0000 Subject: [PATCH 17/20] Translated using Weblate (Spanish) Currently translated at 99.9% (1440 of 1441 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 8603a1eee..b675ac6e4 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-02-09 19:11-0500\n" -"PO-Revision-Date: 2021-02-03 16:41+0000\n" +"PO-Revision-Date: 2021-02-11 18:50+0000\n" "Last-Translator: Fioddor Superconcentrado \n" "Language-Team: Spanish \n" @@ -180,10 +180,8 @@ msgstr "" "lograron. El último fallo es: {error_message}" #: plinth/modules/backups/__init__.py:250 -#, fuzzy -#| msgid "Existing Backups" msgid "Error During Backup" -msgstr "Copias de seguridad existentes" +msgstr "Error al respaldar" #: plinth/modules/backups/forms.py:33 #, python-brace-format @@ -660,10 +658,8 @@ msgid "Backup schedule updated." msgstr "Calendario de respaldos actualizado." #: plinth/modules/backups/views.py:74 -#, fuzzy -#| msgid "Create Backup" msgid "Schedule Backups" -msgstr "Crear copia de seguridad" +msgstr "Agendar respaldos" #: plinth/modules/backups/views.py:106 msgid "Archive created." @@ -7092,7 +7088,7 @@ msgstr "FreedomBox actualizado" #: plinth/modules/upgrades/__init__.py:210 msgid "Could not start distribution update" -msgstr "" +msgstr "No se pudo iniciar la actualización de la distribución" #: plinth/modules/upgrades/__init__.py:213 #, no-python-format @@ -7102,17 +7098,21 @@ msgid "" "total space, is free. Distribution update will be retried after 24 hours, if " "enabled." msgstr "" +"No hay suficiente espacio libre en la partición raíz para iniciar la " +"actualización de la distrbución. Por favor, asegure que al menos 5 GB y un " +"10% del espacio libre total están libres. Si está habilitada, la " +"actualización de la distribución se reintentará tras 24h ." #: plinth/modules/upgrades/__init__.py:224 -#, fuzzy -#| msgid "Distribution upgrade disabled" msgid "Distribution update started" -msgstr "Actualización automática de distibución desactivada" +msgstr "Iniciada la actualización de la distribución" #: plinth/modules/upgrades/__init__.py:226 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" +"Se inició la actualización a la nueva publicación estable. Podría llevar " +"mucho tiempo completarla." #: plinth/modules/upgrades/forms.py:15 msgid "Enable auto-update" From 9328cf3fe8773afcd07f90991ccd1cb3bf7a09db Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 11 Feb 2021 17:24:46 -0500 Subject: [PATCH 18/20] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/ar_SA/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/bg/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/bn/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/cs/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/da/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/de/LC_MESSAGES/django.po | 75 ++++++++++++++++--- plinth/locale/django.pot | 71 +++++++++++++++--- plinth/locale/el/LC_MESSAGES/django.po | 75 ++++++++++++++++--- plinth/locale/es/LC_MESSAGES/django.po | 81 ++++++++++++++++++--- plinth/locale/fa/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/fake/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/fr/LC_MESSAGES/django.po | 75 ++++++++++++++++--- plinth/locale/gl/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/gu/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/hi/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/hu/LC_MESSAGES/django.po | 75 ++++++++++++++++--- plinth/locale/id/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/it/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/ja/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/kn/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/lt/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/nb/LC_MESSAGES/django.po | 75 ++++++++++++++++--- plinth/locale/nl/LC_MESSAGES/django.po | 81 ++++++++++++++++++--- plinth/locale/pl/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/pt/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/ru/LC_MESSAGES/django.po | 75 ++++++++++++++++--- plinth/locale/sl/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/sr/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/sv/LC_MESSAGES/django.po | 76 ++++++++++++++++--- plinth/locale/ta/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/te/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/tr/LC_MESSAGES/django.po | 81 ++++++++++++++++++--- plinth/locale/uk/LC_MESSAGES/django.po | 71 +++++++++++++++--- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 73 ++++++++++++++++--- plinth/locale/zh_Hant/LC_MESSAGES/django.po | 71 +++++++++++++++--- 35 files changed, 2181 insertions(+), 385 deletions(-) diff --git a/plinth/locale/ar_SA/LC_MESSAGES/django.po b/plinth/locale/ar_SA/LC_MESSAGES/django.po index 47d1b8089..5c0ed09ca 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2020-06-10 15:41+0000\n" "Last-Translator: aiman an \n" "Language-Team: Arabic (Saudi Arabia) %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index bf590a35d..0e176bdbe 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Bulgarian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index 4b066c837..6397d66c5 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-01 18:42+0000\n" "Last-Translator: Oymate \n" "Language-Team: Bengali %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index aa86019b9..986897de1 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-25 11:32+0000\n" "Last-Translator: Milan \n" "Language-Team: Czech %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index ff6a079a1..e1197a684 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Danish %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index edd91de35..05f6d3982 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-06 03:51+0000\n" "Last-Translator: nautilusx \n" "Language-Team: German %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 275da5b8a..66df4d940 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -835,13 +835,13 @@ msgstr "" #: plinth/modules/bepasty/views.py:91 plinth/modules/searx/views.py:38 #: plinth/modules/searx/views.py:49 plinth/modules/tor/views.py:130 -#: plinth/modules/tor/views.py:157 +#: plinth/modules/tor/views.py:157 plinth/modules/zoph/views.py:69 msgid "Configuration updated." msgstr "" #: plinth/modules/bepasty/views.py:94 plinth/modules/gitweb/views.py:117 #: plinth/modules/searx/views.py:41 plinth/modules/searx/views.py:52 -#: plinth/modules/tor/views.py:159 +#: plinth/modules/tor/views.py:159 plinth/modules/zoph/views.py:72 msgid "An error occurred during configuration." msgstr "" @@ -5265,7 +5265,7 @@ msgid "Make files in this folder available to anyone with the link." msgstr "" #: plinth/modules/sharing/forms.py:34 -msgid "User groups that can read the files in the share" +msgid "User groups that can read the files in the share:" msgstr "" #: plinth/modules/sharing/forms.py:36 @@ -6159,20 +6159,18 @@ msgstr "" msgid "Could not start distribution update" msgstr "" -#: plinth/modules/upgrades/__init__.py:213 -#, no-python-format +#: plinth/modules/upgrades/__init__.py:212 msgid "" "There is not enough free space in the root partition to start the " -"distribution update. Please ensure at least 5 GB, and at least 10% of the " -"total space, is free. Distribution update will be retried after 24 hours, if " -"enabled." +"distribution update. Please ensure at least 5 GB is free. Distribution " +"update will be retried after 24 hours, if enabled." msgstr "" -#: plinth/modules/upgrades/__init__.py:224 +#: plinth/modules/upgrades/__init__.py:223 msgid "Distribution update started" msgstr "" -#: plinth/modules/upgrades/__init__.py:226 +#: plinth/modules/upgrades/__init__.py:225 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6896,6 +6894,57 @@ msgstr "" msgid "Server deleted." msgstr "" +#: plinth/modules/zoph/__init__.py:33 +#, python-brace-format +msgid "" +"Zoph manages your photo collection. Photos are stored on your {box_name}, " +"under your control. Instead of focusing on galleries for public display, " +"Zoph focuses on managing them for your own use, organizing them by who took " +"them, where they were taken, and who is in them. Photos can be linked to " +"multiple hierarchical albums and categories. It is easy to find all photos " +"containing a person, or photos taken on a date, or photos taken at a " +"location using search, map and calendar views. Individual photos can be " +"shared with others by sending a direct link." +msgstr "" + +#: plinth/modules/zoph/__init__.py:44 +#, python-brace-format +msgid "" +"The {box_name} user who setup Zoph will also become the administrator in " +"Zoph. For additional users, accounts must be created both in {box_name} and " +"in Zoph with the same user name." +msgstr "" + +#: plinth/modules/zoph/__init__.py:62 plinth/modules/zoph/manifest.py:6 +msgid "Zoph" +msgstr "" + +#: plinth/modules/zoph/__init__.py:63 +msgid "Photo Organizer" +msgstr "" + +#: plinth/modules/zoph/forms.py:14 +msgid "Enable OpenStreetMap for maps" +msgstr "" + +#: plinth/modules/zoph/forms.py:15 +msgid "" +"When enabled, requests will be made to OpenStreetMap servers from user's " +"browser. This impacts privacy." +msgstr "" + +#: plinth/modules/zoph/templates/zoph-pre-setup.html:15 +#: plinth/modules/zoph/templates/zoph-pre-setup.html:28 +msgid "Setup" +msgstr "" + +#: plinth/modules/zoph/templates/zoph-pre-setup.html:18 +#, python-format +msgid "" +"User account %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index 9a5d5bf4f..71be22323 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-09 23:50+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index b675ac6e4..819f06bea 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-11 18:50+0000\n" "Last-Translator: Fioddor Superconcentrado \n" "Language-Team: Spanish %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index f2ed8656e..97d130849 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Persian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index ca910e80d..effd43c8c 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPOE" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index b7a8c6469..1072eb3a9 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-06 03:51+0000\n" "Last-Translator: Coucouf \n" "Language-Team: French %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index d81ded8eb..7f02102da 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Galician %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 85a203ab7..06c325e89 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Gujarati %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index 1df3b2724..5251c6b83 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hindi %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "पीपीपीअोइ" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 280c44723..f25e736cb 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-01 18:42+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Hungarian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 52eb4f64a..f18ebce62 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2018-11-02 00:44+0000\n" "Last-Translator: ButterflyOfFire \n" "Language-Team: Indonesian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index f68304c04..90455f3e0 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-01 18:42+0000\n" "Last-Translator: Dietmar \n" "Language-Team: Italian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 907206b53..452abc14a 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -836,13 +836,13 @@ msgstr "" #: plinth/modules/bepasty/views.py:91 plinth/modules/searx/views.py:38 #: plinth/modules/searx/views.py:49 plinth/modules/tor/views.py:130 -#: plinth/modules/tor/views.py:157 +#: plinth/modules/tor/views.py:157 plinth/modules/zoph/views.py:69 msgid "Configuration updated." msgstr "" #: plinth/modules/bepasty/views.py:94 plinth/modules/gitweb/views.py:117 #: plinth/modules/searx/views.py:41 plinth/modules/searx/views.py:52 -#: plinth/modules/tor/views.py:159 +#: plinth/modules/tor/views.py:159 plinth/modules/zoph/views.py:72 msgid "An error occurred during configuration." msgstr "" @@ -5266,7 +5266,7 @@ msgid "Make files in this folder available to anyone with the link." msgstr "" #: plinth/modules/sharing/forms.py:34 -msgid "User groups that can read the files in the share" +msgid "User groups that can read the files in the share:" msgstr "" #: plinth/modules/sharing/forms.py:36 @@ -6160,20 +6160,18 @@ msgstr "" msgid "Could not start distribution update" msgstr "" -#: plinth/modules/upgrades/__init__.py:213 -#, no-python-format +#: plinth/modules/upgrades/__init__.py:212 msgid "" "There is not enough free space in the root partition to start the " -"distribution update. Please ensure at least 5 GB, and at least 10% of the " -"total space, is free. Distribution update will be retried after 24 hours, if " -"enabled." +"distribution update. Please ensure at least 5 GB is free. Distribution " +"update will be retried after 24 hours, if enabled." msgstr "" -#: plinth/modules/upgrades/__init__.py:224 +#: plinth/modules/upgrades/__init__.py:223 msgid "Distribution update started" msgstr "" -#: plinth/modules/upgrades/__init__.py:226 +#: plinth/modules/upgrades/__init__.py:225 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6897,6 +6895,57 @@ msgstr "" msgid "Server deleted." msgstr "" +#: plinth/modules/zoph/__init__.py:33 +#, python-brace-format +msgid "" +"Zoph manages your photo collection. Photos are stored on your {box_name}, " +"under your control. Instead of focusing on galleries for public display, " +"Zoph focuses on managing them for your own use, organizing them by who took " +"them, where they were taken, and who is in them. Photos can be linked to " +"multiple hierarchical albums and categories. It is easy to find all photos " +"containing a person, or photos taken on a date, or photos taken at a " +"location using search, map and calendar views. Individual photos can be " +"shared with others by sending a direct link." +msgstr "" + +#: plinth/modules/zoph/__init__.py:44 +#, python-brace-format +msgid "" +"The {box_name} user who setup Zoph will also become the administrator in " +"Zoph. For additional users, accounts must be created both in {box_name} and " +"in Zoph with the same user name." +msgstr "" + +#: plinth/modules/zoph/__init__.py:62 plinth/modules/zoph/manifest.py:6 +msgid "Zoph" +msgstr "" + +#: plinth/modules/zoph/__init__.py:63 +msgid "Photo Organizer" +msgstr "" + +#: plinth/modules/zoph/forms.py:14 +msgid "Enable OpenStreetMap for maps" +msgstr "" + +#: plinth/modules/zoph/forms.py:15 +msgid "" +"When enabled, requests will be made to OpenStreetMap servers from user's " +"browser. This impacts privacy." +msgstr "" + +#: plinth/modules/zoph/templates/zoph-pre-setup.html:15 +#: plinth/modules/zoph/templates/zoph-pre-setup.html:28 +msgid "Setup" +msgstr "" + +#: plinth/modules/zoph/templates/zoph-pre-setup.html:18 +#, python-format +msgid "" +"User account %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index bcfecf9ba..81d1a060f 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2020-07-16 16:41+0000\n" "Last-Translator: Yogesh \n" "Language-Team: Kannada %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index 0ad549d2d..f233225de 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Lithuanian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 6cb7b6e4c..3fa3804b1 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-23 17:44+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 4de6b0486..508650a4a 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-08 06:50+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index 3abc1701f..34f2e03d5 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-01 18:42+0000\n" "Last-Translator: Stanisław Stefan Krukowski \n" "Language-Team: Polish %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index b6371d1c6..56eb11fd5 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Portuguese %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index 0c54c361b..8dfe3ebe0 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-01 18:42+0000\n" "Last-Translator: Алексей Докучаев \n" "Language-Team: Russian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPоE" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index 05cfd5c43..3a89dd7cc 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Slovenian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 08aebe001..370180161 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Serbian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index bddef4d0e..356ba9559 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-08 06:50+0000\n" "Last-Translator: Michael Breidenbach \n" "Language-Team: Swedish %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "Pppoe" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index a9735f332..5593a5ac1 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -836,13 +836,13 @@ msgstr "" #: plinth/modules/bepasty/views.py:91 plinth/modules/searx/views.py:38 #: plinth/modules/searx/views.py:49 plinth/modules/tor/views.py:130 -#: plinth/modules/tor/views.py:157 +#: plinth/modules/tor/views.py:157 plinth/modules/zoph/views.py:69 msgid "Configuration updated." msgstr "" #: plinth/modules/bepasty/views.py:94 plinth/modules/gitweb/views.py:117 #: plinth/modules/searx/views.py:41 plinth/modules/searx/views.py:52 -#: plinth/modules/tor/views.py:159 +#: plinth/modules/tor/views.py:159 plinth/modules/zoph/views.py:72 msgid "An error occurred during configuration." msgstr "" @@ -5266,7 +5266,7 @@ msgid "Make files in this folder available to anyone with the link." msgstr "" #: plinth/modules/sharing/forms.py:34 -msgid "User groups that can read the files in the share" +msgid "User groups that can read the files in the share:" msgstr "" #: plinth/modules/sharing/forms.py:36 @@ -6160,20 +6160,18 @@ msgstr "" msgid "Could not start distribution update" msgstr "" -#: plinth/modules/upgrades/__init__.py:213 -#, no-python-format +#: plinth/modules/upgrades/__init__.py:212 msgid "" "There is not enough free space in the root partition to start the " -"distribution update. Please ensure at least 5 GB, and at least 10% of the " -"total space, is free. Distribution update will be retried after 24 hours, if " -"enabled." +"distribution update. Please ensure at least 5 GB is free. Distribution " +"update will be retried after 24 hours, if enabled." msgstr "" -#: plinth/modules/upgrades/__init__.py:224 +#: plinth/modules/upgrades/__init__.py:223 msgid "Distribution update started" msgstr "" -#: plinth/modules/upgrades/__init__.py:226 +#: plinth/modules/upgrades/__init__.py:225 msgid "" "Started update to next stable release. This may take a long time to complete." msgstr "" @@ -6897,6 +6895,57 @@ msgstr "" msgid "Server deleted." msgstr "" +#: plinth/modules/zoph/__init__.py:33 +#, python-brace-format +msgid "" +"Zoph manages your photo collection. Photos are stored on your {box_name}, " +"under your control. Instead of focusing on galleries for public display, " +"Zoph focuses on managing them for your own use, organizing them by who took " +"them, where they were taken, and who is in them. Photos can be linked to " +"multiple hierarchical albums and categories. It is easy to find all photos " +"containing a person, or photos taken on a date, or photos taken at a " +"location using search, map and calendar views. Individual photos can be " +"shared with others by sending a direct link." +msgstr "" + +#: plinth/modules/zoph/__init__.py:44 +#, python-brace-format +msgid "" +"The {box_name} user who setup Zoph will also become the administrator in " +"Zoph. For additional users, accounts must be created both in {box_name} and " +"in Zoph with the same user name." +msgstr "" + +#: plinth/modules/zoph/__init__.py:62 plinth/modules/zoph/manifest.py:6 +msgid "Zoph" +msgstr "" + +#: plinth/modules/zoph/__init__.py:63 +msgid "Photo Organizer" +msgstr "" + +#: plinth/modules/zoph/forms.py:14 +msgid "Enable OpenStreetMap for maps" +msgstr "" + +#: plinth/modules/zoph/forms.py:15 +msgid "" +"When enabled, requests will be made to OpenStreetMap servers from user's " +"browser. This impacts privacy." +msgstr "" + +#: plinth/modules/zoph/templates/zoph-pre-setup.html:15 +#: plinth/modules/zoph/templates/zoph-pre-setup.html:28 +msgid "Setup" +msgstr "" + +#: plinth/modules/zoph/templates/zoph-pre-setup.html:18 +#, python-format +msgid "" +"User account %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index 3c23d3364..0dca77ec7 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2020-10-26 13:27+0000\n" "Last-Translator: Praveen Illa \n" "Language-Team: Telugu %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "పిపిపిఒఇ" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 4b0fc7a82..3d77d44d7 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-02-08 06:50+0000\n" "Last-Translator: Burak Yavuz \n" "Language-Team: Turkish %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index 12231ecf5..c78e10bab 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Ukrainian %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index 63eb58412..5c5107af5 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-18 12:32+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Chinese (Simplified) %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "PPPoE" diff --git a/plinth/locale/zh_Hant/LC_MESSAGES/django.po b/plinth/locale/zh_Hant/LC_MESSAGES/django.po index bb7ab4baf..2d3299366 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-02-09 19:11-0500\n" +"POT-Creation-Date: 2021-02-11 17:23-0500\n" "PO-Revision-Date: 2021-01-25 11:32+0000\n" "Last-Translator: crlambda \n" "Language-Team: Chinese (Traditional) %(username)s will become the administrator " +"account for Zoph." +msgstr "" + #: plinth/network.py:29 msgid "PPPoE" msgstr "" From 8e36d61ba42e366452152033e0f591cb6516efd4 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Thu, 11 Feb 2021 17:59:28 -0500 Subject: [PATCH 19/20] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/ReleaseNotes.raw.wiki | 15 +++++++ doc/manual/en/ejabberd.raw.wiki | 34 +++++++++++++++- doc/manual/en/images/xmpp-clients_en_V01.png | Bin 0 -> 72812 bytes doc/manual/es/ReleaseNotes.raw.wiki | 15 +++++++ doc/manual/es/ejabberd.raw.wiki | 39 ++++++++++++++++--- doc/manual/es/images/xmpp-clients_en_V01.png | Bin 0 -> 72812 bytes 6 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 doc/manual/en/images/xmpp-clients_en_V01.png create mode 100644 doc/manual/es/images/xmpp-clients_en_V01.png diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki index 15650d433..79a872be1 100644 --- a/doc/manual/en/ReleaseNotes.raw.wiki +++ b/doc/manual/en/ReleaseNotes.raw.wiki @@ -10,6 +10,21 @@ 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.3 (2021-02-11) == + +=== Highlights === + + * zoph: Add new app to organize photos + * Only available in Debian testing (bullseye) due to issues in buster. + +=== Other Changes === + + * locale: Update translations for Dutch, Greek, Spanish, Swedish, Turkish + * sharing: Improve shares group access description + * upgrades: Add 10 minute delay before apt update + * upgrades: Disable apt snapshots during dist upgrade + * upgrades: Only check free space bytes before dist upgrade + == FreedomBox 21.2 (2021-02-05) == === Highlights === diff --git a/doc/manual/en/ejabberd.raw.wiki b/doc/manual/en/ejabberd.raw.wiki index 63a0aa120..7689159c0 100644 --- a/doc/manual/en/ejabberd.raw.wiki +++ b/doc/manual/en/ejabberd.raw.wiki @@ -60,7 +60,9 @@ If your !FreedomBox is behind a router, you will need to set up port forwarding === Compatible clients === * !FreedomBox provides a web client: [[FreedomBox/Manual/JSXC|JSXC]]. - * [[https://xmpp.org/software/clients.html|XMPP clients]] are available for various desktop and mobile platforms. + * [[https://xmpp.org/software/clients.html|XMPP clients]] are available for various desktop and mobile platforms. !FreedomBox links to the download sources of some of them. Feel free to include more [[https://wiki.debian.org/FreedomBox/Manual/ejabberd?action=edit&editor=text|here]] (needs free registration). We'll notice and might list them in !FreedomBox. + +{{attachment:xmpp-clients_en_V01.png|XMPP clients}} ==== Mobile clients ==== @@ -68,7 +70,7 @@ You can download an XMPP client for your smartphone or tablet among the ones lis ===== Conversations (Android) ===== -[[https://conversations.im/|Conversations]] is an Android XMPP client available on [[https://f-droid.org/packages/eu.siacs.conversations|F-Droid]] or the [[https://play.google.com/store/apps/details?id=eu.siacs.conversations|Play Store]]. In addition to text messaging, you can use Conversations to send images and have group chats. +[[https://conversations.im/|Conversations]] is an Android XMPP client with videochat support available on [[https://f-droid.org/packages/eu.siacs.conversations|F-Droid]] or the [[https://play.google.com/store/apps/details?id=eu.siacs.conversations|Play Store]]. In addition to text messaging, you can use Conversations to send images and have group chats. || {{attachment:conversations-first-screen.png|Conversations - First screen|width=200}} {{attachment:conversations-login.png|Conversations - Login|width=200}} {{attachment:conversations-add-contacts.png|Conversations - Add contacts|width=200}}|| @@ -80,6 +82,22 @@ With ejabberd installed, the !FreedomBox provides an XMPP account for every !Fre Once logged into a FreedomBox/XMPP account (2), the Conversation app provides a + button that brings up a few choices to contact other people (3). +===== Movim (Android) ===== + +[[https://movim.eu/|Movim]] is a free software XMPP client with videochat support for Android available on [[https://f-droid.org/packages/com.movim.movim/|F-Droid]]. + +===== ChatSecure (iOS) ===== + +[[https://chatsecure.org|ChatSecure]] is a free software XMPP client with videochat support available from the [[https://apps.apple.com/us/app/chatsecure/id464200063|App Store]]. + +===== Monal (iOS) ===== + +[[https://monal.im|Monal]] is a free software XMPP client with videochat support available from the [[https://apps.apple.com/us/app/monal-free-xmpp-chat/id317711500|App Store]]. + +===== Siskin (iOS) ===== + +[[https://siskin.im|Siskin]] is a free software XMPP client with videochat support available from the [[https://apps.apple.com/us/app/tigase-messenger/id1153516838|App Store]]. + ==== Desktop clients ==== ===== Gajim (Windows, MacOS, Linux) ===== @@ -107,6 +125,14 @@ When first starting Dino after installation, click on the `Setup account` button Once you have logged in, you will be able to either start a conversation with one of your XMPP contacts or to join a channel (3). +===== Movim (Linux) ===== + +[[https://movim.eu/|Movim]] is a free software XMPP client with videochat support for Linux. The project provides an unofficial Debian package. + +===== Monal (MacOS) ===== + +[[https://monal.im|Monal]] is a free software XMPP client with videochat support available from the [[https://apps.apple.com/app/id1499227291?mt=12|Mac App Store]]. + === External links === @@ -117,6 +143,10 @@ Clients' sites: * Conversations: https://conversations.im * Gajim: https://gajim.org * Dino: https://github.com/dino/dino + * Movim: https://movim.eu + * !ChatSecure: https://chatsecure.org + * Monal: https://monal.im + * Siskin: https://siskin.im ## END_INCLUDE diff --git a/doc/manual/en/images/xmpp-clients_en_V01.png b/doc/manual/en/images/xmpp-clients_en_V01.png new file mode 100644 index 0000000000000000000000000000000000000000..17ff606527bf0f95c690044ce09326b0343f5a72 GIT binary patch literal 72812 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 {{attachment:FreedomBox/Manual/ejabberd/conversations-first-screen.png|Conversations - Primera pantalla|width=200}} {{attachment:FreedomBox/Manual/ejabberd/conversations-login.png|Conversations - Pantalla de acceso|width=200}} {{attachment:FreedomBox/Manual/ejabberd/conversations-add-contacts.png|Conversations - Añadir contactos|width=200}}|| @@ -76,7 +78,23 @@ All abrir Conversations por primera vez se te preguntará si quieres crear una c Con ejabberd instalado !FreedomBox proporciona una cuenta XMPP a cada usuario. Se pueden crear usuarios (no-administradores) !FreedomBox en ''Sistema'' -> [[es/FreedomBox/Manual/Users|Usuarios y Grupos]]. -Una vez ingresado en tu cuenta !Freedombox/XMPP la app Conversation proporciona un botón + que ofrece varias opciones para contactar a otra gente (3). +Una vez ingresado en tu cuenta !Freedombox/XMPP la app Conversations proporciona un botón + que ofrece varias opciones para contactar a otra gente (3). + +===== Movim (Android) ===== + +[[https://movim.eu/|Movim]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://f-droid.org/packages/com.movim.movim/|F-Droid]]. + +===== ChatSecure (iOS) ===== + +[[https://chatsecure.org|ChatSecure]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/us/app/chatsecure/id464200063|App Store]]. + +===== Monal (iOS) ===== + +[[https://monal.im|Monal]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/us/app/monal-free-xmpp-chat/id317711500|App Store]]. + +===== Siskin (iOS) ===== + +[[https://siskin.im|Siskin]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/us/app/tigase-messenger/id1153516838|App Store]]. ==== Clientes de escritorio ==== @@ -105,6 +123,14 @@ Tras la instalación, al abrir Dino por primera vez haz clic en el botón `Confi Una vez ingreses podrás comenzar una conversación con algún contacto XMPP o unirte a un canal (3). +===== Movim (Linux) ===== + +[[https://movim.eu/|Movim]] es un cliente XMPP libre para Linux con soporte a videollamadas. El proyecto proporciona un paquete Debian extraoficial. + +===== Monal (MacOS) ===== + +[[https://monal.im|Monal]] es un cliente XMPP libre con soporte a videollamadas disponible en [[https://apps.apple.com/app/id1499227291?mt=12|Mac App Store]]. + === Enlaces externos === * Sitio web: https://www.ejabberd.im @@ -114,7 +140,10 @@ Sitios de aplicaciones cliente: * Conversations: https://conversations.im * Gajim: https://gajim.org * Dino: https://dino.im - + * Movim: https://movim.eu + * !ChatSecure: https://chatsecure.org + * Monal: https://monal.im + * Siskin: https://siskin.im ## END_INCLUDE diff --git a/doc/manual/es/images/xmpp-clients_en_V01.png b/doc/manual/es/images/xmpp-clients_en_V01.png new file mode 100644 index 0000000000000000000000000000000000000000..17ff606527bf0f95c690044ce09326b0343f5a72 GIT binary patch literal 72812 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 Date: Thu, 11 Feb 2021 18:00:16 -0500 Subject: [PATCH 20/20] Release v21.3 to unstable Signed-off-by: James Valleroy --- debian/changelog | 43 +++++++++++++++++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index b9bfd27f4..dd6b803d6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,46 @@ +freedombox (21.3) unstable; urgency=medium + + [ Oğuz Ersen ] + * Translated using Weblate (Turkish) + + [ ikmaak ] + * Translated using Weblate (Dutch) + + [ Burak Yavuz ] + * Translated using Weblate (Turkish) + + [ Michael Breidenbach ] + * Translated using Weblate (Swedish) + + [ Michalis ] + * Translated using Weblate (Greek) + + [ James Valleroy ] + * upgrades: Mark string as no-python-format + * locale: Update translation strings + * upgrades: Only check free space bytes before dist upgrade + * upgrades: Add 10 minute delay before apt update + * upgrades: Disable apt snapshots during dist upgrade + * locale: Update translation strings + * doc: Fetch latest manual + + [ John Lines ] + * gitignore: Ignore files generated during package build + * zoph: Add new app to organize photos + + [ Sunil Mohan Adapa ] + * tests: functional: Introduce step def. to check if app is enabled + * zoph: Make app unavailable in Buster + + [ Aurélien Couderc ] + * sharing: Improve shares group access description + + [ Fioddor Superconcentrado ] + * HACKING: Link download page for Geckodriver. + * Translated using Weblate (Spanish) + + -- James Valleroy Thu, 11 Feb 2021 17:59:49 -0500 + freedombox (21.2) unstable; urgency=medium [ Burak Yavuz ] diff --git a/plinth/__init__.py b/plinth/__init__.py index 66139952b..ba82630a0 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '21.2' +__version__ = '21.3'