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.core.exceptions import ValidationError
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 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.mailboxes.models import Address, Mailbox
from orchestra.contrib.systemusers.models import WebappUsers, SystemUser
from orchestra.contrib.saas.models import SaaS
from orchestra.contrib.musician.validators import ValidateZoneMixin
from . import api

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \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"
"Last-Translator: \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"
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."
msgstr "Les contrasenyes introduïdes no coincideixen."
#: forms.py:38 forms.py:108
#: forms.py:45 forms.py:115
msgid "Password"
msgstr "Contrasenya"
#: forms.py:43 forms.py:113
#: forms.py:50 forms.py:120
msgid "Password confirmation"
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."
msgstr "Introdueix la mateixa contrasenya per verificar-la."
@ -56,13 +56,14 @@ msgid "Mailing lists"
msgstr "Llistes de correu"
#. Translators: This message appears on the page title
#: mixins.py:17 views.py:68
#: mixins.py:17 views.py:119
msgid "Dashboard"
msgstr "Panell de gestió"
#. Translators: This message appears on the page title
#: mixins.py:18 templates/musician/dashboard.html:89
#: templates/musician/dashboard.html:90 views.py:202
#: mixins.py:18 templates/musician/dashboard.html:106
#: templates/musician/dashboard.html:107
#: templates/musician/websites/website_detail.html:17 views.py:259
msgid "Domains"
msgstr "Dominis"
@ -71,28 +72,33 @@ msgid "Mails"
msgstr "Correus"
#. 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"
msgstr "Bases de dades"
msgid "Database"
msgstr "Bases de dades"
#: mixins.py:22
msgid "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
#: mixins.py:23 websites/views.py:24
#: mixins.py:25 websites/views.py:24
msgid "Websites"
msgstr ""
#. Translators: This message appears on the page title
#: mixins.py:24 webapps/views.py:25
#: mixins.py:26 webapps/views.py:25
msgid "Webapps"
msgstr ""
#: mixins.py:25
#: mixins.py:27
msgid "Users"
msgstr "Usuaris"
@ -101,7 +107,7 @@ msgid "Description details for databases page."
msgstr "Consulta la configuració de les teves bases de dades."
#. Translators: This message appears on the page title
#: models.py:234 views.py:342
#: models.py:234 views.py:399
msgid "Mail addresses"
msgstr "Adreces de correu"
@ -135,6 +141,58 @@ msgstr ""
"Si tens algun servei SaaS (Software as a Service) contractat, aquí trobaràs "
"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
msgid "Log in"
msgstr "Accedeix"
@ -166,6 +224,7 @@ msgstr ""
#: templates/musician/mailbox_check_delete.html:11
#: templates/musician/mailing_check_delete.html:8
#: templates/musician/record_check_delete.html:9
#: templates/musician/saas_check_delete.html:8
#: templates/musician/webapps/webappoption_check_delete.html:9
#: templates/musician/websites/websiteoption_check_delete.html:13
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/mailing_check_delete.html:9
#: templates/musician/mailinglist_form.html:30
#: templates/musician/nextcloud_change_password.html:11
#: templates/musician/record_check_delete.html:11
#: 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/webapps/webapp_form.html:11
#: templates/musician/webapps/webapp_option_form.html:18
@ -199,6 +262,9 @@ msgstr "Cancel·lar"
#: templates/musician/mailinglist_form.html:34
#: templates/musician/record_check_delete.html:10
#: 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/webappoption_check_delete.html:10
#: templates/musician/websites/websiteoption_check_delete.html:14
@ -209,7 +275,10 @@ msgstr "Esborrar"
#: templates/musician/mailbox_change_password.html:12
#: templates/musician/mailbox_form.html:21
#: templates/musician/mailinglist_form.html:31
#: templates/musician/nextcloud_change_password.html:12
#: 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/webapps/webapp_form.html:12
#: templates/musician/webapps/webapp_option_form.html:19
@ -229,17 +298,13 @@ msgstr "Filtrat"
msgid "Search"
msgstr ""
#: templates/musician/address_list.html:25
msgid "Email"
msgstr "Correu electrònic"
#: templates/musician/address_list.html:26
msgid "Domain"
msgstr "Domini"
#. Translators: This message appears on the page title
#: templates/musician/address_list.html:27 templates/musician/mail_base.html:22
#: views.py:428
#: views.py:485
msgid "Mailboxes"
msgstr "Bústies de correu"
@ -261,7 +326,7 @@ msgstr "Perfil"
#. Translators: This message appears on the page title
#: templates/musician/base.html:71 templates/musician/billing.html:6
#: views.py:300
#: views.py:357
msgid "Billing"
msgstr "Factures"
@ -287,8 +352,10 @@ msgstr "Data de la factura"
#: templates/musician/billing.html:21 templates/musician/database_list.html:22
#: 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/websites/website_list.html:72
msgid "Type"
msgstr "Tipus"
@ -322,11 +389,14 @@ msgid "Show history"
msgstr "Mostrar historial"
#: 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/websites/website_detail.html:77
#: templates/musician/websites/website_list.html:20
#: templates/musician/mailinglist_list.html:24
msgid "Name"
msgstr "Nom"
@ -347,13 +417,17 @@ msgstr "Obre el gestor de bases de dades"
#. Translators: database page when there isn't any database.
#. Translators: saas page when there isn't any saas.
#: 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!"
msgstr "Mmmh, sembla que aquí no hi ha res!"
#: templates/musician/domain_detail.html:5
#: templates/musician/mailinglist_form.html:16
#: 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_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/webapps/webapp_detail.html:95
#: templates/musician/webapps/webapp_detail.html:97
#: templates/musician/websites/website_detail.html:78
msgid "Value"
msgstr "Valor"
@ -439,11 +513,6 @@ msgstr "adreces de correu creades"
msgid "Mail list"
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
msgid "Nothing installed"
msgstr "No tens res instal·lat"
@ -497,6 +566,8 @@ msgstr "Adreces de correu"
#: templates/musician/mailbox_change_password.html:5
#: 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/webapps/webappuser_change_password.html:5
msgid "Change password"
@ -559,9 +630,11 @@ msgstr "Actualitzar llista"
msgid "Create list"
msgstr "Crear llista"
#: templates/musician/websites/website_list.html:23
#: templates/musician/saas_list.html:20
#: 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"
msgstr "Estat"
@ -625,7 +698,15 @@ msgstr "Actualitza la contrasenya a"
msgid "Add record to"
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_nextcloud_list.html:15
#: templates/musician/saas_wordpress_list.html:15
msgid "Service"
msgstr "Servei"
@ -633,14 +714,35 @@ msgstr "Servei"
msgid "Service info"
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"
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"
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
msgid ""
"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."
msgstr ""
"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/*), "
"però mai podrà editar el contingut en un lloc web."
"dels seus llocs web a (/home/account/logs) i tot el contingut web (/home/"
"account/webapps/*), però mai podrà editar el contingut en un lloc web."
#: templates/musician/systemuser_list.html:7
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/webapps/webappuser_list.html:15
@ -661,6 +764,7 @@ msgid "Username"
msgstr "Nom dusuari/a"
#: templates/musician/systemuser_list.html:19
#: templates/musician/webapps/webapp_detail.html:47
#: templates/musician/webapps/webappuser_list.html:16
#: templates/musician/websites/website_detail.html:49
msgid "Path"
@ -674,23 +778,23 @@ msgstr "Usuari Principal"
msgid "SFTP Users"
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
msgid "WebApp Options for"
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
msgid "Database:"
msgstr "Bases de dades"
@ -703,26 +807,37 @@ msgstr "Usuari DB"
msgid "Password:"
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"
msgstr "Configuració PHP"
#: templates/musician/webapps/webapp_detail.html:85
#: templates/musician/webapps/webapp_detail.html:87
msgid "PHP settings page description."
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
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"
msgstr "Afegir nova Opcio"
#: templates/musician/webapps/webapp_detail.html:27
msgid "SFTP user"
msgstr "Usuari SFTP"
#: templates/musician/webapps/webapp_list.html:27
msgid "Version"
msgstr ""
@ -731,12 +846,6 @@ msgstr ""
msgid "SFTP User"
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
msgid "Update Option of"
msgstr "Actualitza Opcions per"
@ -755,6 +864,14 @@ msgstr "Estàs segur/a que vols esborrar la següent opció?"
msgid "WebSite Options for"
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
msgid "Edit options"
msgstr "Editar opcions"
@ -801,51 +918,58 @@ msgstr "Actualitzar Opció de WebSite"
msgid "Url"
msgstr ""
#: templates/musician/websites/website_list.html:89
#, fuzzy
#| msgid "SFTP user"
msgid "FTP user"
msgstr "Usuari SFTP"
#: validators.py:28
#, python-format
msgid ""
"%s: Hosts can not have underscore character '_', consider providing a SRV, "
"CNAME or TXT record."
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"
msgstr "disponibles"
#: views.py:182
#: views.py:239
msgid "Account"
msgstr "Compte"
#. Translators: This message appears on the page title
#: views.py:227
#: views.py:284
msgid "User profile"
msgstr "El teu perfil"
#. Translators: This message appears on the page title
#: views.py:314
#: views.py:371
msgid "Download bill"
msgstr "Descarrega la factura"
#. Translators: This message appears on the page title
#: views.py:573
#: views.py:620
msgid "Domain details"
msgstr "Detalls del domini"
#. Translators: This message appears on the page title
#: views.py:629
#: views.py:676
msgid "Login"
msgstr "Accés"
#. Translators: This message appears on the page title
#: views.py:700
#: views.py:747
msgid "Webapp users"
msgstr ""
#. Translators: This message appears on the page title
#: views.py:718
#: views.py:765
msgid "Main users"
msgstr ""
msgstr "Usuari principal"
#: webapps/forms.py:62
msgid "This option already exist."
@ -856,15 +980,16 @@ msgid ""
"A web app is the directory where your website is stored. Through SFTP, you "
"can access this directory and upload/edit/delete files."
msgstr ""
"Una WebApp és el directori on es desa el teu WebSite. "
"A través de SFTP, pots accedir a aquest directori i pujar, editar o eliminar fitxers."
"Una WebApp és el directori on es desa el teu WebSite. A través de SFTP, pots "
"accedir a aquest directori i pujar, editar o eliminar fitxers."
#: webapps/views.py:35
msgid ""
"Each Webapp has its own SFTP user, which is created automatically when the "
"Webapp is created."
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
#: webapps/views.py:44
@ -877,7 +1002,8 @@ msgstr "Detalls de cada tipus"
msgid ""
"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
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
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 "
"the web files are located. (WebApp)"
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
#: websites/views.py:42
@ -897,6 +1024,9 @@ msgstr ""
msgid "website details"
msgstr "Detalls de cada tipus"
#~ msgid "Database"
#~ msgstr "Bases de dades"
#, fuzzy
#~| msgid "Change password"
#~ msgid "Change password for"
@ -908,9 +1038,6 @@ msgstr "Detalls de cada tipus"
#~ msgid "Previous"
#~ msgstr "Prèvia"
#~ msgid "Next"
#~ msgstr "Següent"
#~ msgid "Notifications"
#~ msgstr "Notificacions"
@ -928,9 +1055,6 @@ msgstr "Detalls de cada tipus"
#~ msgid "No users for this database."
#~ msgstr "No hi ha persones usuàries daquesta base de dades."
#~ msgid "active"
#~ msgstr "actiu"
#~ msgid "Traffic"
#~ msgstr "Tràfic"
@ -965,14 +1089,14 @@ msgstr "Detalls de cada tipus"
#~ msgid "databases created"
#~ msgstr "bases de dades creades"
msgid "size"
msgstr "tamany"
#~ msgid "size"
#~ msgstr "tamany"
msgid "traffic"
msgstr "tránsit"
#~ msgid "traffic"
#~ msgstr "tránsit"
msgid "Mailman list traffic"
msgstr "Llistes de Mailman"
#~ msgid "Mailman list traffic"
#~ msgstr "Llistes de Mailman"
msgid "Mailman list Traffic"
msgstr "Llistes de Mailman"
#~ msgid "Mailman list Traffic"
#~ msgstr "Llistes de Mailman"

