Compare commits

...

8 Commits

24 changed files with 1671 additions and 210 deletions

View File

@ -2,12 +2,19 @@ from django import forms
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from orchestra.utils.python import random_ascii
from django.forms.widgets import HiddenInput
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from orchestra.forms.widgets import SpanWidget
from orchestra.forms import widgets
from django.utils.safestring import mark_safe
from orchestra.contrib.domains.models import Domain, Record from orchestra.contrib.domains.models import Domain, Record
from orchestra.contrib.mailboxes.models import Address, Mailbox from orchestra.contrib.mailboxes.models import Address, Mailbox
from orchestra.contrib.systemusers.models import WebappUsers, SystemUser from orchestra.contrib.systemusers.models import WebappUsers, SystemUser
from orchestra.contrib.saas.models import SaaS
from orchestra.contrib.musician.validators import ValidateZoneMixin from orchestra.contrib.musician.validators import ValidateZoneMixin
from . import api from . import api

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-08-06 09:39+0000\n" "POT-Creation-Date: 2024-11-08 10:19+0000\n"
"PO-Revision-Date: 2021-11-25 12:53+0100\n" "PO-Revision-Date: 2021-11-25 12:53+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@ -30,19 +30,19 @@ msgstr "No trobem cap objecte que coincideixi amb la teva consulta"
msgid "No mailbox found matching the query" msgid "No mailbox found matching the query"
msgstr "No trobem cap bústia que coincideixi amb la teva consulta" msgstr "No trobem cap bústia que coincideixi amb la teva consulta"
#: forms.py:35 forms.py:104 #: forms.py:42 forms.py:111
msgid "The two password fields didnt match." msgid "The two password fields didnt match."
msgstr "Les contrasenyes introduïdes no coincideixen." msgstr "Les contrasenyes introduïdes no coincideixen."
#: forms.py:38 forms.py:108 #: forms.py:45 forms.py:115
msgid "Password" msgid "Password"
msgstr "Contrasenya" msgstr "Contrasenya"
#: forms.py:43 forms.py:113 #: forms.py:50 forms.py:120
msgid "Password confirmation" msgid "Password confirmation"
msgstr "Confirma la contrasenya" msgstr "Confirma la contrasenya"
#: forms.py:46 forms.py:116 #: forms.py:53 forms.py:123
msgid "Enter the same password as before, for verification." msgid "Enter the same password as before, for verification."
msgstr "Introdueix la mateixa contrasenya per verificar-la." msgstr "Introdueix la mateixa contrasenya per verificar-la."
@ -56,13 +56,14 @@ msgid "Mailing lists"
msgstr "Llistes de correu" msgstr "Llistes de correu"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:17 views.py:68 #: mixins.py:17 views.py:119
msgid "Dashboard" msgid "Dashboard"
msgstr "Panell de gestió" msgstr "Panell de gestió"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:18 templates/musician/dashboard.html:89 #: mixins.py:18 templates/musician/dashboard.html:106
#: templates/musician/dashboard.html:90 views.py:202 #: templates/musician/dashboard.html:107
#: templates/musician/websites/website_detail.html:17 views.py:259
msgid "Domains" msgid "Domains"
msgstr "Dominis" msgstr "Dominis"
@ -71,28 +72,33 @@ msgid "Mails"
msgstr "Correus" msgstr "Correus"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:21 models.py:146 views.py:542 #: mixins.py:21 models.py:146 views.py:599
msgid "Databases" msgid "Databases"
msgstr "Bases de dades" msgstr "Bases de dades"
msgid "Database"
msgstr "Bases de dades"
#: mixins.py:22 #: mixins.py:22
msgid "SaaS" msgid "SaaS"
msgstr "SaaS" msgstr "SaaS"
#: mixins.py:23
msgid "Nextcloud"
msgstr "Nextcloud"
#: mixins.py:24
msgid "Community WP"
msgstr "WP Comunitari"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:23 websites/views.py:24 #: mixins.py:25 websites/views.py:24
msgid "Websites" msgid "Websites"
msgstr "" msgstr ""
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:24 webapps/views.py:25 #: mixins.py:26 webapps/views.py:25
msgid "Webapps" msgid "Webapps"
msgstr "" msgstr ""
#: mixins.py:25 #: mixins.py:27
msgid "Users" msgid "Users"
msgstr "Usuaris" msgstr "Usuaris"
@ -101,7 +107,7 @@ msgid "Description details for databases page."
msgstr "Consulta la configuració de les teves bases de dades." msgstr "Consulta la configuració de les teves bases de dades."
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: models.py:234 views.py:342 #: models.py:234 views.py:399
msgid "Mail addresses" msgid "Mail addresses"
msgstr "Adreces de correu" msgstr "Adreces de correu"
@ -135,6 +141,58 @@ msgstr ""
"Si tens algun servei SaaS (Software as a Service) contractat, aquí trobaràs " "Si tens algun servei SaaS (Software as a Service) contractat, aquí trobaràs "
"els seus detalls de configuració." "els seus detalls de configuració."
#: saas/forms.py:16
msgid "Site URL"
msgstr ""
#: saas/forms.py:50
msgid ""
"ID of this blog used by WordPress, the only attribute that doesn't change."
msgstr ""
"ID d'aquest blog utilitzat per WordPress, l'únic atribut que no canvia."
#: saas/forms.py:51 templates/musician/address_list.html:25
msgid "Email"
msgstr "Correu electrònic"
#: saas/forms.py:52
msgid ""
"A new user will be created if the above email address is not in the database."
"<br>The username and password will be mailed to this email address."
msgstr ""
"Es crearà un nou usuari si l'adreça de correu electrònic anterior no és a la base de dades."
"<br>El nom d'usuari i la contrasenya s'enviaran a aquesta adreça de correu electrònic."
#: saas/forms.py:89
#, python-format
msgid "Suggestion: %s"
msgstr "Suggerimet: %s"
#. Translators: This message appears on the page title
#: saas/views.py:24 saas/views.py:38 templates/musician/domain_list.html:51
msgid "Software as a Service"
msgstr "Software as a Service"
#: saas/views.py:25
msgid "Nextcloud Service"
msgstr "Servei Nextcloud"
#: saas/views.py:26
msgid "Members can manage their Nextcloud users in this section."
msgstr "Els socis/ies poden gestionar els seus usuaris de Nextcloud en aquesta secció."
#: saas/views.py:39
msgid "Community WordPress"
msgstr "WordPress comunitari"
#: saas/views.py:40
msgid ""
"Pangea's multisite WordPress service. Members can have their WordPress on "
"this community WordPress hosted and maintained by Pangea."
msgstr ""
"Servei de Wordpress multisite de Pangea. "
"Els socis/ies poden tenir el seu WP en aquest WP comunitari alltijat i mantigut per Pangea."
#: templates/auth/login.html:59 #: templates/auth/login.html:59
msgid "Log in" msgid "Log in"
msgstr "Accedeix" msgstr "Accedeix"
@ -166,6 +224,7 @@ msgstr ""
#: templates/musician/mailbox_check_delete.html:11 #: templates/musician/mailbox_check_delete.html:11
#: templates/musician/mailing_check_delete.html:8 #: templates/musician/mailing_check_delete.html:8
#: templates/musician/record_check_delete.html:9 #: templates/musician/record_check_delete.html:9
#: templates/musician/saas_check_delete.html:8
#: templates/musician/webapps/webappoption_check_delete.html:9 #: templates/musician/webapps/webappoption_check_delete.html:9
#: templates/musician/websites/websiteoption_check_delete.html:13 #: templates/musician/websites/websiteoption_check_delete.html:13
msgid "WARNING: This action cannot be undone." msgid "WARNING: This action cannot be undone."
@ -178,8 +237,12 @@ msgstr "AVÍS: Aquesta acció es irreversible."
#: templates/musician/mailbox_form.html:20 #: templates/musician/mailbox_form.html:20
#: templates/musician/mailing_check_delete.html:9 #: templates/musician/mailing_check_delete.html:9
#: templates/musician/mailinglist_form.html:30 #: templates/musician/mailinglist_form.html:30
#: templates/musician/nextcloud_change_password.html:11
#: templates/musician/record_check_delete.html:11 #: templates/musician/record_check_delete.html:11
#: templates/musician/record_form.html:16 #: templates/musician/record_form.html:16
#: templates/musician/saas_check_delete.html:9
#: templates/musician/saas_nextcloud_form.html:30
#: templates/musician/saas_wordpress_form.html:31
#: templates/musician/systemuser_change_password.html:11 #: templates/musician/systemuser_change_password.html:11
#: templates/musician/webapps/webapp_form.html:11 #: templates/musician/webapps/webapp_form.html:11
#: templates/musician/webapps/webapp_option_form.html:18 #: templates/musician/webapps/webapp_option_form.html:18
@ -199,6 +262,9 @@ msgstr "Cancel·lar"
#: templates/musician/mailinglist_form.html:34 #: templates/musician/mailinglist_form.html:34
#: templates/musician/record_check_delete.html:10 #: templates/musician/record_check_delete.html:10
#: templates/musician/record_form.html:20 #: templates/musician/record_form.html:20
#: templates/musician/saas_check_delete.html:10
#: templates/musician/saas_nextcloud_form.html:35
#: templates/musician/saas_wordpress_form.html:35
#: templates/musician/webapps/webapp_form.html:15 #: templates/musician/webapps/webapp_form.html:15
#: templates/musician/webapps/webappoption_check_delete.html:10 #: templates/musician/webapps/webappoption_check_delete.html:10
#: templates/musician/websites/websiteoption_check_delete.html:14 #: templates/musician/websites/websiteoption_check_delete.html:14
@ -209,7 +275,10 @@ msgstr "Esborrar"
#: templates/musician/mailbox_change_password.html:12 #: templates/musician/mailbox_change_password.html:12
#: templates/musician/mailbox_form.html:21 #: templates/musician/mailbox_form.html:21
#: templates/musician/mailinglist_form.html:31 #: templates/musician/mailinglist_form.html:31
#: templates/musician/nextcloud_change_password.html:12
#: templates/musician/record_form.html:17 #: templates/musician/record_form.html:17
#: templates/musician/saas_nextcloud_form.html:31
#: templates/musician/saas_wordpress_form.html:32
#: templates/musician/systemuser_change_password.html:12 #: templates/musician/systemuser_change_password.html:12
#: templates/musician/webapps/webapp_form.html:12 #: templates/musician/webapps/webapp_form.html:12
#: templates/musician/webapps/webapp_option_form.html:19 #: templates/musician/webapps/webapp_option_form.html:19
@ -229,17 +298,13 @@ msgstr "Filtrat"
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: templates/musician/address_list.html:25
msgid "Email"
msgstr "Correu electrònic"
#: templates/musician/address_list.html:26 #: templates/musician/address_list.html:26
msgid "Domain" msgid "Domain"
msgstr "Domini" msgstr "Domini"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: templates/musician/address_list.html:27 templates/musician/mail_base.html:22 #: templates/musician/address_list.html:27 templates/musician/mail_base.html:22
#: views.py:428 #: views.py:485
msgid "Mailboxes" msgid "Mailboxes"
msgstr "Bústies de correu" msgstr "Bústies de correu"
@ -261,7 +326,7 @@ msgstr "Perfil"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: templates/musician/base.html:71 templates/musician/billing.html:6 #: templates/musician/base.html:71 templates/musician/billing.html:6
#: views.py:300 #: views.py:357
msgid "Billing" msgid "Billing"
msgstr "Factures" msgstr "Factures"
@ -287,8 +352,10 @@ msgstr "Data de la factura"
#: templates/musician/billing.html:21 templates/musician/database_list.html:22 #: templates/musician/billing.html:21 templates/musician/database_list.html:22
#: templates/musician/domain_detail.html:38 #: templates/musician/domain_detail.html:38
#: templates/musician/webapps/webapp_detail.html:94 #: templates/musician/webapps/webapp_detail.html:17
#: templates/musician/webapps/webapp_detail.html:96
#: templates/musician/webapps/webapp_list.html:26 #: templates/musician/webapps/webapp_list.html:26
#: templates/musician/websites/website_list.html:72
msgid "Type" msgid "Type"
msgstr "Tipus" msgstr "Tipus"
@ -322,11 +389,14 @@ msgid "Show history"
msgstr "Mostrar historial" msgstr "Mostrar historial"
#: templates/musician/database_list.html:21 #: templates/musician/database_list.html:21
#: templates/musician/mailbox_list.html:30 templates/musician/saas_list.html:19 #: templates/musician/mailbox_list.html:30
#: templates/musician/mailinglist_list.html:24
#: templates/musician/saas_list.html:19
#: templates/musician/saas_nextcloud_list.html:13
#: templates/musician/saas_wordpress_list.html:13
#: templates/musician/webapps/webapp_list.html:25 #: templates/musician/webapps/webapp_list.html:25
#: templates/musician/websites/website_detail.html:77 #: templates/musician/websites/website_detail.html:77
#: templates/musician/websites/website_list.html:20 #: templates/musician/websites/website_list.html:20
#: templates/musician/mailinglist_list.html:24
msgid "Name" msgid "Name"
msgstr "Nom" msgstr "Nom"
@ -347,13 +417,17 @@ msgstr "Obre el gestor de bases de dades"
#. Translators: database page when there isn't any database. #. Translators: database page when there isn't any database.
#. Translators: saas page when there isn't any saas. #. Translators: saas page when there isn't any saas.
#: templates/musician/database_list.html:58 #: templates/musician/database_list.html:58
#: templates/musician/saas_list.html:53 #: templates/musician/saas_list.html:60
#: templates/musician/saas_nextcloud_list.html:48
#: templates/musician/saas_wordpress_list.html:48
msgid "Ooops! Looks like there is nothing here!" msgid "Ooops! Looks like there is nothing here!"
msgstr "Mmmh, sembla que aquí no hi ha res!" msgstr "Mmmh, sembla que aquí no hi ha res!"
#: templates/musician/domain_detail.html:5 #: templates/musician/domain_detail.html:5
#: templates/musician/mailinglist_form.html:16 #: templates/musician/mailinglist_form.html:16
#: templates/musician/record_form.html:5 #: templates/musician/record_form.html:5
#: templates/musician/saas_nextcloud_form.html:16
#: templates/musician/saas_wordpress_form.html:16
#: templates/musician/webapps/webapp_detail.html:5 #: templates/musician/webapps/webapp_detail.html:5
#: templates/musician/webapps/webapp_option_form.html:7 #: templates/musician/webapps/webapp_option_form.html:7
#: templates/musician/websites/website_create_option_form.html:7 #: templates/musician/websites/website_create_option_form.html:7
@ -393,7 +467,7 @@ msgstr ""
" " " "
#: templates/musician/domain_detail.html:39 #: templates/musician/domain_detail.html:39
#: templates/musician/webapps/webapp_detail.html:95 #: templates/musician/webapps/webapp_detail.html:97
#: templates/musician/websites/website_detail.html:78 #: templates/musician/websites/website_detail.html:78
msgid "Value" msgid "Value"
msgstr "Valor" msgstr "Valor"
@ -439,11 +513,6 @@ msgstr "adreces de correu creades"
msgid "Mail list" msgid "Mail list"
msgstr "Llista de correu" msgstr "Llista de correu"
#. Translators: This message appears on the page title
#: templates/musician/domain_list.html:51 views.py:565
msgid "Software as a Service"
msgstr "Software as a Service"
#: templates/musician/domain_list.html:53 #: templates/musician/domain_list.html:53
msgid "Nothing installed" msgid "Nothing installed"
msgstr "No tens res instal·lat" msgstr "No tens res instal·lat"
@ -497,6 +566,8 @@ msgstr "Adreces de correu"
#: templates/musician/mailbox_change_password.html:5 #: templates/musician/mailbox_change_password.html:5
#: templates/musician/mailbox_form.html:24 #: templates/musician/mailbox_form.html:24
#: templates/musician/nextcloud_change_password.html:5
#: templates/musician/saas_nextcloud_form.html:34
#: templates/musician/systemuser_change_password.html:5 #: templates/musician/systemuser_change_password.html:5
#: templates/musician/webapps/webappuser_change_password.html:5 #: templates/musician/webapps/webappuser_change_password.html:5
msgid "Change password" msgid "Change password"
@ -559,9 +630,11 @@ msgstr "Actualitzar llista"
msgid "Create list" msgid "Create list"
msgstr "Crear llista" msgstr "Crear llista"
#: templates/musician/websites/website_list.html:23
#: templates/musician/saas_list.html:20
#: templates/musician/mailinglist_list.html:25 #: templates/musician/mailinglist_list.html:25
#: templates/musician/saas_list.html:20
#: templates/musician/saas_nextcloud_list.html:14
#: templates/musician/saas_wordpress_list.html:14
#: templates/musician/websites/website_list.html:23
msgid "Status" msgid "Status"
msgstr "Estat" msgstr "Estat"
@ -625,7 +698,15 @@ msgstr "Actualitza la contrasenya a"
msgid "Add record to" msgid "Add record to"
msgstr "Afegir registre a" msgstr "Afegir registre a"
#: templates/musician/saas_check_delete.html:7
#, fuzzy
#| msgid "Are you sure that you want remove the list:"
msgid "Are you sure that you want remove the SaaS:"
msgstr "Estàs segur/a que vols esborrar la següent llista:"
#: templates/musician/saas_list.html:21 #: templates/musician/saas_list.html:21
#: templates/musician/saas_nextcloud_list.html:15
#: templates/musician/saas_wordpress_list.html:15
msgid "Service" msgid "Service"
msgstr "Servei" msgstr "Servei"
@ -633,14 +714,35 @@ msgstr "Servei"
msgid "Service info" msgid "Service info"
msgstr "Informació del servei" msgstr "Informació del servei"
#: templates/musician/saas_list.html:30 #: templates/musician/saas_list.html:31
#: templates/musician/saas_nextcloud_list.html:24
#: templates/musician/saas_wordpress_list.html:24
msgid "Installed on" msgid "Installed on"
msgstr "Instal·lat a" msgstr "Instal·lat a"
#: templates/musician/saas_list.html:37 templates/musician/saas_list.html:39 #: templates/musician/saas_list.html:38 templates/musician/saas_list.html:40
#: templates/musician/saas_nextcloud_list.html:31
#: templates/musician/saas_nextcloud_list.html:33
#: templates/musician/saas_wordpress_list.html:31
#: templates/musician/saas_wordpress_list.html:33
msgid "Open service admin panel" msgid "Open service admin panel"
msgstr "Obre el panell dadministració del servei" msgstr "Obre el panell dadministració del servei"
#: templates/musician/saas_list.html:69
msgid "New SaaS"
msgstr "Nou SaaS"
#: templates/musician/saas_nextcloud_form.html:20
#: templates/musician/saas_wordpress_form.html:20
msgid "Update SaaS"
msgstr "Actualitzar SaaS"
#: templates/musician/saas_nextcloud_form.html:22
#: templates/musician/saas_wordpress_form.html:22
msgid "Create SaaS"
msgstr "Crear SaaS"
#: templates/musician/systemuser_list.html:6 #: templates/musician/systemuser_list.html:6
msgid "" msgid ""
"The main user is your system's main user on each server. You'll be able to " "The main user is your system's main user on each server. You'll be able to "
@ -648,12 +750,13 @@ msgid ""
"but you'll never be able to edit content on a website." "but you'll never be able to edit content on a website."
msgstr "" msgstr ""
"L'usuari principal existeix en cada servidor web. Podrà veure els registres " "L'usuari principal existeix en cada servidor web. Podrà veure els registres "
"dels seus llocs web a (/home/account/logs) i tot el contingut web (/home/account/webapps/*), " "dels seus llocs web a (/home/account/logs) i tot el contingut web (/home/"
"però mai podrà editar el contingut en un lloc web." "account/webapps/*), però mai podrà editar el contingut en un lloc web."
#: templates/musician/systemuser_list.html:7 #: templates/musician/systemuser_list.html:7
msgid "This user only has write permissions in their own directory." msgid "This user only has write permissions in their own directory."
msgstr "Aquest usuari només té permisos d'escriptura en el seu propi directori." msgstr ""
"Aquest usuari només té permisos d'escriptura en el seu propi directori."
#: templates/musician/systemuser_list.html:18 #: templates/musician/systemuser_list.html:18
#: templates/musician/webapps/webappuser_list.html:15 #: templates/musician/webapps/webappuser_list.html:15
@ -661,6 +764,7 @@ msgid "Username"
msgstr "Nom dusuari/a" msgstr "Nom dusuari/a"
#: templates/musician/systemuser_list.html:19 #: templates/musician/systemuser_list.html:19
#: templates/musician/webapps/webapp_detail.html:47
#: templates/musician/webapps/webappuser_list.html:16 #: templates/musician/webapps/webappuser_list.html:16
#: templates/musician/websites/website_detail.html:49 #: templates/musician/websites/website_detail.html:49
msgid "Path" msgid "Path"
@ -674,23 +778,23 @@ msgstr "Usuari Principal"
msgid "SFTP Users" msgid "SFTP Users"
msgstr "Usuaris SFTP" msgstr "Usuaris SFTP"
#: templates/musician/webapps/webapp_detail.html:72
msgid ""
"\n"
" Initial database and App admin password. <br>\n"
" Subsequent changes to the admin password will not be reflected.\n"
" "
msgstr ""
"\n"
"Contrasenya inicial de la base de dades i de l'administrador de l'aplicació. <br>"
"Els canvis posteriors a la contrasenya de l'administrador no es reflectiran.\n"
" "
#: templates/musician/webapps/webapp_detail.html:7 #: templates/musician/webapps/webapp_detail.html:7
msgid "WebApp Options for" msgid "WebApp Options for"
msgstr "Opcions WebApp per" msgstr "Opcions WebApp per"
#: templates/musician/webapps/webapp_detail.html:13
#: templates/musician/webapps/webapp_list.html:29
#: templates/musician/webapps/webappuser_list.html:17
#: templates/musician/websites/website_detail.html:13
#: templates/musician/websites/website_list.html:22
msgid "Server"
msgstr "Servidor"
#: templates/musician/webapps/webapp_detail.html:27
#: templates/musician/websites/website_list.html:82
msgid "SFTP user"
msgstr "Usuari SFTP"
#: templates/musician/webapps/webapp_detail.html:58 #: templates/musician/webapps/webapp_detail.html:58
msgid "Database:" msgid "Database:"
msgstr "Bases de dades" msgstr "Bases de dades"
@ -703,26 +807,37 @@ msgstr "Usuari DB"
msgid "Password:" msgid "Password:"
msgstr "Contrasenya" msgstr "Contrasenya"
#: templates/musician/webapps/webapp_detail.html:80 #: templates/musician/webapps/webapp_detail.html:72
msgid ""
"\n"
" Initial database and App admin password. <br>\n"
" Subsequent changes to the admin password will not be reflected.\n"
" "
msgstr ""
"\n"
"Contrasenya inicial de la base de dades i de l'administrador de l'aplicació. "
"<br>Els canvis posteriors a la contrasenya de l'administrador no es "
"reflectiran.\n"
" "
#: templates/musician/webapps/webapp_detail.html:82
msgid "PHP settings" msgid "PHP settings"
msgstr "Configuració PHP" msgstr "Configuració PHP"
#: templates/musician/webapps/webapp_detail.html:85 #: templates/musician/webapps/webapp_detail.html:87
msgid "PHP settings page description." msgid "PHP settings page description."
msgstr "Consulta aquí la teva configuració DNS." msgstr "Consulta aquí la teva configuració DNS."
#: templates/musician/webapps/webapp_detail.html:117
msgid "This WebApp has PHP options by default, create one if you need it."
msgstr "Aquesta WebApp té les opcions PHP per defecte; crea'n una nova si la necessites."
#: templates/musician/webapps/webapp_detail.html:119 #: templates/musician/webapps/webapp_detail.html:119
msgid "This WebApp has PHP options by default, create one if you need it."
msgstr ""
"Aquesta WebApp té les opcions PHP per defecte; crea'n una nova si la "
"necessites."
#: templates/musician/webapps/webapp_detail.html:121
msgid "Add new option" msgid "Add new option"
msgstr "Afegir nova Opcio" msgstr "Afegir nova Opcio"
#: templates/musician/webapps/webapp_detail.html:27
msgid "SFTP user"
msgstr "Usuari SFTP"
#: templates/musician/webapps/webapp_list.html:27 #: templates/musician/webapps/webapp_list.html:27
msgid "Version" msgid "Version"
msgstr "" msgstr ""
@ -731,12 +846,6 @@ msgstr ""
msgid "SFTP User" msgid "SFTP User"
msgstr "Usuari SFTP" msgstr "Usuari SFTP"
#: templates/musician/webapps/webapp_list.html:29
#: templates/musician/webapps/webappuser_list.html:17
#: templates/musician/websites/website_list.html:22
msgid "Server"
msgstr "Servidor"
#: templates/musician/webapps/webapp_option_form.html:10 #: templates/musician/webapps/webapp_option_form.html:10
msgid "Update Option of" msgid "Update Option of"
msgstr "Actualitza Opcions per" msgstr "Actualitza Opcions per"
@ -755,6 +864,14 @@ msgstr "Estàs segur/a que vols esborrar la següent opció?"
msgid "WebSite Options for" msgid "WebSite Options for"
msgstr "Opcions de WebSite per" msgstr "Opcions de WebSite per"
#: templates/musician/websites/website_detail.html:25
msgid "active"
msgstr "actiu"
#: templates/musician/websites/website_detail.html:32
msgid "Protocol"
msgstr ""
#: templates/musician/websites/website_detail.html:37 #: templates/musician/websites/website_detail.html:37
msgid "Edit options" msgid "Edit options"
msgstr "Editar opcions" msgstr "Editar opcions"
@ -801,51 +918,58 @@ msgstr "Actualitzar Opció de WebSite"
msgid "Url" msgid "Url"
msgstr "" msgstr ""
#: templates/musician/websites/website_list.html:89
#, fuzzy
#| msgid "SFTP user"
msgid "FTP user"
msgstr "Usuari SFTP"
#: validators.py:28 #: validators.py:28
#, python-format #, python-format
msgid "" msgid ""
"%s: Hosts can not have underscore character '_', consider providing a SRV, " "%s: Hosts can not have underscore character '_', consider providing a SRV, "
"CNAME or TXT record." "CNAME or TXT record."
msgstr "" msgstr ""
"%s: Els hosts no poden tenir el caràcter d'èmfasi '_'. Considera proporcionar un registre SRV, CNAME o TXT." "%s: Els hosts no poden tenir el caràcter d'èmfasi '_'. Considera "
"proporcionar un registre SRV, CNAME o TXT."
#: views.py:200 views.py:202 views.py:229 #: views.py:199 views.py:201 views.py:236
msgid "available" msgid "available"
msgstr "disponibles" msgstr "disponibles"
#: views.py:182 #: views.py:239
msgid "Account" msgid "Account"
msgstr "Compte" msgstr "Compte"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:227 #: views.py:284
msgid "User profile" msgid "User profile"
msgstr "El teu perfil" msgstr "El teu perfil"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:314 #: views.py:371
msgid "Download bill" msgid "Download bill"
msgstr "Descarrega la factura" msgstr "Descarrega la factura"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:573 #: views.py:620
msgid "Domain details" msgid "Domain details"
msgstr "Detalls del domini" msgstr "Detalls del domini"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:629 #: views.py:676
msgid "Login" msgid "Login"
msgstr "Accés" msgstr "Accés"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:700 #: views.py:747
msgid "Webapp users" msgid "Webapp users"
msgstr "" msgstr ""
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:718 #: views.py:765
msgid "Main users" msgid "Main users"
msgstr "" msgstr "Usuari principal"
#: webapps/forms.py:62 #: webapps/forms.py:62
msgid "This option already exist." msgid "This option already exist."
@ -856,15 +980,16 @@ msgid ""
"A web app is the directory where your website is stored. Through SFTP, you " "A web app is the directory where your website is stored. Through SFTP, you "
"can access this directory and upload/edit/delete files." "can access this directory and upload/edit/delete files."
msgstr "" msgstr ""
"Una WebApp és el directori on es desa el teu WebSite. " "Una WebApp és el directori on es desa el teu WebSite. A través de SFTP, pots "
"A través de SFTP, pots accedir a aquest directori i pujar, editar o eliminar fitxers." "accedir a aquest directori i pujar, editar o eliminar fitxers."
#: webapps/views.py:35 #: webapps/views.py:35
msgid "" msgid ""
"Each Webapp has its own SFTP user, which is created automatically when the " "Each Webapp has its own SFTP user, which is created automatically when the "
"Webapp is created." "Webapp is created."
msgstr "" msgstr ""
"Cada WebApp té el seu propi usuari SFTP, que es crea automàticament quan es crea l'aplicació web." "Cada WebApp té el seu propi usuari SFTP, que es crea automàticament quan es "
"crea l'aplicació web."
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: webapps/views.py:44 #: webapps/views.py:44
@ -877,7 +1002,8 @@ msgstr "Detalls de cada tipus"
msgid "" msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
msgstr "" msgstr ""
"Mantén premuda la tecla 'Control' o 'Comando' en un Mac per seleccionar més d'un." "Mantén premuda la tecla 'Control' o 'Comando' en un Mac per seleccionar més "
"d'un."
#: websites/forms.py:54 #: websites/forms.py:54
msgid "This Path already exists on this Website." msgid "This Path already exists on this Website."
@ -888,7 +1014,8 @@ msgid ""
"A website is the place where a domain is associated with the directory where " "A website is the place where a domain is associated with the directory where "
"the web files are located. (WebApp)" "the web files are located. (WebApp)"
msgstr "" msgstr ""
"Un WebSite és el lloc on es relaciona un domini amb el directori on es troben els fitxers web. (Aplicació web)" "Un WebSite és el lloc on es relaciona un domini amb el directori on es "
"troben els fitxers web. (Aplicació web)"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: websites/views.py:42 #: websites/views.py:42
@ -897,6 +1024,9 @@ msgstr ""
msgid "website details" msgid "website details"
msgstr "Detalls de cada tipus" msgstr "Detalls de cada tipus"
#~ msgid "Database"
#~ msgstr "Bases de dades"
#, fuzzy #, fuzzy
#~| msgid "Change password" #~| msgid "Change password"
#~ msgid "Change password for" #~ msgid "Change password for"
@ -908,9 +1038,6 @@ msgstr "Detalls de cada tipus"
#~ msgid "Previous" #~ msgid "Previous"
#~ msgstr "Prèvia" #~ msgstr "Prèvia"
#~ msgid "Next"
#~ msgstr "Següent"
#~ msgid "Notifications" #~ msgid "Notifications"
#~ msgstr "Notificacions" #~ msgstr "Notificacions"
@ -928,9 +1055,6 @@ msgstr "Detalls de cada tipus"
#~ msgid "No users for this database." #~ msgid "No users for this database."
#~ msgstr "No hi ha persones usuàries daquesta base de dades." #~ msgstr "No hi ha persones usuàries daquesta base de dades."
#~ msgid "active"
#~ msgstr "actiu"
#~ msgid "Traffic" #~ msgid "Traffic"
#~ msgstr "Tràfic" #~ msgstr "Tràfic"
@ -965,14 +1089,14 @@ msgstr "Detalls de cada tipus"
#~ msgid "databases created" #~ msgid "databases created"
#~ msgstr "bases de dades creades" #~ msgstr "bases de dades creades"
msgid "size" #~ msgid "size"
msgstr "tamany" #~ msgstr "tamany"
msgid "traffic" #~ msgid "traffic"
msgstr "tránsit" #~ msgstr "tránsit"
msgid "Mailman list traffic" #~ msgid "Mailman list traffic"
msgstr "Llistes de Mailman" #~ msgstr "Llistes de Mailman"
msgid "Mailman list Traffic" #~ msgid "Mailman list Traffic"
msgstr "Llistes de Mailman" #~ msgstr "Llistes de Mailman"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-12 10:10+0000\n" "POT-Creation-Date: 2024-11-08 09:37+0000\n"
"PO-Revision-Date: 2021-11-25 12:53+0100\n" "PO-Revision-Date: 2021-11-25 12:53+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@ -30,19 +30,19 @@ msgstr "No hay objetos que coincidan con tu búsqueda"
msgid "No mailbox found matching the query" msgid "No mailbox found matching the query"
msgstr "No hay buzones de correo que coincidan con tu búsqueda" msgstr "No hay buzones de correo que coincidan con tu búsqueda"
#: forms.py:35 forms.py:104 #: forms.py:42 forms.py:111
msgid "The two password fields didnt match." msgid "The two password fields didnt match."
msgstr "Las contraseñas introducidas no coinciden." msgstr "Las contraseñas introducidas no coinciden."
#: forms.py:38 forms.py:108 #: forms.py:45 forms.py:115
msgid "Password" msgid "Password"
msgstr "Contraseña" msgstr "Contraseña"
#: forms.py:43 forms.py:113 #: forms.py:50 forms.py:120
msgid "Password confirmation" msgid "Password confirmation"
msgstr "Confirma la contraseña" msgstr "Confirma la contraseña"
#: forms.py:46 forms.py:116 #: forms.py:53 forms.py:123
msgid "Enter the same password as before, for verification." msgid "Enter the same password as before, for verification."
msgstr "Introduce la misma contraseña para verificarla" msgstr "Introduce la misma contraseña para verificarla"
@ -62,9 +62,9 @@ msgid "Dashboard"
msgstr "Panel de gestión" msgstr "Panel de gestión"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:18 templates/musician/dashboard.html:101 #: mixins.py:18 templates/musician/dashboard.html:106
#: templates/musician/dashboard.html:102 #: templates/musician/dashboard.html:107
#: templates/musician/websites/website_detail.html:17 views.py:252 #: templates/musician/websites/website_detail.html:17 views.py:259
msgid "Domains" msgid "Domains"
msgstr "Dominios" msgstr "Dominios"
@ -73,7 +73,7 @@ msgid "Mails"
msgstr "Correos" msgstr "Correos"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:21 models.py:146 views.py:592 #: mixins.py:21 models.py:146 views.py:599
msgid "Databases" msgid "Databases"
msgstr "Bases de datos" msgstr "Bases de datos"
@ -81,17 +81,25 @@ msgstr "Bases de datos"
msgid "SaaS" msgid "SaaS"
msgstr "SaaS" msgstr "SaaS"
#: mixins.py:23
msgid "Nextcloud"
msgstr "Nextcloud"
#: mixins.py:24
msgid "Community WP"
msgstr "WP Comunitario"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:23 websites/views.py:24 #: mixins.py:25 websites/views.py:24
msgid "Websites" msgid "Websites"
msgstr "" msgstr ""
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: mixins.py:24 webapps/views.py:25 #: mixins.py:26 webapps/views.py:25
msgid "Webapps" msgid "Webapps"
msgstr "" msgstr ""
#: mixins.py:25 #: mixins.py:27
msgid "Users" msgid "Users"
msgstr "Usuarios" msgstr "Usuarios"
@ -100,7 +108,7 @@ msgid "Description details for databases page."
msgstr "Consulta la configuración de tus bases de datos." msgstr "Consulta la configuración de tus bases de datos."
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: models.py:234 views.py:392 #: models.py:234 views.py:399
msgid "Mail addresses" msgid "Mail addresses"
msgstr "Direcciones de correo" msgstr "Direcciones de correo"
@ -135,6 +143,58 @@ msgstr ""
"Si tienes algún servicio SaaS (Software as a Service) contratado, aquí " "Si tienes algún servicio SaaS (Software as a Service) contratado, aquí "
"encontrarás sus detalles de configuración." "encontrarás sus detalles de configuración."
#: saas/forms.py:16
msgid "Site URL"
msgstr ""
#: saas/forms.py:50
msgid ""
"ID of this blog used by WordPress, the only attribute that doesn't change."
msgstr ""
"ID de este blog utilizado por WordPress, el único atributo que no cambia."
#: saas/forms.py:51 templates/musician/address_list.html:25
msgid "Email"
msgstr "Correo electrónico"
#: saas/forms.py:52
msgid ""
"A new user will be created if the above email address is not in the database."
"<br>The username and password will be mailed to this email address."
msgstr ""
"Se creará un nuevo usuario si la dirección de correo electrónico anterior no está en la base de datos."
"<br>El nombre de usuario y la contraseña se enviarán a esta dirección de correo electrónico."
#: saas/forms.py:89
#, python-format
msgid "Suggestion: %s"
msgstr "Sugerencia: %s"
#. Translators: This message appears on the page title
#: saas/views.py:24 saas/views.py:38 templates/musician/domain_list.html:51
msgid "Software as a Service"
msgstr "Software as a Service"
#: saas/views.py:25
msgid "Nextcloud Service"
msgstr "Servicio Nextcloud"
#: saas/views.py:26
msgid "Members can manage their Nextcloud users in this section."
msgstr "Los miembros pueden gestionar sus usuarios de Nextcloud en esta sección."
#: saas/views.py:39
msgid "Community WordPress"
msgstr "WordPress Comunitario"
#: saas/views.py:40
msgid ""
"Pangea's multisite WordPress service. Members can have their WordPress on "
"this community WordPress hosted and maintained by Pangea."
msgstr ""
"Servicio de WordPress multisitio de Pangea. "
"Los socios pueden tener su WordPress en este WordPress comunitario alojado y mantenido por Pangea."
#: templates/auth/login.html:59 #: templates/auth/login.html:59
msgid "Log in" msgid "Log in"
msgstr "Accede" msgstr "Accede"
@ -167,6 +227,7 @@ msgstr ""
#: templates/musician/mailbox_check_delete.html:11 #: templates/musician/mailbox_check_delete.html:11
#: templates/musician/mailing_check_delete.html:8 #: templates/musician/mailing_check_delete.html:8
#: templates/musician/record_check_delete.html:9 #: templates/musician/record_check_delete.html:9
#: templates/musician/saas_check_delete.html:8
#: templates/musician/webapps/webappoption_check_delete.html:9 #: templates/musician/webapps/webappoption_check_delete.html:9
#: templates/musician/websites/websiteoption_check_delete.html:13 #: templates/musician/websites/websiteoption_check_delete.html:13
msgid "WARNING: This action cannot be undone." msgid "WARNING: This action cannot be undone."
@ -179,8 +240,12 @@ msgstr "AVISO: Esta acción es irreversible."
#: templates/musician/mailbox_form.html:20 #: templates/musician/mailbox_form.html:20
#: templates/musician/mailing_check_delete.html:9 #: templates/musician/mailing_check_delete.html:9
#: templates/musician/mailinglist_form.html:30 #: templates/musician/mailinglist_form.html:30
#: templates/musician/nextcloud_change_password.html:11
#: templates/musician/record_check_delete.html:11 #: templates/musician/record_check_delete.html:11
#: templates/musician/record_form.html:16 #: templates/musician/record_form.html:16
#: templates/musician/saas_check_delete.html:9
#: templates/musician/saas_nextcloud_form.html:30
#: templates/musician/saas_wordpress_form.html:31
#: templates/musician/systemuser_change_password.html:11 #: templates/musician/systemuser_change_password.html:11
#: templates/musician/webapps/webapp_form.html:11 #: templates/musician/webapps/webapp_form.html:11
#: templates/musician/webapps/webapp_option_form.html:18 #: templates/musician/webapps/webapp_option_form.html:18
@ -200,6 +265,9 @@ msgstr "Cancelar"
#: templates/musician/mailinglist_form.html:34 #: templates/musician/mailinglist_form.html:34
#: templates/musician/record_check_delete.html:10 #: templates/musician/record_check_delete.html:10
#: templates/musician/record_form.html:20 #: templates/musician/record_form.html:20
#: templates/musician/saas_check_delete.html:10
#: templates/musician/saas_nextcloud_form.html:35
#: templates/musician/saas_wordpress_form.html:35
#: templates/musician/webapps/webapp_form.html:15 #: templates/musician/webapps/webapp_form.html:15
#: templates/musician/webapps/webappoption_check_delete.html:10 #: templates/musician/webapps/webappoption_check_delete.html:10
#: templates/musician/websites/websiteoption_check_delete.html:14 #: templates/musician/websites/websiteoption_check_delete.html:14
@ -210,7 +278,10 @@ msgstr "Borrar"
#: templates/musician/mailbox_change_password.html:12 #: templates/musician/mailbox_change_password.html:12
#: templates/musician/mailbox_form.html:21 #: templates/musician/mailbox_form.html:21
#: templates/musician/mailinglist_form.html:31 #: templates/musician/mailinglist_form.html:31
#: templates/musician/nextcloud_change_password.html:12
#: templates/musician/record_form.html:17 #: templates/musician/record_form.html:17
#: templates/musician/saas_nextcloud_form.html:31
#: templates/musician/saas_wordpress_form.html:32
#: templates/musician/systemuser_change_password.html:12 #: templates/musician/systemuser_change_password.html:12
#: templates/musician/webapps/webapp_form.html:12 #: templates/musician/webapps/webapp_form.html:12
#: templates/musician/webapps/webapp_option_form.html:19 #: templates/musician/webapps/webapp_option_form.html:19
@ -230,17 +301,13 @@ msgstr "Filtrado"
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: templates/musician/address_list.html:25
msgid "Email"
msgstr "Correo electrónico"
#: templates/musician/address_list.html:26 #: templates/musician/address_list.html:26
msgid "Domain" msgid "Domain"
msgstr "Dominio" msgstr "Dominio"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: templates/musician/address_list.html:27 templates/musician/mail_base.html:22 #: templates/musician/address_list.html:27 templates/musician/mail_base.html:22
#: views.py:478 #: views.py:485
msgid "Mailboxes" msgid "Mailboxes"
msgstr "Buzones de correo" msgstr "Buzones de correo"
@ -262,7 +329,7 @@ msgstr "Perfil"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: templates/musician/base.html:71 templates/musician/billing.html:6 #: templates/musician/base.html:71 templates/musician/billing.html:6
#: views.py:350 #: views.py:357
msgid "Billing" msgid "Billing"
msgstr "Facturas" msgstr "Facturas"
@ -291,6 +358,7 @@ msgstr "Fecha de la factura"
#: templates/musician/webapps/webapp_detail.html:17 #: templates/musician/webapps/webapp_detail.html:17
#: templates/musician/webapps/webapp_detail.html:96 #: templates/musician/webapps/webapp_detail.html:96
#: templates/musician/webapps/webapp_list.html:26 #: templates/musician/webapps/webapp_list.html:26
#: templates/musician/websites/website_list.html:72
msgid "Type" msgid "Type"
msgstr "Tipo" msgstr "Tipo"
@ -327,6 +395,8 @@ msgstr "Mostrar historial"
#: templates/musician/mailbox_list.html:30 #: templates/musician/mailbox_list.html:30
#: templates/musician/mailinglist_list.html:24 #: templates/musician/mailinglist_list.html:24
#: templates/musician/saas_list.html:19 #: templates/musician/saas_list.html:19
#: templates/musician/saas_nextcloud_list.html:13
#: templates/musician/saas_wordpress_list.html:13
#: templates/musician/webapps/webapp_list.html:25 #: templates/musician/webapps/webapp_list.html:25
#: templates/musician/websites/website_detail.html:77 #: templates/musician/websites/website_detail.html:77
#: templates/musician/websites/website_list.html:20 #: templates/musician/websites/website_list.html:20
@ -350,13 +420,17 @@ msgstr "Abre el gestor de bases de datos"
#. Translators: database page when there isn't any database. #. Translators: database page when there isn't any database.
#. Translators: saas page when there isn't any saas. #. Translators: saas page when there isn't any saas.
#: templates/musician/database_list.html:58 #: templates/musician/database_list.html:58
#: templates/musician/saas_list.html:53 #: templates/musician/saas_list.html:60
#: templates/musician/saas_nextcloud_list.html:48
#: templates/musician/saas_wordpress_list.html:48
msgid "Ooops! Looks like there is nothing here!" msgid "Ooops! Looks like there is nothing here!"
msgstr "Mmmh… ¡parece que aquí no hay nada!" msgstr "Mmmh… ¡parece que aquí no hay nada!"
#: templates/musician/domain_detail.html:5 #: templates/musician/domain_detail.html:5
#: templates/musician/mailinglist_form.html:16 #: templates/musician/mailinglist_form.html:16
#: templates/musician/record_form.html:5 #: templates/musician/record_form.html:5
#: templates/musician/saas_nextcloud_form.html:16
#: templates/musician/saas_wordpress_form.html:16
#: templates/musician/webapps/webapp_detail.html:5 #: templates/musician/webapps/webapp_detail.html:5
#: templates/musician/webapps/webapp_option_form.html:7 #: templates/musician/webapps/webapp_option_form.html:7
#: templates/musician/websites/website_create_option_form.html:7 #: templates/musician/websites/website_create_option_form.html:7
@ -443,11 +517,6 @@ msgstr "direcciones de correo creadas"
msgid "Mail list" msgid "Mail list"
msgstr "Lista de correo" msgstr "Lista de correo"
#. Translators: This message appears on the page title
#: templates/musician/domain_list.html:51 views.py:615
msgid "Software as a Service"
msgstr "Software as a Service"
#: templates/musician/domain_list.html:53 #: templates/musician/domain_list.html:53
msgid "Nothing installed" msgid "Nothing installed"
msgstr "No tienes nada instalado" msgstr "No tienes nada instalado"
@ -501,6 +570,8 @@ msgstr "Direcciones de correo"
#: templates/musician/mailbox_change_password.html:5 #: templates/musician/mailbox_change_password.html:5
#: templates/musician/mailbox_form.html:24 #: templates/musician/mailbox_form.html:24
#: templates/musician/nextcloud_change_password.html:5
#: templates/musician/saas_nextcloud_form.html:34
#: templates/musician/systemuser_change_password.html:5 #: templates/musician/systemuser_change_password.html:5
#: templates/musician/webapps/webappuser_change_password.html:5 #: templates/musician/webapps/webappuser_change_password.html:5
msgid "Change password" msgid "Change password"
@ -565,6 +636,8 @@ msgstr "Crear lista"
#: templates/musician/mailinglist_list.html:25 #: templates/musician/mailinglist_list.html:25
#: templates/musician/saas_list.html:20 #: templates/musician/saas_list.html:20
#: templates/musician/saas_nextcloud_list.html:14
#: templates/musician/saas_wordpress_list.html:14
#: templates/musician/websites/website_list.html:23 #: templates/musician/websites/website_list.html:23
msgid "Status" msgid "Status"
msgstr "Estado" msgstr "Estado"
@ -631,7 +704,15 @@ msgstr "Actualiza la contraseña"
msgid "Add record to" msgid "Add record to"
msgstr "Agregar registro a" msgstr "Agregar registro a"
#: templates/musician/saas_check_delete.html:7
#, fuzzy
#| msgid "Are you sure that you want remove the list:"
msgid "Are you sure that you want remove the SaaS:"
msgstr "¿Estás seguro/a de que quieres borrar la siguiente lista:"
#: templates/musician/saas_list.html:21 #: templates/musician/saas_list.html:21
#: templates/musician/saas_nextcloud_list.html:15
#: templates/musician/saas_wordpress_list.html:15
msgid "Service" msgid "Service"
msgstr "Servicio" msgstr "Servicio"
@ -639,14 +720,34 @@ msgstr "Servicio"
msgid "Service info" msgid "Service info"
msgstr "Información del servicio" msgstr "Información del servicio"
#: templates/musician/saas_list.html:30 #: templates/musician/saas_list.html:31
#: templates/musician/saas_nextcloud_list.html:24
#: templates/musician/saas_wordpress_list.html:24
msgid "Installed on" msgid "Installed on"
msgstr "Instalado en" msgstr "Instalado en"
#: templates/musician/saas_list.html:37 templates/musician/saas_list.html:39 #: templates/musician/saas_list.html:38 templates/musician/saas_list.html:40
#: templates/musician/saas_nextcloud_list.html:31
#: templates/musician/saas_nextcloud_list.html:33
#: templates/musician/saas_wordpress_list.html:31
#: templates/musician/saas_wordpress_list.html:33
msgid "Open service admin panel" msgid "Open service admin panel"
msgstr "Abre el panel de administración del servicio" msgstr "Abre el panel de administración del servicio"
#: templates/musician/saas_list.html:69
msgid "New SaaS"
msgstr "Nuevo SaaS"
#: templates/musician/saas_nextcloud_form.html:20
#: templates/musician/saas_wordpress_form.html:20
msgid "Update SaaS"
msgstr "Actualizar SaaS"
#: templates/musician/saas_nextcloud_form.html:22
#: templates/musician/saas_wordpress_form.html:22
msgid "Create SaaS"
msgstr "Crear SaaS"
#: templates/musician/systemuser_list.html:6 #: templates/musician/systemuser_list.html:6
msgid "" msgid ""
"The main user is your system's main user on each server. You'll be able to " "The main user is your system's main user on each server. You'll be able to "
@ -694,6 +795,7 @@ msgid "Server"
msgstr "Servidor" msgstr "Servidor"
#: templates/musician/webapps/webapp_detail.html:27 #: templates/musician/webapps/webapp_detail.html:27
#: templates/musician/websites/website_list.html:82
msgid "SFTP user" msgid "SFTP user"
msgstr "Usuario SFTP" msgstr "Usuario SFTP"
@ -822,6 +924,12 @@ msgstr "Actualizar Opción de WebSite"
msgid "Url" msgid "Url"
msgstr "" msgstr ""
#: templates/musician/websites/website_list.html:89
#, fuzzy
#| msgid "SFTP user"
msgid "FTP user"
msgstr "Usuario SFTP"
#: validators.py:28 #: validators.py:28
#, python-format #, python-format
msgid "" msgid ""
@ -831,43 +939,43 @@ msgstr ""
"%s: Los hosts no pueden tener el carácter de subrayado '_'. Considere " "%s: Los hosts no pueden tener el carácter de subrayado '_'. Considere "
"proporcionar un registro SRV, CNAME o TXT." "proporcionar un registro SRV, CNAME o TXT."
#: views.py:200 views.py:202 views.py:229 #: views.py:199 views.py:201 views.py:236
msgid "available" msgid "available"
msgstr "disponibles" msgstr "disponibles"
#: views.py:232 #: views.py:239
msgid "Account" msgid "Account"
msgstr "Cuenta" msgstr "Cuenta"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:277 #: views.py:284
msgid "User profile" msgid "User profile"
msgstr "Tu perfil" msgstr "Tu perfil"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:364 #: views.py:371
msgid "Download bill" msgid "Download bill"
msgstr "Descarga la factura" msgstr "Descarga la factura"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:623 #: views.py:620
msgid "Domain details" msgid "Domain details"
msgstr "Detalles del dominio" msgstr "Detalles del dominio"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:679 #: views.py:676
msgid "Login" msgid "Login"
msgstr "Accede" msgstr "Accede"
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:750 #: views.py:747
msgid "Webapp users" msgid "Webapp users"
msgstr "" msgstr ""
#. Translators: This message appears on the page title #. Translators: This message appears on the page title
#: views.py:768 #: views.py:765
msgid "Main users" msgid "Main users"
msgstr "" msgstr "Usuarios principales"
#: webapps/forms.py:62 #: webapps/forms.py:62
msgid "This option already exist." msgid "This option already exist."
@ -920,72 +1028,69 @@ msgstr ""
msgid "website details" msgid "website details"
msgstr "Detalles de cada tipo" msgstr "Detalles de cada tipo"
msgid "Database" #~ msgid "Database"
msgstr "Bases de datos" #~ msgstr "Bases de datos"
msgid "Change password for" #~ msgid "Change password for"
msgstr "Cambia la contraseña de" #~ msgstr "Cambia la contraseña de"
#~ msgid "Domains & websites" #~ msgid "Domains & websites"
#~ msgstr "Dominios y sitios web" #~ msgstr "Dominios y sitios web"
msgid "Previous" #~ msgid "Previous"
msgstr "Previa" #~ msgstr "Previa"
msgid "Next" #~ msgid "Notifications"
msgstr "Siguiente" #~ msgstr "Notificaciones"
msgid "Notifications" #~ msgid "There is no notifications at this time."
msgstr "Notificaciones" #~ msgstr "No tienes ninguna notificación."
msgid "There is no notifications at this time." #~ msgid "Dashboard page description."
msgstr "No tienes ninguna notificación." #~ msgstr ""
#~ "Este es tu panel de gestión, desde donde podrás consultar la "
#~ "configuración de los servicios que Pangea te ofrece."
msgid "Dashboard page description." #~ msgid "associated to"
msgstr "" #~ msgstr "asociada a"
"Este es tu panel de gestión, desde donde podrás consultar la "
"configuración de los servicios que Pangea te ofrece."
msgid "associated to" #~ msgid "No users for this database."
msgstr "asociada a" #~ msgstr "No hay usuarias/os de esta base de datos."
msgid "No users for this database." #~ msgid "Traffic"
msgstr "No hay usuarias/os de esta base de datos." #~ msgstr "Tráfico"
msgid "Traffic" #~ msgid "Mailbox usage"
msgstr "Tráfico" #~ msgstr "Uso de espacio en tu buzón de correo"
msgid "Mailbox usage" #~ msgid "Address deleted!"
msgstr "Uso de espacio en tu buzón de correo" #~ msgstr "Has eliminado la dirección de correo"
msgid "Address deleted!" #~ msgid "Cannot process your request, please try again later."
msgstr "Has eliminado la dirección de correo" #~ msgstr ""
#~ "Ahora no podemos procesar tu petición, inténtalo de nuevo un poco más "
#~ "tarde por favor."
msgid "Cannot process your request, please try again later." #~ msgid "Mailbox deleted!"
msgstr "" #~ msgstr "Has eliminado el buzón de correo"
"Ahora no podemos procesar tu petición, inténtalo de nuevo un poco más "
"tarde por favor."
msgid "Mailbox deleted!" #~ msgid "mail address left"
msgstr "Has eliminado el buzón de correo" #~ msgstr "direcciones de correo por activar"
msgid "mail address left" #~ msgid "Aliases"
msgstr "direcciones de correo por activar" #~ msgstr "Alias"
msgid "Aliases" #~ msgid "databases created"
msgstr "Alias" #~ msgstr "bases de datos creadas"
msgid "databases created" #~ msgid "size"
msgstr "bases de datos creadas" #~ msgstr "tamaño"
msgid "size" #~ msgid "traffic"
msgstr "tamaño" #~ msgstr "tráfico"
msgid "traffic" #~ msgid "Mailman list traffic"
msgstr "tráfico" #~ msgstr "Listas de Mailman"
msgid "Mailman list traffic" #~ msgid "Mailman list Traffic"
msgstr "Listas de Mailman" #~ msgstr "Listas de Mailman"
msgid "Mailman list Traffic"
msgstr "Listas de Mailman"

View File

@ -14,15 +14,17 @@ class CustomContextMixin(ContextMixin):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
# generate services menu items # generate services menu items
services_menu = [ services_menu = [
{'icon': 'home', 'pattern_name': 'musician:dashboard', 'title': _('Dashboard')}, {'icon': 'fas fa-home', 'pattern_name': 'musician:dashboard', 'title': _('Dashboard')},
{'icon': 'globe-europe', 'pattern_name': 'musician:domain-list', 'title': _('Domains')}, {'icon': 'fas fa-globe', 'pattern_name': 'musician:domain-list', 'title': _('Domains')},
{'icon': 'envelope', 'pattern_name': 'musician:address-list', 'title': _('Mails')}, {'icon': 'fas fa-envelope', 'pattern_name': 'musician:address-list', 'title': _('Mails')},
{'icon': 'mail-bulk', 'pattern_name': 'musician:mailing-lists', 'title': _('Mailing lists')}, {'icon': 'fas fa-mail-bulk', 'pattern_name': 'musician:mailing-lists', 'title': _('Mailing lists')},
{'icon': 'database', 'pattern_name': 'musician:database-list', 'title': _('Databases')}, {'icon': 'fas fa-database', 'pattern_name': 'musician:database-list', 'title': _('Databases')},
{'icon': 'fire', 'pattern_name': 'musician:saas-list', 'title': _('SaaS')}, {'icon': 'fas fa-fire', 'pattern_name': 'musician:saas-nextcloud-list', 'title': _('SaaS')},
{'icon': 'globe', 'pattern_name': 'musician:website-list', 'title': _('Websites')}, {'icon': 'fas fa-cloud', 'pattern_name': 'musician:saas-nextcloud-list', 'title': _('Nextcloud'), 'indent': True},
{'icon': 'folder', 'pattern_name': 'musician:webapp-list', 'title': _('Webapps'), 'indent': True}, {'icon': 'fab fa-wordpress', 'pattern_name': 'musician:saas-wordpress-list', 'title': _('Community WP'), 'indent': True},
{'icon': 'user', 'pattern_name': 'musician:systemuser-list', 'title': _('Users'), 'indent': True}, {'icon': 'fas fa-globe', 'pattern_name': 'musician:website-list', 'title': _('Websites')},
{'icon': 'fas fa-folder', 'pattern_name': 'musician:webapp-list', 'title': _('Webapps'), 'indent': True},
{'icon': 'fas fa-user', 'pattern_name': 'musician:systemuser-list', 'title': _('Users'), 'indent': True},
] ]
context.update({ context.update({
'services_menu': services_menu, 'services_menu': services_menu,

View File

@ -0,0 +1,94 @@
from django import forms
from orchestra.forms.widgets import SpanWidget
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
from orchestra.utils.python import random_ascii
from django.forms.widgets import HiddenInput
from orchestra.contrib.saas.models import SaaS
from orchestra.contrib.musician.forms import ChangePasswordForm
class SaasUpdateForm(forms.ModelForm):
site_url = forms.CharField(label=_("Site URL"), widget=SpanWidget(), required=False)
class Meta:
model = SaaS
fields = ("is_active", "service", "name", "data", "custom_url")
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['name'].widget.attrs['readonly'] = True
self.fields['site_url'].widget.attrs['readonly'] = True
self.fields['service'].widget = HiddenInput()
self.fields['data'].widget = HiddenInput()
# asignar valor al field site_url
site_domain = self.instance.get_site_domain()
context = {
'site_name': '&lt;site_name&gt;',
'name': '&lt;site_name&gt;',
}
site_domain = site_domain % context
if '&lt;site_name&gt;' in site_domain:
site_link = site_domain
else:
site_link = '<a href="http://%s">%s</a>' % (site_domain, site_domain)
self.fields['site_url'].widget.display = site_link
if self.instance:
if self.instance.pk:
self.fields['data'].required = False
class SaasWordpressUpdateForm(SaasUpdateForm):
blog_id = forms.IntegerField(label=("Blog ID"), widget=SpanWidget(), required=False,
help_text=_("ID of this blog used by WordPress, the only attribute that doesn't change."))
email = forms.EmailField(label=_("Email"),
help_text=_("A new user will be created if the above email address is not in the database.<br>"
"The username and password will be mailed to this email address."))
def __init__(self, *args, **kwargs):
# self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['email'].widget.attrs['readonly'] = True
self.fields['blog_id'].widget.attrs['readonly'] = True
self.fields["is_active"].widget = HiddenInput()
self.fields["custom_url"].widget.attrs['readonly'] = True
admin_url = 'http://%s/wp-admin/' % self.instance.get_site_domain()
help_text = 'Admin URL: <a href="{0}">{0}</a>'.format(admin_url)
self.fields['site_url'].help_text = mark_safe(help_text)
if self.instance:
for field in self.declared_fields:
initial = self.fields[field].initial
self.fields[field].initial = self.instance.data.get(field, initial)
class SaasNextcloudUpdateForm(SaasUpdateForm):
def __init__(self, *args, **kwargs):
# self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields["custom_url"].widget = HiddenInput()
class NextcloudChangePasswordForm(ChangePasswordForm):
class Meta:
fields = ("password",)
model = SaaS
def __init__(self, *args, **kwargs):
super(NextcloudChangePasswordForm, self).__init__(*args, **kwargs)
self.fields['password'].help_text = _("Suggestion: %s") % random_ascii(20)
def clean_password(self):
password = self.cleaned_data.get("password")
self.fields['password'] = password
self.instance.set_password(password)

View File

@ -0,0 +1,97 @@
from django.utils.translation import gettext_lazy as _
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
from django.views.generic.base import RedirectView, TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import (CreateView, DeleteView, FormView,
UpdateView)
from django.views.generic.list import ListView
from orchestra.contrib.musician.mixins import (CustomContextMixin, ExtendedPaginationMixin,
UserTokenRequiredMixin)
from .forms import ( NextcloudChangePasswordForm, SaasNextcloudUpdateForm,
SaasWordpressUpdateForm )
from orchestra.contrib.saas.models import SaaS
class SaasNextcloudListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
model = SaaS
template_name = "musician/saas_nextcloud_list.html"
extra_context = {
# Translators: This message appears on the page title
'title': _('Software as a Service'),
'verbose_name': _('Nextcloud Service'),
'description': _("Members can manage their Nextcloud users in this section."),
}
def get_queryset(self):
return self.model.objects.filter(account=self.request.user, service='nextcloud')
class SaasWordpressListView(CustomContextMixin, UserTokenRequiredMixin, ListView):
model = SaaS
template_name = "musician/saas_wordpress_list.html"
extra_context = {
# Translators: This message appears on the page title
'title': _('Software as a Service'),
'verbose_name': _('Community WordPress'),
'description': _("Pangea's multisite WordPress service. Members can have their WordPress on this community WordPress hosted and maintained by Pangea."),
}
def get_queryset(self):
return self.model.objects.filter(account=self.request.user, service='wordpress')
class SaasWordpressUpdateView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
model = SaaS
form_class = SaasWordpressUpdateForm
template_name = "musician/saas_wordpress_form.html"
def get_queryset(self):
qs = SaaS.objects.filter(account=self.request.user)
return qs
def get_success_url(self):
return reverse_lazy("musician:saas-wordpress-list")
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs
class SaasNextcloudUpdateView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
model = SaaS
form_class = SaasNextcloudUpdateForm
template_name = "musician/saas_nextcloud_form.html"
def get_queryset(self):
qs = SaaS.objects.filter(account=self.request.user)
return qs
def get_success_url(self):
return reverse_lazy("musician:saas-nextcloud-list")
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["user"] = self.request.user
return kwargs
class NextcloudChangePasswordView(CustomContextMixin, UserTokenRequiredMixin, UpdateView):
template_name = "musician/nextcloud_change_password.html"
model = SaaS
form_class = NextcloudChangePasswordForm
success_url = reverse_lazy("musician:saas-nextcloud-list")
def get_queryset(self):
return self.model.objects.filter(account=self.request.user)
class SaasDeleteView(CustomContextMixin, UserTokenRequiredMixin, DeleteView):
template_name = "musician/saas_check_delete.html"
model = SaaS
success_url = reverse_lazy("musician:saas-nextcloud-list")
def get_queryset(self):
return self.model.objects.filter(account=self.request.user)

View File

@ -52,7 +52,7 @@
<li class="nav-item"> <li class="nav-item">
{% endif %} {% endif %}
<a class="nav-link text-light active" href="{% url item.pattern_name %}"> <a class="nav-link text-light active" href="{% url item.pattern_name %}">
<i class="fas fa-{{ item.icon }}"></i> <i class="{{ item.icon }}"></i>
{{ item.title }} {{ item.title }}
</a> </a>
</li> </li>

View File

@ -0,0 +1,15 @@
{% extends "musician/base.html" %}
{% load bootstrap4 i18n %}
{% block content %}
<h1 class="service-name">{% trans "Change password" %}: <span class="font-weight-light">{{ object.name }}</span></h1>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<a class="btn btn-light mr-2" href="{% url 'musician:saas-nextcloud-list' %}">{% trans "Cancel" %}</a>
<button type="submit" class="btn btn-secondary">{% trans "Save" %}</button>
{% endbuttons %}
</form>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends "musician/base.html" %}
{% load i18n %}
{% block content %}
<form method="post">
{% csrf_token %}
<p>{% blocktrans %}Are you sure that you want remove the SaaS:{% endblocktrans %} {{ saas }} ?</p>
<p class="alert alert-warning"><strong>{% trans 'WARNING: This action cannot be undone.' %}</strong></p>
<a class="btn btn-light mr-2" href="{% url 'musician:saas-nextcloud-list' %}">{% trans 'Cancel' %}</a>
<input class="btn btn-danger" type="submit" value="{% trans 'Delete' %}">
</form>
{% endblock %}

View File

@ -19,7 +19,8 @@
<th scope="col">{% trans "Name" %}</th> <th scope="col">{% trans "Name" %}</th>
<th scope="col">{% trans "Status" %}</th> <th scope="col">{% trans "Status" %}</th>
<th scope="col">{% trans "Service" %}</th> <th scope="col">{% trans "Service" %}</th>
<th scope="col">{% trans "Service info" %}</th> <!-- <th scope="col">{% trans "Service info" %}</th> -->
<th></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -34,14 +35,20 @@
<span class="sr-only">{{ saas.is_active|yesno }}</span> <span class="sr-only">{{ saas.is_active|yesno }}</span>
</td> </td>
<td> <td>
<a class="btn btn-sm btn-link" href="{{ saas.manager_url }}" target="_blank" rel="noopener noreferrer" title="{% trans 'Open service admin panel' %}"> <a class="btn btn-sm btn-link" href="https://{{ saas.get_site_domain|default:'#' }}" target="_blank" rel="noopener noreferrer" title="{% trans 'Open service admin panel' %}">
<i class="fab fa-{{ saas.service }}"></i> {{ saas.service|capfirst }} <i class="fab fa-{{ saas.service }}"></i> {{ saas.service|capfirst }}
<span class="sr-only">{% trans "Open service admin panel" %}</span> <i class="fas fa-external-link-alt"></i></a> <span class="sr-only">{% trans "Open service admin panel" %}</span> <i class="fas fa-external-link-alt"></i></a>
</td> </td>
<td> <!-- <td>
{% for key, value in saas.data.items %} {% for key, value in saas.data.items %}
<label>{{ key }}:</label> <strong>{{ value }}</strong><br/> <label>{{ key }}:</label> <strong>{{ value }}</strong><br/>
{% endfor %} {% endfor %}
</td> -->
<td class="text-right">
<a class="btn btn-outline-warning" role="button" href="{% url 'musician:saas-update' saas.id %}">
<i class="fas fa-tools"></i></a>
<a class="btn btn-outline-danger" role="button" href="{% url 'musician:saas-delete' saas.id %}">
<i class="text-danger fas fa-trash"></i></a>
</td> </td>
</tr> </tr>
{% empty %} {% empty %}
@ -59,4 +66,5 @@
{% include "musician/components/table_paginator.html" %} {% include "musician/components/table_paginator.html" %}
</table> </table>
</div> </div>
<!-- <a class="btn btn-primary mt-4 mb-4" href="#">{% trans "New SaaS" %}</a> -->
{% endblock %} {% endblock %}

View File

@ -0,0 +1,41 @@
{% extends "musician/base.html" %}
{% load bootstrap4 i18n %}
{% block content %}
<style>
.form-check{
background-color: #fff;
padding: .375rem 2.0rem;
border: 1px solid #ced4da;
border-radius: 5px;
}
</style>
<a class="btn-arrow-left" href="{% url 'musician:saas-nextcloud-list' %}">{% trans "Go back" %}</a>
<h1 class="service-name">
{% if form.instance.pk %}
{% trans "Update SaaS" %} <span class="font-weight-light">{{ saas.name }}</span>
{% else %}
{% trans "Create SaaS" %}
{% endif %}
</h1>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<a class="btn btn-light mr-2" href="{% url 'musician:saas-nextcloud-list' %}">{% trans "Cancel" %}</a>
<button type="submit" class="btn btn-secondary">{% trans "Save" %}</button>
{% if form.instance.pk %}
<div class="float-right">
<a class="btn btn-outline-warning" href="{% url 'musician:nextcloud-password' form.instance.pk %}"><i class="fas fa-key"></i> {% trans "Change password" %}</a>
<a class="btn btn-danger" href="{% url 'musician:saas-delete' view.kwargs.pk %}">{% trans "Delete" %}</a>
</div>
{% endif %}
{% endbuttons %}
</form>
{% endblock %}

View File

@ -0,0 +1,57 @@
{% extends "musician/base.html" %}
{% load i18n %}
{% block content %}
<h1 class="service-name">{{ verbose_name }}</h1>
<p class="service-description">{{ description }}</p>
<div class="table-responsive">
<table class="table service-list">
<thead class="thead-dark">
<tr>
<th scope="col">{% trans "Name" %}</th>
<th scope="col">{% trans "Status" %}</th>
<th scope="col">{% trans "Service" %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for saas in object_list %}
<tr>
<td>
<strong>{{ saas.name }}</strong><br>
<span class="text-secondary">{% trans "Installed on" %}: <strong>{{ saas.get_site_domain|default:"-" }}</strong></span>
</td>
<td class="text-{{saas.is_active|yesno:'success,danger'}}">
<i class="fa fa-{{ saas.is_active|yesno:'check,times' }}"></i>
<span class="sr-only">{{ saas.is_active|yesno }}</span>
</td>
<td>
<a class="btn btn-sm btn-link" href="https://{{ saas.get_site_domain|default:'#' }}" target="_blank" rel="noopener noreferrer" title="{% trans 'Open service admin panel' %}">
<i class="fab fa-{{ saas.service }}"></i> {{ saas.service|capfirst }}
<span class="sr-only">{% trans "Open service admin panel" %}</span> <i class="fas fa-external-link-alt"></i></a>
</td>
<td class="text-right">
<a class="btn btn-outline-warning" role="button" href="{% url 'musician:saas-nextcloud-update' saas.id %}">
<i class="fas fa-tools"></i></a>
<a class="btn btn-outline-danger" role="button" href="{% url 'musician:saas-delete' saas.id %}">
<i class="text-danger fas fa-trash"></i></a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="4">
<h5 class="text-dark">
<i class="fas fa-fire fa-2x mr-2"></i>
{# Translators: saas page when there isn't any saas. #}
{% trans "Ooops! Looks like there is nothing here!" %}
</h5>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View File

@ -0,0 +1,41 @@
{% extends "musician/base.html" %}
{% load bootstrap4 i18n %}
{% block content %}
<style>
.form-check{
background-color: #fff;
padding: .375rem 2.0rem;
border: 1px solid #ced4da;
border-radius: 5px;
}
</style>
<a class="btn-arrow-left" href="{% url 'musician:saas-wordpress-list' %}">{% trans "Go back" %}</a>
<h1 class="service-name">
{% if form.instance.pk %}
{% trans "Update SaaS" %} <span class="font-weight-light">{{ saas.name }}</span>
{% else %}
{% trans "Create SaaS" %}
{% endif %}
</h1>
<form method="post">
{% csrf_token %}
{% bootstrap_form form %}
<!-- TODO: ya veremos si dejamos a los socios update/delete -->
<!-- {% buttons %}
<a class="btn btn-light mr-2" href="{% url 'musician:saas-wordpress-list' %}">{% trans "Cancel" %}</a>
<button type="submit" class="btn btn-secondary">{% trans "Save" %}</button>
{% if form.instance.pk %}
<div class="float-right">
<a class="btn btn-danger" href="{% url 'musician:saas-delete' view.kwargs.pk %}">{% trans "Delete" %}</a>
</div>
{% endif %}
{% endbuttons %} -->
</form>
{% endblock %}

View File

@ -0,0 +1,57 @@
{% extends "musician/base.html" %}
{% load i18n %}
{% block content %}
<h1 class="service-name">{{ verbose_name }}</h1>
<p class="service-description">{{ description }}</p>
<div class="table-responsive">
<table class="table service-list">
<thead class="thead-dark">
<tr>
<th scope="col">{% trans "Name" %}</th>
<th scope="col">{% trans "Status" %}</th>
<th scope="col">{% trans "Service" %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for saas in object_list %}
<tr>
<td>
<strong>{{ saas.name }}</strong><br>
<span class="text-secondary">{% trans "Installed on" %}: <strong>{{ saas.get_site_domain|default:"-" }}</strong></span>
</td>
<td class="text-{{saas.is_active|yesno:'success,danger'}}">
<i class="fa fa-{{ saas.is_active|yesno:'check,times' }}"></i>
<span class="sr-only">{{ saas.is_active|yesno }}</span>
</td>
<td>
<a class="btn btn-sm btn-link" href="https://{{ saas.get_site_domain|default:'#' }}" target="_blank" rel="noopener noreferrer" title="{% trans 'Open service admin panel' %}">
<i class="fab fa-{{ saas.service }}"></i> {{ saas.service|capfirst }}
<span class="sr-only">{% trans "Open service admin panel" %}</span> <i class="fas fa-external-link-alt"></i></a>
</td>
<td class="text-right">
<a class="btn btn-outline-warning" role="button" href="{% url 'musician:saas-wordpress-update' saas.id %}">
<i class="fas fa-tools"></i></a>
<!-- <a class="btn btn-outline-danger" role="button" href="{% url 'musician:saas-delete' saas.id %}">
<i class="text-danger fas fa-trash"></i></a> -->
</td>
</tr>
{% empty %}
<tr>
<td colspan="4">
<h5 class="text-dark">
<i class="fas fa-fire fa-2x mr-2"></i>
{# Translators: saas page when there isn't any saas. #}
{% trans "Ooops! Looks like there is nothing here!" %}
</h5>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View File

@ -50,7 +50,12 @@ urlpatterns = [
path('databases/', views.DatabaseListView.as_view(), name='database-list'), path('databases/', views.DatabaseListView.as_view(), name='database-list'),
path('saas/', views.SaasListView.as_view(), name='saas-list'), path('saas/nextcloud/', views.SaasNextcloudListView.as_view(), name='saas-nextcloud-list'),
path('saas/nextcloud/<int:pk>/', views.SaasNextcloudUpdateView.as_view(), name='saas-nextcloud-update'),
path('saas/<int:pk>/nextcloud-change-password/', views.NextcloudChangePasswordView.as_view(), name='nextcloud-password'),
path('saas/wordpress/', views.SaasWordpressListView.as_view(), name='saas-wordpress-list'),
path('saas/wordpress/<int:pk>/', views.SaasWordpressUpdateView.as_view(), name='saas-wordpress-update'),
path('saas/<int:pk>/delete/', views.SaasDeleteView.as_view(), name='saas-delete'),
path('webappusers/', views.WebappUserListView.as_view(), name='webappuser-list'), path('webappusers/', views.WebappUserListView.as_view(), name='webappuser-list'),
path('webappuser/<int:pk>/change-password/', views.WebappUserChangePasswordView.as_view(), name='webappuser-password'), path('webappuser/<int:pk>/change-password/', views.WebappUserChangePasswordView.as_view(), name='webappuser-password'),

View File

@ -34,7 +34,6 @@ from orchestra.contrib.domains.models import Domain, Record
from orchestra.contrib.lists.models import List from orchestra.contrib.lists.models import List
from orchestra.contrib.mailboxes.models import Address, Mailbox from orchestra.contrib.mailboxes.models import Address, Mailbox
from orchestra.contrib.resources.models import Resource, ResourceData from orchestra.contrib.resources.models import Resource, ResourceData
from orchestra.contrib.saas.models import SaaS
from orchestra.contrib.systemusers.models import WebappUsers, SystemUser from orchestra.contrib.systemusers.models import WebappUsers, SystemUser
from orchestra.utils.html import html_to_pdf from orchestra.utils.html import html_to_pdf
@ -56,6 +55,7 @@ from .utils import get_bootstraped_percent, get_bootstraped_percent_exact
from .webapps.views import * from .webapps.views import *
from .websites.views import * from .websites.views import *
from .lists.views import * from .lists.views import *
from .saas.views import *
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -130,9 +130,8 @@ class DashboardView(CustomContextMixin, UserTokenRequiredMixin, TemplateView):
mailboxes = related_resources.filter(resource_id__verbose_name='mailbox-disk') mailboxes = related_resources.filter(resource_id__verbose_name='mailbox-disk')
lists = related_resources.filter(resource_id__verbose_name='list-traffic') lists = related_resources.filter(resource_id__verbose_name='list-traffic')
databases = related_resources.filter(resource_id__verbose_name='database-disk') databases = related_resources.filter(resource_id__verbose_name='database-disk')
nextcloud = related_resources.filter(resource_id__verbose_name='nextcloud-disk') nextcloud = related_resources.filter(resource_id__verbose_name='nextcloud-disk', content_object_repr__iregex=r'^.*@nextcloud$')
domains = Domain.objects.filter(account_id=self.request.user) domains = Domain.objects.filter(account_id=self.request.user)
# TODO(@slamora) update when backend supports notifications # TODO(@slamora) update when backend supports notifications
notifications = [] notifications = []
@ -499,10 +498,10 @@ class MailboxListView(ServiceListView):
).filter( ).filter(
full_address__icontains=cleaned_data["address"] full_address__icontains=cleaned_data["address"]
) )
if "name" in cleaned_data: if "name" in cleaned_data:
qs = qs.filter(name__icontains=cleaned_data["name"]) qs = qs.filter(name__icontains=cleaned_data["name"])
return qs return qs
@ -614,16 +613,6 @@ class DatabaseListView(ServiceListView):
return qs return qs
class SaasListView(ServiceListView):
service_class = SaasService
model = SaaS
template_name = "musician/saas_list.html"
extra_context = {
# Translators: This message appears on the page title
'title': _('Software as a Service'),
}
class DomainDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView): class DomainDetailView(CustomContextMixin, UserTokenRequiredMixin, DetailView):
template_name = "musician/domain_detail.html" template_name = "musician/domain_detail.html"
extra_context = { extra_context = {

View File

@ -43,7 +43,7 @@ class NextCloudController(NextCloudAPIMixin, ServiceController):
def remove(self, saas, server): def remove(self, saas, server):
self.api_delete('users/%s' % saas.name) self.api_delete('users/%s' % saas.name)
def save(self, saas): def save(self, saas):
self.append(self.update_or_create, saas) self.append(self.update_or_create, saas)
def delete(self, saas): def delete(self, saas):

Binary file not shown.

View File

@ -0,0 +1,403 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-08 11:17+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:40
msgid "Related website directive does not exist for this custom URL."
msgstr "Related website directive does not exist for this custom URL."
#: admin.py:50
msgid "URL"
msgstr ""
#: backends/__init__.py:244
msgid "nextCloud SaaS Disk Quota"
msgstr ""
#: backends/bscw.py:11
msgid "BSCW SaaS"
msgstr ""
#: backends/dokuwikimu.py:20
msgid "DokuWiki multisite"
msgstr ""
#: backends/dokuwikimu.py:110
msgid "DokuWiki MU Traffic"
msgstr ""
#: backends/drupalmu.py:15
msgid "Drupal multisite"
msgstr ""
#: backends/gitlab.py:12
msgid "GitLab SaaS"
msgstr ""
#: backends/moodle.py:49
msgid "Moodle multisite"
msgstr ""
#: backends/nextcloud.py:15
msgid "nextCloud SaaS"
msgstr ""
#: backends/nextcloud.py:55
msgid "nextCloud SaaS Traffic"
msgstr ""
#: backends/owncloud.py:104
msgid "ownCloud SaaS"
msgstr ""
#: backends/owncloud.py:136
msgid "ownCloud SaaS Traffic"
msgstr ""
#: backends/owncloud.py:146
msgid "ownCloud SaaS Disk Quota"
msgstr ""
#: backends/phplist.py:32
msgid "phpList SaaS"
msgstr ""
#: backends/phplist.py:132
msgid "phpList SaaS Traffic"
msgstr ""
#: backends/wordpressmu.py:23
msgid "Wordpress multisite"
msgstr ""
#: backends/wordpressmu.py:274
msgid "Wordpress MU Traffic"
msgstr ""
#: filters.py:6 models.py:35
msgid "custom URL"
msgstr "URL personalitzada"
#: filters.py:11
msgid "True"
msgstr ""
#: filters.py:12
msgid "False"
msgstr ""
#: forms.py:14
msgid "Site URL"
msgstr "URL del lloc"
#: forms.py:48 services/phplist.py:31
msgid "Site name"
msgstr "Nom del lloc"
#: forms.py:48
msgid "Username"
msgstr "Usuari"
#: forms.py:52 forms.py:64
msgid "Password"
msgstr "Contrasenya"
#: forms.py:57 serializers.py:20
msgid ""
"Enter a valid password. This value may contain any ascii character except "
"for '/\"/\\/ characters."
msgstr ""
"Introdueix una contrasenya vàlida. Aquest valor pot contenir qualsevol caràcter ASCII excepte "
"els caràcters '/\"/\\/."
#: forms.py:61
msgid ""
"Passwords are not stored, so there is no way to see this service's password, "
"but you can change the password using <a href=\"../password/\">this form</a>."
msgstr ""
"Les contrasenyes no s'emmagatzemen, per tant no hi ha manera de veure la contrasenya d'aquest servei, "
"però pots canviar la contrasenya utilitzant <a href=\"../password/\">aquest formulari</a>."
#: forms.py:67
msgid "Password confirmation"
msgstr "Confirmació de la contrasenya"
#: forms.py:69
msgid "Enter the same password as above, for verification."
msgstr "Introdueix la mateixa contrasenya que la de dalt, per a la verificació."
#: forms.py:80
#, python-format
msgid "Suggestion: %s"
msgstr "Suggeriment: %s"
#: forms.py:87
msgid "The two password fields didn't match."
msgstr "Els dos camps de contrasenya no coincideixen."
#: models.py:24
msgid "service"
msgstr "servei"
#: models.py:26
msgid "Name"
msgstr "Nom"
#: models.py:27
msgid "Required. 64 characters or fewer. Letters, digits and ./- only."
msgstr "Requerit. 64 caràcters o menys. Només lletres, xifres i ./-."
#: models.py:30
msgid "account"
msgstr "compte"
#: models.py:31
msgid "active"
msgstr "actiu"
#: models.py:32
msgid "Designates whether this service should be treated as active. "
msgstr "Designa si aquest servei ha de ser tractat com actiu."
#: models.py:33
msgid "data"
msgstr ""
#: models.py:34
msgid "Extra information dependent of each service."
msgstr "Informació addicional dependent de cada servei."
#: models.py:36
msgid ""
"Optional and alternative URL for accessing this service instance. i.e. "
"<tt>https://wiki.mydomain/doku/</tt><br>A related website will be "
"automatically configured if needed."
msgstr ""
"URL opcional i alternativa per accedir a aquesta instància de servei. És a dir, "
"<tt>https://wiki.mydomain/doku/</tt><br>Un lloc web relacionat serà "
"configurat automàticament si és necessari."
#: services/bscw.py:11 services/bscw.py:15 services/gitlab.py:13
#: services/gitlab.py:23 services/seafile.py:13 services/seafile.py:19
#: services/wordpress.py:14 services/wordpress.py:32
msgid "Email"
msgstr ""
#: services/dokuwiki.py:22
#, python-format
msgid "Support for specific URL paths (%s) is not implemented."
msgstr "El suport per a rutes d'URL específiques (%s) no està implementat."
#: services/gitlab.py:14
msgid ""
"Initial email address, changes on the GitLab server are not reflected here."
msgstr ""
#: services/gitlab.py:19
msgid "ID of this user used by GitLab, the only attribute that doesn't change."
msgstr ""
#: services/gitlab.py:24
msgid "User ID"
msgstr ""
#: services/helpers.py:18 services/helpers.py:66
#, python-format
msgid "Error validating related %s: %s"
msgstr "Error en validar el %s relacionat: %s"
#: services/helpers.py:33
#, python-format
msgid "%s scheme not supported (http/https)"
msgstr "Esquema %s no suportat (http/https)"
#: services/helpers.py:50
#, python-format
msgid "Domain %s does not exist."
msgstr "El domini %s no existeix."
#: services/helpers.py:54
#, python-format
msgid "Domain %s does not belong to account %s, it's from %s."
msgstr "El domini %s no pertany a l'account %s, és de %s."
#: services/helpers.py:93
#, python-format
msgid "Another directive with this URL path exists (%s)."
msgstr "Ja existeix una altra directiva amb aquesta ruta d'URL (%s)."
#: services/moodle.py:12 services/phplist.py:18
msgid "Admin username"
msgstr "Usuari admin"
#: services/options.py:34
msgid "Software as a Service"
msgstr ""
#: services/options.py:70
msgid "Custom URL not allowed for this service."
msgstr "URL personalitzada no permesa per a aquest servei."
#: services/options.py:82
msgid "Validate creation execution has failed."
msgstr "La validació de l'execució de creació ha fallat."
#: services/options.py:85
msgid "User with this username already exists."
msgstr "Ja existeix un usuari amb aquest nom d'usuari."
#: services/options.py:87
msgid "User with this email address already exists."
msgstr "Ja existeix un usuari amb aquesta adreça de correu electrònic."
#: services/options.py:184
#, python-format
msgid "Global database user for PHPList '%(db_user)s' does not exists."
msgstr ""
#: services/phplist.py:20
msgid "Database"
msgstr "Base de dades"
#: services/phplist.py:21
msgid "Database dedicated to this phpList instance."
msgstr ""
#: services/phplist.py:24
msgid "Bounces mailbox"
msgstr ""
#: services/phplist.py:25
msgid "Dedicated mailbox used for reciving bounces."
msgstr ""
#: services/phplist.py:37
msgid "Admin URL http://{}/admin/"
msgstr ""
#: services/phplist.py:48
#, python-brace-format
msgid "Admin URL <a href={0}>{0}</a>"
msgstr ""
#: services/seafile.py:14 services/seafile.py:20
msgid "Quota"
msgstr ""
#: services/seafile.py:15 services/seafile.py:21
msgid "Disk quota in MB."
msgstr ""
#: services/wordpress.py:15
msgid ""
"A new user will be created if the above email address is not in the database."
"<br>The username and password will be mailed to this email address."
msgstr ""
"Es crearà un nou usuari si l'adreça de correu electrònic anterior no es troba a la base de dades."
"<br>El nom d'usuari i la contrasenya seran enviats a aquesta adreça de correu electrònic."
#: services/wordpress.py:28
msgid ""
"ID of this blog used by WordPress, the only attribute that doesn't change."
msgstr ""
"ID d'aquest blog utilitzat per WordPress, l'únic atribut que no canvia."
#: services/wordpress.py:33
msgid "Blog ID"
msgstr ""
#: settings.py:32
msgid "IP addresses to ignore during traffic accountability."
msgstr "Adreces IP a ignorar durant la responsabilitat del trànsit."
#: settings.py:41 settings.py:79 settings.py:120 settings.py:138
#: settings.py:291
msgid "Whether allow custom URL to be specified or not."
msgstr "Si es permet especificar una URL personalitzada o no."
#: settings.py:47 settings.py:234 settings.py:251
#, python-brace-format
msgid ""
"Filesystem path for the webserver access logs.<br><tt>LogFormat \"%h %l %u "
"%t \"%r\" %>s %O \"%{Host}i\"\" host</tt>"
msgstr ""
#: settings.py:66
msgid ""
"Needed for domain mapping when <tt>SAAS_WORDPRESS_ALLOW_CUSTOM_URL</tt> is "
"enabled."
msgstr ""
"Necessari per al mapeig de dominis quan <tt>SAAS_WORDPRESS_ALLOW_CUSTOM_URL</tt> està "
"habilitat."
#: settings.py:71 settings.py:182
msgid "Verify SSL certificate on the HTTP requests performed by the backend."
msgstr "Verificar el certificat SSL a les sol·licituds HTTP realitzades pel backend."
#: settings.py:144 settings.py:149 settings.py:154 settings.py:159
#: settings.py:297 settings.py:302 settings.py:307 settings.py:312
msgid "Needed for password changing support."
msgstr "Necessari per al suport de canvi de contrasenya."
#: settings.py:168
msgid "Because of max system group name of the bounces mailbox is 32."
msgstr "Degut a que el nom màxim del grup del sistema per al correu de rebots és de 32 caràcters."
#: settings.py:187
msgid ""
"Filesystem path to the phpList source code installed on the server. Used by "
"<tt>SAAS_PHPLIST_CRONTAB</tt>."
msgstr ""
#: settings.py:193
msgid ""
"System user running phpList on the server.Used by <tt>SAAS_PHPLIST_CRONTAB</"
"tt>."
msgstr ""
#: settings.py:200
msgid ""
"<tt>processqueue</tt> and <tt>processbounce</tt> phpList cron execution. "
"Left blank if you don't want crontab to be configured"
msgstr ""
#: settings.py:322 settings.py:328
msgid ""
"Filesystem path to the Moodle source code installed on the server. Used by "
"<tt>SAAS_MOODLE_CRONTAB</tt>."
msgstr ""
#: settings.py:334
msgid ""
"System user running Moodle on the server.Used by <tt>SAAS_MOODLE_CRONTAB</"
"tt>."
msgstr ""
#: settings.py:340
msgid "Left blank if you don't want crontab to be configured"
msgstr "Deixa en blanc si no vols que es configuri el crontab."
#: validators.py:12
#, python-format
msgid ""
"Allow custom URL is enabled for '%s', but has no associated "
"WEBSITES_SAAS_DIRECTIVES"
msgstr ""
"Es permet la URL personalitzada per a '%s', però no té associades "
"les DIRECTIVES_SAAS_WEBSITES."

Binary file not shown.

View File

@ -0,0 +1,404 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-11-08 10:44+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:40
msgid "Related website directive does not exist for this custom URL."
msgstr ""
#: admin.py:50
msgid "URL"
msgstr ""
#: backends/__init__.py:244
msgid "nextCloud SaaS Disk Quota"
msgstr "nextCloud SaaS Cuota de Disco"
#: backends/bscw.py:11
msgid "BSCW SaaS"
msgstr ""
#: backends/dokuwikimu.py:20
msgid "DokuWiki multisite"
msgstr ""
#: backends/dokuwikimu.py:110
msgid "DokuWiki MU Traffic"
msgstr ""
#: backends/drupalmu.py:15
msgid "Drupal multisite"
msgstr ""
#: backends/gitlab.py:12
msgid "GitLab SaaS"
msgstr ""
#: backends/moodle.py:49
msgid "Moodle multisite"
msgstr ""
#: backends/nextcloud.py:15
msgid "nextCloud SaaS"
msgstr ""
#: backends/nextcloud.py:55
msgid "nextCloud SaaS Traffic"
msgstr ""
#: backends/owncloud.py:104
msgid "ownCloud SaaS"
msgstr ""
#: backends/owncloud.py:136
msgid "ownCloud SaaS Traffic"
msgstr ""
#: backends/owncloud.py:146
msgid "ownCloud SaaS Disk Quota"
msgstr ""
#: backends/phplist.py:32
msgid "phpList SaaS"
msgstr ""
#: backends/phplist.py:132
msgid "phpList SaaS Traffic"
msgstr ""
#: backends/wordpressmu.py:23
msgid "Wordpress multisite"
msgstr ""
#: backends/wordpressmu.py:274
msgid "Wordpress MU Traffic"
msgstr ""
#: filters.py:6 models.py:35
msgid "custom URL"
msgstr "URL Personalizada"
#: filters.py:11
msgid "True"
msgstr ""
#: filters.py:12
msgid "False"
msgstr ""
#: forms.py:14
msgid "Site URL"
msgstr "URL del sitio"
#: forms.py:48 services/phplist.py:31
msgid "Site name"
msgstr "Nombre del sitio"
#: forms.py:48
msgid "Username"
msgstr "Usuario"
#: forms.py:52 forms.py:64
msgid "Password"
msgstr "Contraseña"
#: forms.py:57 serializers.py:20
msgid ""
"Enter a valid password. This value may contain any ascii character except "
"for '/\"/\\/ characters."
msgstr ""
"Introduce una contraseña válida. Este valor puede contener cualquier carácter ASCII excepto "
"los siguientes caracteres '/\"/\\/ ."
#: forms.py:61
msgid ""
"Passwords are not stored, so there is no way to see this service's password, "
"but you can change the password using <a href=\"../password/\">this form</a>."
msgstr ""
"Las contraseñas no se almacenan, por lo que no hay forma de ver la contraseña de este servicio, "
"pero puedes cambiar la contraseña utilizando <a href=\"../password/\">en este formulario</a>."
#: forms.py:67
msgid "Password confirmation"
msgstr "Confirma contraseña"
#: forms.py:69
msgid "Enter the same password as above, for verification."
msgstr "Introduce la misma contraseña que la anterior, para su verificación."
#: forms.py:80
#, python-format
msgid "Suggestion: %s"
msgstr "Sugerencia: %s"
#: forms.py:87
msgid "The two password fields didn't match."
msgstr "Los dos campos de contraseña no coinciden."
#: models.py:24
msgid "service"
msgstr "servicio"
#: models.py:26
msgid "Name"
msgstr "Nombre"
#: models.py:27
msgid "Required. 64 characters or fewer. Letters, digits and ./- only."
msgstr "Requerido. 64 caracteres o menos. Solo letras, números y ./-."
#: models.py:30
msgid "account"
msgstr "cuenta"
#: models.py:31
msgid "active"
msgstr "activo?"
#: models.py:32
msgid "Designates whether this service should be treated as active. "
msgstr "Designa si este servicio debe ser tratado como activo."
#: models.py:33
msgid "data"
msgstr ""
#: models.py:34
msgid "Extra information dependent of each service."
msgstr "Información adicional dependiente de cada servicio."
#: models.py:36
msgid ""
"Optional and alternative URL for accessing this service instance. i.e. "
"<tt>https://wiki.mydomain/doku/</tt><br>A related website will be "
"automatically configured if needed."
msgstr ""
"URL opcional y alternativa para acceder a esta instancia de servicio. Es decir, "
"<tt>https://wiki.mydomain/doku/</tt><br>Un sitio web relacionado será "
"configurado automáticamente si es necesario."
#: services/bscw.py:11 services/bscw.py:15 services/gitlab.py:13
#: services/gitlab.py:23 services/seafile.py:13 services/seafile.py:19
#: services/wordpress.py:14 services/wordpress.py:32
msgid "Email"
msgstr ""
#: services/dokuwiki.py:22
#, python-format
msgid "Support for specific URL paths (%s) is not implemented."
msgstr "No se ha implementado rutas de URL específicas (%s)."
#: services/gitlab.py:14
msgid ""
"Initial email address, changes on the GitLab server are not reflected here."
msgstr ""
"Dirección de correo electrónico inicial, los cambios en el servidor de GitLab no se reflejan aquí."
#: services/gitlab.py:19
msgid "ID of this user used by GitLab, the only attribute that doesn't change."
msgstr "ID de este usuario utilizado por GitLab, el único atributo que no cambia."
#: services/gitlab.py:24
msgid "User ID"
msgstr "ID usuario"
#: services/helpers.py:18 services/helpers.py:66
#, python-format
msgid "Error validating related %s: %s"
msgstr "Error relacionado al validar el %s: %s"
#: services/helpers.py:33
#, python-format
msgid "%s scheme not supported (http/https)"
msgstr "%s Esquema no soportado (http/https)"
#: services/helpers.py:50
#, python-format
msgid "Domain %s does not exist."
msgstr "Dominio %s no existe."
#: services/helpers.py:54
#, python-format
msgid "Domain %s does not belong to account %s, it's from %s."
msgstr "El dominio %s no pertenece a la cuenta %s, es de %s."
#: services/helpers.py:93
#, python-format
msgid "Another directive with this URL path exists (%s)."
msgstr "Ya existe otra directiva con esta ruta de URL (%s)."
#: services/moodle.py:12 services/phplist.py:18
msgid "Admin username"
msgstr "Usuario admin"
#: services/options.py:34
msgid "Software as a Service"
msgstr ""
#: services/options.py:70
msgid "Custom URL not allowed for this service."
msgstr "URL personalizada no permitida para este servicio."
#: services/options.py:82
msgid "Validate creation execution has failed."
msgstr "La validación de la ejecución de creación ha fallado."
#: services/options.py:85
msgid "User with this username already exists."
msgstr "El usuario con este nombre ya existe."
#: services/options.py:87
msgid "User with this email address already exists."
msgstr "El usuario con este email ya existe."
#: services/options.py:184
#, python-format
msgid "Global database user for PHPList '%(db_user)s' does not exists."
msgstr "El usuario global de la base de datos para PHPList '%(db_user)s' no existe."
#: services/phplist.py:20
msgid "Database"
msgstr "Base de datos"
#: services/phplist.py:21
msgid "Database dedicated to this phpList instance."
msgstr "Base de datos dedicada a esta instancia de phpList."
#: services/phplist.py:24
msgid "Bounces mailbox"
msgstr ""
#: services/phplist.py:25
msgid "Dedicated mailbox used for reciving bounces."
msgstr ""
#: services/phplist.py:37
msgid "Admin URL http://{}/admin/"
msgstr ""
#: services/phplist.py:48
#, python-brace-format
msgid "Admin URL <a href={0}>{0}</a>"
msgstr ""
#: services/seafile.py:14 services/seafile.py:20
msgid "Quota"
msgstr ""
#: services/seafile.py:15 services/seafile.py:21
msgid "Disk quota in MB."
msgstr ""
#: services/wordpress.py:15
msgid ""
"A new user will be created if the above email address is not in the database."
"<br>The username and password will be mailed to this email address."
msgstr ""
"Se creará un nuevo usuario si la dirección de correo electrónico anterior no está en la base de datos."
"<br>El nombre de usuario y la contraseña se enviarán a esta dirección de correo electrónico."
#: services/wordpress.py:28
msgid ""
"ID of this blog used by WordPress, the only attribute that doesn't change."
msgstr ""
"ID de este blog utilizado por WordPress, el único atributo que no cambia."
#: services/wordpress.py:33
msgid "Blog ID"
msgstr ""
#: settings.py:32
msgid "IP addresses to ignore during traffic accountability."
msgstr "Direcciones IP a ignorar durante la contabilidad del tráfico."
#: settings.py:41 settings.py:79 settings.py:120 settings.py:138
#: settings.py:291
msgid "Whether allow custom URL to be specified or not."
msgstr "Si se permite o no especificar una URL personalizada."
#: settings.py:47 settings.py:234 settings.py:251
#, python-brace-format
msgid ""
"Filesystem path for the webserver access logs.<br><tt>LogFormat \"%h %l %u "
"%t \"%r\" %>s %O \"%{Host}i\"\" host</tt>"
msgstr ""
#: settings.py:66
msgid ""
"Needed for domain mapping when <tt>SAAS_WORDPRESS_ALLOW_CUSTOM_URL</tt> is "
"enabled."
msgstr ""
"Necesario para el mapeo de dominios cuando <tt>SAAS_WORDPRESS_ALLOW_CUSTOM_URL</tt> está "
"habilitado."
#: settings.py:71 settings.py:182
msgid "Verify SSL certificate on the HTTP requests performed by the backend."
msgstr "Verificar el certificado SSL en las solicitudes HTTP realizadas por el backend."
#: settings.py:144 settings.py:149 settings.py:154 settings.py:159
#: settings.py:297 settings.py:302 settings.py:307 settings.py:312
msgid "Needed for password changing support."
msgstr "Necesario para el soporte de cambio de contraseña."
#: settings.py:168
msgid "Because of max system group name of the bounces mailbox is 32."
msgstr ""
#: settings.py:187
msgid ""
"Filesystem path to the phpList source code installed on the server. Used by "
"<tt>SAAS_PHPLIST_CRONTAB</tt>."
msgstr ""
#: settings.py:193
msgid ""
"System user running phpList on the server.Used by <tt>SAAS_PHPLIST_CRONTAB</"
"tt>."
msgstr ""
#: settings.py:200
msgid ""
"<tt>processqueue</tt> and <tt>processbounce</tt> phpList cron execution. "
"Left blank if you don't want crontab to be configured"
msgstr ""
#: settings.py:322 settings.py:328
msgid ""
"Filesystem path to the Moodle source code installed on the server. Used by "
"<tt>SAAS_MOODLE_CRONTAB</tt>."
msgstr ""
#: settings.py:334
msgid ""
"System user running Moodle on the server.Used by <tt>SAAS_MOODLE_CRONTAB</"
"tt>."
msgstr ""
#: settings.py:340
msgid "Left blank if you don't want crontab to be configured"
msgstr ""
#: validators.py:12
#, python-format
msgid ""
"Allow custom URL is enabled for '%s', but has no associated "
"WEBSITES_SAAS_DIRECTIVES"
msgstr ""
"Se ha habilitado la URL personalizada para '%s', pero no tiene asociadas "
"las DIRECTIVAS_SAAS_WEBSITES."