View File

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \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"
"Last-Translator: \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"
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."
msgstr "Las contraseñas introducidas no coinciden."
#: forms.py:38 forms.py:108
#: forms.py:45 forms.py:115
msgid "Password"
msgstr "Contraseña"
#: forms.py:43 forms.py:113
#: forms.py:50 forms.py:120
msgid "Password confirmation"
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."
msgstr "Introduce la misma contraseña para verificarla"
@ -62,9 +62,9 @@ msgid "Dashboard"
msgstr "Panel de gestión"
#. Translators: This message appears on the page title
#: mixins.py:18 templates/musician/dashboard.html:101
#: templates/musician/dashboard.html:102
#: templates/musician/websites/website_detail.html:17 views.py:252
#: mixins.py:18 templates/musician/dashboard.html:106
#: templates/musician/dashboard.html:107
#: templates/musician/websites/website_detail.html:17 views.py:259
msgid "Domains"
msgstr "Dominios"
@ -73,7 +73,7 @@ msgid "Mails"
msgstr "Correos"
#. 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"
msgstr "Bases de datos"
@ -81,17 +81,25 @@ msgstr "Bases de datos"
msgid "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
#: mixins.py:23 websites/views.py:24
#: mixins.py:25 websites/views.py:24
msgid "Websites"
msgstr ""
#. Translators: This message appears on the page title
#: mixins.py:24 webapps/views.py:25
#: mixins.py:26 webapps/views.py:25
msgid "Webapps"
msgstr ""
#: mixins.py:25
#: mixins.py:27
msgid "Users"
msgstr "Usuarios"
@ -100,7 +108,7 @@ msgid "Description details for databases page."
msgstr "Consulta la configuración de tus bases de datos."
#. Translators: This message appears on the page title
#: models.py:234 views.py:392
#: models.py:234 views.py:399
msgid "Mail addresses"
msgstr "Direcciones de correo"
@ -135,6 +143,58 @@ msgstr ""
"Si tienes algún servicio SaaS (Software as a Service) contratado, aquí "
"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
msgid "Log in"
msgstr "Accede"
@ -167,6 +227,7 @@ msgstr ""
#: templates/musician/mailbox_check_delete.html:11
#: templates/musician/mailing_check_delete.html:8
#: templates/musician/record_check_delete.html:9
#: templates/musician/saas_check_delete.html:8
#: templates/musician/webapps/webappoption_check_delete.html:9
#: templates/musician/websites/websiteoption_check_delete.html:13
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/mailing_check_delete.html:9
#: templates/musician/mailinglist_form.html:30
#: templates/musician/nextcloud_change_password.html:11
#: templates/musician/record_check_delete.html:11
#: 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/webapps/webapp_form.html:11
#: templates/musician/webapps/webapp_option_form.html:18
@ -200,6 +265,9 @@ msgstr "Cancelar"
#: templates/musician/mailinglist_form.html:34
#: templates/musician/record_check_delete.html:10
#: 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/webappoption_check_delete.html:10
#: templates/musician/websites/websiteoption_check_delete.html:14
@ -210,7 +278,10 @@ msgstr "Borrar"
#: templates/musician/mailbox_change_password.html:12
#: templates/musician/mailbox_form.html:21
#: templates/musician/mailinglist_form.html:31
#: templates/musician/nextcloud_change_password.html:12
#: 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/webapps/webapp_form.html:12
#: templates/musician/webapps/webapp_option_form.html:19
@ -230,17 +301,13 @@ msgstr "Filtrado"
msgid "Search"
msgstr ""
#: templates/musician/address_list.html:25
msgid "Email"
msgstr "Correo electrónico"
#: templates/musician/address_list.html:26
msgid "Domain"
msgstr "Dominio"
#. Translators: This message appears on the page title
#: templates/musician/address_list.html:27 templates/musician/mail_base.html:22
#: views.py:478
#: views.py:485
msgid "Mailboxes"
msgstr "Buzones de correo"
@ -262,7 +329,7 @@ msgstr "Perfil"
#. Translators: This message appears on the page title
#: templates/musician/base.html:71 templates/musician/billing.html:6
#: views.py:350
#: views.py:357
msgid "Billing"
msgstr "Facturas"
@ -291,6 +358,7 @@ msgstr "Fecha de la factura"
#: templates/musician/webapps/webapp_detail.html:17
#: templates/musician/webapps/webapp_detail.html:96
#: templates/musician/webapps/webapp_list.html:26
#: templates/musician/websites/website_list.html:72
msgid "Type"
msgstr "Tipo"
@ -327,6 +395,8 @@ msgstr "Mostrar historial"
#: 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/websites/website_detail.html:77
#: 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: saas page when there isn't any saas.
#: 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!"
msgstr "Mmmh… ¡parece que aquí no hay nada!"
#: templates/musician/domain_detail.html:5
#: templates/musician/mailinglist_form.html:16
#: 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_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"
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
msgid "Nothing installed"
msgstr "No tienes nada instalado"
@ -501,6 +570,8 @@ msgstr "Direcciones de correo"
#: templates/musician/mailbox_change_password.html:5
#: 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/webapps/webappuser_change_password.html:5
msgid "Change password"
@ -565,6 +636,8 @@ msgstr "Crear lista"
#: 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"
msgstr "Estado"
@ -631,7 +704,15 @@ msgstr "Actualiza la contraseña"
msgid "Add record to"
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_nextcloud_list.html:15
#: templates/musician/saas_wordpress_list.html:15
msgid "Service"
msgstr "Servicio"
@ -639,14 +720,34 @@ msgstr "Servicio"
msgid "Service info"
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"
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"
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
msgid ""
"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"
#: templates/musician/webapps/webapp_detail.html:27
#: templates/musician/websites/website_list.html:82
msgid "SFTP user"
msgstr "Usuario SFTP"
@ -822,6 +924,12 @@ msgstr "Actualizar Opción de WebSite"
msgid "Url"
msgstr ""
#: templates/musician/websites/website_list.html:89
#, fuzzy
#| msgid "SFTP user"
msgid "FTP user"
msgstr "Usuario SFTP"
#: validators.py:28
#, python-format
msgid ""
@ -831,43 +939,43 @@ msgstr ""
"%s: Los hosts no pueden tener el carácter de subrayado '_'. Considere "
"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"
msgstr "disponibles"
#: views.py:232
#: views.py:239
msgid "Account"
msgstr "Cuenta"
#. Translators: This message appears on the page title
#: views.py:277
#: views.py:284
msgid "User profile"
msgstr "Tu perfil"
#. Translators: This message appears on the page title
#: views.py:364
#: views.py:371
msgid "Download bill"
msgstr "Descarga la factura"
#. Translators: This message appears on the page title
#: views.py:623
#: views.py:620
msgid "Domain details"
msgstr "Detalles del dominio"
#. Translators: This message appears on the page title
#: views.py:679
#: views.py:676
msgid "Login"
msgstr "Accede"
#. Translators: This message appears on the page title
#: views.py:750
#: views.py:747
msgid "Webapp users"
msgstr ""
#. Translators: This message appears on the page title
#: views.py:768
#: views.py:765
msgid "Main users"
msgstr ""
msgstr "Usuarios principales"
#: webapps/forms.py:62
msgid "This option already exist."
@ -920,72 +1028,69 @@ msgstr ""
msgid "website details"
msgstr "Detalles de cada tipo"
msgid "Database"
msgstr "Bases de datos"
#~ msgid "Database"
#~ msgstr "Bases de datos"
msgid "Change password for"
msgstr "Cambia la contraseña de"
#~ msgid "Change password for"
#~ msgstr "Cambia la contraseña de"
#~ msgid "Domains & websites"
#~ msgstr "Dominios y sitios web"
msgid "Previous"
msgstr "Previa"
#~ msgid "Previous"
#~ msgstr "Previa"
msgid "Next"
msgstr "Siguiente"
#~ msgid "Notifications"
#~ msgstr "Notificaciones"
msgid "Notifications"
msgstr "Notificaciones"
#~ msgid "There is no notifications at this time."
#~ msgstr "No tienes ninguna notificación."
msgid "There is no notifications at this time."
msgstr "No tienes ninguna notificación."
#~ msgid "Dashboard page description."
#~ 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."
msgstr ""
"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"
#~ msgstr "asociada a"
msgid "associated to"
msgstr "asociada a"
#~ msgid "No users for this database."
#~ msgstr "No hay usuarias/os de esta base de datos."
msgid "No users for this database."
msgstr "No hay usuarias/os de esta base de datos."
#~ msgid "Traffic"
#~ msgstr "Tráfico"
msgid "Traffic"
msgstr "Tráfico"
#~ msgid "Mailbox usage"
#~ msgstr "Uso de espacio en tu buzón de correo"
msgid "Mailbox usage"
msgstr "Uso de espacio en tu buzón de correo"
#~ msgid "Address deleted!"
#~ msgstr "Has eliminado la dirección de correo"
msgid "Address deleted!"
msgstr "Has eliminado la dirección de correo"
#~ msgid "Cannot process your request, please try again later."
#~ 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."
msgstr ""
"Ahora no podemos procesar tu petición, inténtalo de nuevo un poco más "
"tarde por favor."
#~ msgid "Mailbox deleted!"
#~ msgstr "Has eliminado el buzón de correo"
msgid "Mailbox deleted!"
msgstr "Has eliminado el buzón de correo"
#~ msgid "mail address left"
#~ msgstr "direcciones de correo por activar"
msgid "mail address left"
msgstr "direcciones de correo por activar"
#~ msgid "Aliases"
#~ msgstr "Alias"
msgid "Aliases"
msgstr "Alias"
#~ msgid "databases created"
#~ msgstr "bases de datos creadas"
msgid "databases created"
msgstr "bases de datos creadas"
#~ msgid "size"
#~ msgstr "tamaño"
msgid "size"
msgstr "tamaño"
#~ msgid "traffic"
#~ msgstr "tráfico"
msgid "traffic"
msgstr "tráfico"
#~ msgid "Mailman list traffic"
#~ msgstr "Listas de Mailman"
msgid "Mailman list traffic"
msgstr "Listas de Mailman"
msgid "Mailman list Traffic"
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)
# generate services menu items
services_menu = [
{'icon': 'home', 'pattern_name': 'musician:dashboard', 'title': _('Dashboard')},
{'icon': 'globe-europe', 'pattern_name': 'musician:domain-list', 'title': _('Domains')},
{'icon': 'envelope', 'pattern_name': 'musician:address-list', 'title': _('Mails')},
{'icon': 'mail-bulk', 'pattern_name': 'musician:mailing-lists', 'title': _('Mailing lists')},
{'icon': 'database', 'pattern_name': 'musician:database-list', 'title': _('Databases')},
{'icon': 'fire', 'pattern_name': 'musician:saas-list', 'title': _('SaaS')},
{'icon': 'globe', 'pattern_name': 'musician:website-list', 'title': _('Websites')},
{'icon': 'folder', 'pattern_name': 'musician:webapp-list', 'title': _('Webapps'), 'indent': True},
{'icon': 'user', 'pattern_name': 'musician:systemuser-list', 'title': _('Users'), 'indent': True},
{'icon': 'fas fa-home', 'pattern_name': 'musician:dashboard', 'title': _('Dashboard')},
{'icon': 'fas fa-globe', 'pattern_name': 'musician:domain-list', 'title': _('Domains')},
{'icon': 'fas fa-envelope', 'pattern_name': 'musician:address-list', 'title': _('Mails')},
{'icon': 'fas fa-mail-bulk', 'pattern_name': 'musician:mailing-lists', 'title': _('Mailing lists')},
{'icon': 'fas fa-database', 'pattern_name': 'musician:database-list', 'title': _('Databases')},
{'icon': 'fas fa-fire', 'pattern_name': 'musician:saas-nextcloud-list', 'title': _('SaaS')},
{'icon': 'fas fa-cloud', 'pattern_name': 'musician:saas-nextcloud-list', 'title': _('Nextcloud'), 'indent': True},
{'icon': 'fab fa-wordpress', 'pattern_name': 'musician:saas-wordpress-list', 'title': _('Community WP'), '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({
'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">
{% endif %}
<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 }}
</a>
</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 "Status" %}</th>
<th scope="col">{% trans "Service" %}</th>
<th scope="col">{% trans "Service info" %}</th>
<!-- <th scope="col">{% trans "Service info" %}</th> -->
<th></th>
</tr>
</thead>
<tbody>
@ -34,14 +35,20 @@
<span class="sr-only">{{ saas.is_active|yesno }}</span>
</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 }}
<span class="sr-only">{% trans "Open service admin panel" %}</span> <i class="fas fa-external-link-alt"></i></a>
</td>
<td>
<!-- <td>
{% for key, value in saas.data.items %}
<label>{{ key }}:</label> <strong>{{ value }}</strong><br/>
{% 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>
</tr>
{% empty %}
@ -59,4 +66,5 @@
{% include "musician/components/table_paginator.html" %}
</table>
</div>
<!-- <a class="btn btn-primary mt-4 mb-4" href="#">{% trans "New SaaS" %}</a> -->
{% 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('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('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.mailboxes.models import Address, Mailbox
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.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 .websites.views import *
from .lists.views import *
from .saas.views import *
logger = logging.getLogger(__name__)
@ -130,9 +130,8 @@ class DashboardView(CustomContextMixin, UserTokenRequiredMixin, TemplateView):
mailboxes = related_resources.filter(resource_id__verbose_name='mailbox-disk')
lists = related_resources.filter(resource_id__verbose_name='list-traffic')
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)
# TODO(@slamora) update when backend supports notifications
notifications = []
@ -499,10 +498,10 @@ class MailboxListView(ServiceListView):
).filter(
full_address__icontains=cleaned_data["address"]
)
if "name" in cleaned_data:
qs = qs.filter(name__icontains=cleaned_data["name"])
return qs
@ -614,16 +613,6 @@ class DatabaseListView(ServiceListView):
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):
template_name = "musician/domain_detail.html"
extra_context = {

View File

@ -43,7 +43,7 @@ class NextCloudController(NextCloudAPIMixin, ServiceController):
def remove(self, saas, server):
self.api_delete('users/%s' % saas.name)
def save(self, saas):
def save(self, saas):
self.append(self.update_or_create, 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."