From 827d8cc8e1ca459fb89c67b4c1dc9e47cecd56eb Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Wed, 25 Sep 2024 12:43:02 +0200 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(backend)=20change=20email=20?= =?UTF-8?q?invitation=20content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the email invitation content. More document related variables are added. To benefit of the document inheritance, we moved the function email_invitation to the document model. --- CHANGELOG.md | 1 + src/backend/core/api/viewsets.py | 10 +- src/backend/core/models.py | 38 + .../test_api_document_accesses_create.py | 4 +- .../test_api_document_invitations.py | 12 +- .../core/tests/test_models_documents.py | 96 +++ src/backend/core/tests/test_utils.py | 87 -- src/backend/core/utils.py | 40 - .../locale/en_US/LC_MESSAGES/django.mo | Bin 484 -> 484 bytes .../locale/en_US/LC_MESSAGES/django.po | 765 ++++++----------- .../locale/fr_FR/LC_MESSAGES/django.mo | Bin 3033 -> 2205 bytes .../locale/fr_FR/LC_MESSAGES/django.po | 781 +++++++----------- src/mail/mjml/invitation.mjml | 70 +- src/mail/mjml/partial/header.mjml | 4 +- 14 files changed, 753 insertions(+), 1155 deletions(-) delete mode 100644 src/backend/core/tests/test_utils.py delete mode 100644 src/backend/core/utils.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 5865a3f0..6fef5ecd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to ## Changed - 💄(frontend) error alert closeable on editor #284 +- ♻️(backend) Change email content #283 ## Fixed diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 86fdf059..26093007 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -31,7 +31,6 @@ from rest_framework import ( ) from core import models -from core.utils import email_invitation from . import permissions, serializers, utils @@ -567,9 +566,10 @@ class DocumentAccessViewSet( def perform_create(self, serializer): """Add a new access to the document and send an email to the new added user.""" access = serializer.save() - language = self.request.headers.get("Content-Language", "en-us") - email_invitation(language, access.user.email, access.document.id) + access.document.email_invitation( + language, access.user.email, access.role, self.request.user.email + ) class TemplateViewSet( @@ -769,4 +769,6 @@ class InvitationViewset( invitation = serializer.save() language = self.request.headers.get("Content-Language", "en-us") - email_invitation(language, invitation.email, invitation.document.id) + invitation.document.email_invitation( + language, invitation.email, invitation.role, self.request.user.email + ) diff --git a/src/backend/core/models.py b/src/backend/core/models.py index d7f19a2e..203c57ab 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -3,6 +3,7 @@ Declare and configure the models for the impress core application """ import hashlib +import smtplib import tempfile import textwrap import uuid @@ -13,16 +14,20 @@ from logging import getLogger from django.conf import settings from django.contrib.auth import models as auth_models from django.contrib.auth.base_user import AbstractBaseUser +from django.contrib.sites.models import Site from django.core import exceptions, mail, validators from django.core.files.base import ContentFile from django.core.files.storage import default_storage +from django.core.mail import send_mail from django.db import models from django.http import FileResponse from django.template.base import Template as DjangoTemplate from django.template.context import Context +from django.template.loader import render_to_string from django.utils import html, timezone from django.utils.functional import cached_property, lazy from django.utils.translation import gettext_lazy as _ +from django.utils.translation import override import frontmatter import markdown @@ -522,6 +527,39 @@ class Document(BaseModel): "versions_retrieve": can_get_versions, } + def email_invitation(self, language, email, role, username_sender): + """Send email invitation.""" + + domain = Site.objects.get_current().domain + + try: + with override(language): + title = _("%(username)s shared a document with you: %(document)s") % { + "username": username_sender, + "document": self.title, + } + template_vars = { + "title": title, + "domain": domain, + "document": self, + "link": f"{domain}/docs/{self.id}/", + "username": username_sender, + "role": RoleChoices(role).label.lower(), + } + msg_html = render_to_string("mail/html/invitation.html", template_vars) + msg_plain = render_to_string("mail/text/invitation.txt", template_vars) + send_mail( + title, + msg_plain, + settings.EMAIL_FROM, + [email], + html_message=msg_html, + fail_silently=False, + ) + + except smtplib.SMTPException as exception: + logger.error("invitation to %s was not sent: %s", email, exception) + class LinkTrace(BaseModel): """ diff --git a/src/backend/core/tests/documents/test_api_document_accesses_create.py b/src/backend/core/tests/documents/test_api_document_accesses_create.py index 779134e7..f19ee1b3 100644 --- a/src/backend/core/tests/documents/test_api_document_accesses_create.py +++ b/src/backend/core/tests/documents/test_api_document_accesses_create.py @@ -171,7 +171,7 @@ def test_api_document_accesses_create_authenticated_administrator(via, mock_user email = mail.outbox[0] assert email.to == [other_user["email"]] email_content = " ".join(email.body.split()) - assert "Invitation to join Docs!" in email_content + assert f"{user.email} shared a document with you: {document.title}" in email_content assert "docs/" + str(document.id) + "/" in email_content @@ -225,5 +225,5 @@ def test_api_document_accesses_create_authenticated_owner(via, mock_user_teams): email = mail.outbox[0] assert email.to == [other_user["email"]] email_content = " ".join(email.body.split()) - assert "Invitation to join Docs!" in email_content + assert f"{user.email} shared a document with you: {document.title}" in email_content assert "docs/" + str(document.id) + "/" in email_content diff --git a/src/backend/core/tests/documents/test_api_document_invitations.py b/src/backend/core/tests/documents/test_api_document_invitations.py index 77e43be9..1dd6870c 100644 --- a/src/backend/core/tests/documents/test_api_document_invitations.py +++ b/src/backend/core/tests/documents/test_api_document_invitations.py @@ -118,7 +118,10 @@ def test_api_document_invitations__create__privileged_members( email = mail.outbox[0] assert email.to == ["guest@example.com"] email_content = " ".join(email.body.split()) - assert "Invitation to join Docs!" in email_content + assert ( + f"{user.email} shared a document with you: {document.title}" + in email_content + ) else: assert response.status_code == status.HTTP_403_FORBIDDEN assert models.Invitation.objects.exists() is False @@ -158,7 +161,10 @@ def test_api_document_invitations__create__email_from_content_language(): assert email.to == ["guest@example.com"] email_content = " ".join(email.body.split()) - assert "Invitation à rejoindre Docs !" in email_content + assert ( + f"{user.email} a partagé un document avec vous: {document.title}" + in email_content + ) def test_api_document_invitations__create__email_from_content_language_not_supported(): @@ -196,7 +202,7 @@ def test_api_document_invitations__create__email_from_content_language_not_suppo assert email.to == ["guest@example.com"] email_content = " ".join(email.body.split()) - assert "Invitation to join Docs!" in email_content + assert f"{user.email} shared a document with you: {document.title}" in email_content def test_api_document_invitations__create__issuer_and_document_override(): diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index 3acb9f00..fcb63e52 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -2,7 +2,12 @@ Unit tests for the Document model """ +import smtplib +from logging import Logger +from unittest import mock + from django.contrib.auth.models import AnonymousUser +from django.core import mail from django.core.exceptions import ValidationError from django.core.files.storage import default_storage @@ -322,3 +327,94 @@ def test_models_documents_version_duplicate(): Bucket=default_storage.bucket_name, Prefix=file_key ) assert len(response["Versions"]) == 2 + + +def test_models_documents__email_invitation__success(): + """ + The email invitation is sent successfully. + """ + document = factories.DocumentFactory() + + # pylint: disable-next=no-member + assert len(mail.outbox) == 0 + + document.email_invitation( + "en", "guest@example.com", models.RoleChoices.EDITOR, "sender@example.com" + ) + + # pylint: disable-next=no-member + assert len(mail.outbox) == 1 + + # pylint: disable-next=no-member + email = mail.outbox[0] + + assert email.to == ["guest@example.com"] + email_content = " ".join(email.body.split()) + + assert ( + f"sender@example.com invited you as an editor on the following document : {document.title}" + in email_content + ) + assert f"docs/{document.id}/" in email_content + + +def test_models_documents__email_invitation__success_fr(): + """ + The email invitation is sent successfully in french. + """ + document = factories.DocumentFactory() + + # pylint: disable-next=no-member + assert len(mail.outbox) == 0 + + document.email_invitation( + "fr-fr", "guest2@example.com", models.RoleChoices.OWNER, "sender2@example.com" + ) + + # pylint: disable-next=no-member + assert len(mail.outbox) == 1 + + # pylint: disable-next=no-member + email = mail.outbox[0] + + assert email.to == ["guest2@example.com"] + email_content = " ".join(email.body.split()) + + assert ( + f"sender2@example.com vous a invité en tant que propriétaire " + f"sur le document suivant : {document.title}" in email_content + ) + assert f"docs/{document.id}/" in email_content + + +@mock.patch( + "core.models.send_mail", + side_effect=smtplib.SMTPException("Error SMTPException"), +) +@mock.patch.object(Logger, "error") +def test_models_documents__email_invitation__failed(mock_logger, _mock_send_mail): + """Check mail behavior when an SMTP error occurs when sent an email invitation.""" + document = factories.DocumentFactory() + + # pylint: disable-next=no-member + assert len(mail.outbox) == 0 + + document.email_invitation( + "en", "guest3@example.com", models.RoleChoices.ADMIN, "sender3@example.com" + ) + + # No email has been sent + # pylint: disable-next=no-member + assert len(mail.outbox) == 0 + + # Logger should be called + mock_logger.assert_called_once() + + ( + _, + email, + exception, + ) = mock_logger.call_args.args + + assert email == "guest3@example.com" + assert isinstance(exception, smtplib.SMTPException) diff --git a/src/backend/core/tests/test_utils.py b/src/backend/core/tests/test_utils.py deleted file mode 100644 index 288d3197..00000000 --- a/src/backend/core/tests/test_utils.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -Unit tests for the Invitation model -""" - -import smtplib -from logging import Logger -from unittest import mock - -from django.core import mail - -import pytest - -from core.utils import email_invitation - -pytestmark = pytest.mark.django_db - - -def test_utils__email_invitation_success(): - """ - The email invitation is sent successfully. - """ - # pylint: disable-next=no-member - assert len(mail.outbox) == 0 - - email_invitation("en", "guest@example.com", "123-456-789") - - # pylint: disable-next=no-member - assert len(mail.outbox) == 1 - - # pylint: disable-next=no-member - email = mail.outbox[0] - - assert email.to == ["guest@example.com"] - email_content = " ".join(email.body.split()) - assert "Invitation to join Docs!" in email_content - assert "docs/123-456-789/" in email_content - - -def test_utils__email_invitation_success_fr(): - """ - The email invitation is sent successfully in french. - """ - # pylint: disable-next=no-member - assert len(mail.outbox) == 0 - - email_invitation("fr-fr", "guest@example.com", "123-456-789") - - # pylint: disable-next=no-member - assert len(mail.outbox) == 1 - - # pylint: disable-next=no-member - email = mail.outbox[0] - - assert email.to == ["guest@example.com"] - email_content = " ".join(email.body.split()) - assert "Invitation à rejoindre Docs !" in email_content - assert "docs/123-456-789/" in email_content - - -@mock.patch( - "core.utils.send_mail", - side_effect=smtplib.SMTPException("Error SMTPException"), -) -@mock.patch.object(Logger, "error") -def test_utils__email_invitation_failed(mock_logger, _mock_send_mail): - """Check mail behavior when an SMTP error occurs when sent an email invitation.""" - - # pylint: disable-next=no-member - assert len(mail.outbox) == 0 - - email_invitation("en", "guest@example.com", "123-456-789") - - # No email has been sent - # pylint: disable-next=no-member - assert len(mail.outbox) == 0 - - # Logger should be called - mock_logger.assert_called_once() - - ( - _, - email, - exception, - ) = mock_logger.call_args.args - - assert email == "guest@example.com" - assert isinstance(exception, smtplib.SMTPException) diff --git a/src/backend/core/utils.py b/src/backend/core/utils.py deleted file mode 100644 index b3767eaf..00000000 --- a/src/backend/core/utils.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Utilities for the core app. -""" - -import smtplib -from logging import getLogger - -from django.conf import settings -from django.contrib.sites.models import Site -from django.core.mail import send_mail -from django.template.loader import render_to_string -from django.utils.translation import gettext_lazy as _ -from django.utils.translation import override - -logger = getLogger(__name__) - - -def email_invitation(language, email, document_id): - """Send email invitation.""" - try: - with override(language): - title = _("Invitation to join Docs!") - template_vars = { - "title": title, - "site": Site.objects.get_current(), - "document_id": document_id, - } - msg_html = render_to_string("mail/html/invitation.html", template_vars) - msg_plain = render_to_string("mail/text/invitation.txt", template_vars) - send_mail( - title, - msg_plain, - settings.EMAIL_FROM, - [email], - html_message=msg_html, - fail_silently=False, - ) - - except smtplib.SMTPException as exception: - logger.error("invitation to %s was not sent: %s", email, exception) diff --git a/src/backend/locale/en_US/LC_MESSAGES/django.mo b/src/backend/locale/en_US/LC_MESSAGES/django.mo index fa83e94551280c6ecb03956fff508300af1dbefa..65545c6984babc79022a6ebeff338f11727ddc09 100644 GIT binary patch delta 21 ccmaFD{DgTzH%(name)s" +#: core/models.py:587 +msgid "A link trace already exists for this document/user." +msgstr "" + +#: core/models.py:608 +msgid "Document/user relation" +msgstr "" + +#: core/models.py:609 +msgid "Document/user relations" +msgstr "" + +#: core/models.py:615 +msgid "This user is already in this document." +msgstr "" + +#: core/models.py:621 +msgid "This team is already in this document." +msgstr "" + +#: core/models.py:627 core/models.py:816 +msgid "Either user or team must be set, not both." +msgstr "" + +#: core/models.py:645 +msgid "description" +msgstr "" + +#: core/models.py:646 +msgid "code" +msgstr "" + +#: core/models.py:647 +msgid "css" +msgstr "" + +#: core/models.py:649 +msgid "public" +msgstr "" + +#: core/models.py:651 +msgid "Whether this template is public for anyone to use." +msgstr "" + +#: core/models.py:657 +msgid "Template" +msgstr "" + +#: core/models.py:658 +msgid "Templates" +msgstr "" + +#: core/models.py:797 +msgid "Template/user relation" +msgstr "" + +#: core/models.py:798 +msgid "Template/user relations" +msgstr "" + +#: core/models.py:804 +msgid "This user is already in this template." +msgstr "" + +#: core/models.py:810 +msgid "This team is already in this template." +msgstr "" + +#: core/models.py:833 +msgid "email address" +msgstr "" + +#: core/models.py:850 +msgid "Document invitation" +msgstr "" + +#: core/models.py:851 +msgid "Document invitations" +msgstr "" + +#: core/models.py:868 +msgid "This email is already associated to a registered user." msgstr "" #: core/templates/mail/html/invitation.html:160 +#: core/templates/mail/html/invitation2.html:160 #: core/templates/mail/text/invitation.txt:3 +#: core/templates/mail/text/invitation2.txt:3 msgid "La Suite Numérique" msgstr "" #: core/templates/mail/html/invitation.html:190 -#: core/templates/mail/text/invitation.txt:5 -msgid "Invitation to join a document !" +#: core/templates/mail/text/invitation.txt:6 +#, python-format +msgid " %(username)s shared a document with you ! " msgstr "" -#: core/templates/mail/html/invitation.html:198 -msgid "Welcome to Docs!" +#: core/templates/mail/html/invitation.html:197 +#: core/templates/mail/text/invitation.txt:8 +#, python-format +msgid " %(username)s invited you as an %(role)s on the following document : " msgstr "" -#: core/templates/mail/html/invitation.html:213 -#: core/templates/mail/text/invitation.txt:12 -msgid "We are delighted to welcome you to our community on Docs, your new companion to collaborate on documents efficiently, intuitively, and securely." -msgstr "" - -#: core/templates/mail/html/invitation.html:218 -#: core/templates/mail/text/invitation.txt:13 -msgid "Our application is designed to help you organize, collaborate, and manage permissions." +#: core/templates/mail/html/invitation.html:206 +#: core/templates/mail/html/invitation2.html:211 +#: core/templates/mail/text/invitation.txt:10 +#: core/templates/mail/text/invitation2.txt:11 +msgid "Open" msgstr "" #: core/templates/mail/html/invitation.html:223 #: core/templates/mail/text/invitation.txt:14 -msgid "With Docs, you will be able to:" +msgid " Docs, your new essential tool for organizing, sharing and collaborate on your documents as a team. " msgstr "" -#: core/templates/mail/html/invitation.html:224 -#: core/templates/mail/text/invitation.txt:15 -msgid "Create documents." -msgstr "" - -#: core/templates/mail/html/invitation.html:225 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/html/invitation2.html:235 #: core/templates/mail/text/invitation.txt:16 -msgid "Work offline." +#: core/templates/mail/text/invitation2.txt:17 +msgid "Brought to you by La Suite Numérique" msgstr "" -#: core/templates/mail/html/invitation.html:226 -#: core/templates/mail/text/invitation.txt:17 -msgid "Invite members of your community to your document in just a few clicks." -msgstr "" - -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:19 -msgid "Visit Docs" -msgstr "" - -#: core/templates/mail/html/invitation.html:246 -#: core/templates/mail/text/invitation.txt:21 -msgid "We are confident that Docs will help you increase efficiency and productivity while strengthening the bond among members." -msgstr "" - -#: core/templates/mail/html/invitation.html:251 -#: core/templates/mail/text/invitation.txt:22 -msgid "Feel free to explore all the features of the application and share your feedback and suggestions with us. Your feedback is valuable to us and will enable us to continually improve our service." -msgstr "" - -#: core/templates/mail/html/invitation.html:256 -#: core/templates/mail/text/invitation.txt:23 -msgid "Once again, welcome aboard! We are eager to accompany you on your collaboration adventure." -msgstr "" - -#: core/templates/mail/html/invitation.html:263 -#: core/templates/mail/text/invitation.txt:25 -msgid "Sincerely," -msgstr "" - -#: core/templates/mail/html/invitation.html:264 -#: core/templates/mail/text/invitation.txt:27 -msgid "The La Suite Numérique Team" -msgstr "" - -#: core/templates/mail/text/hello.txt:8 +#: core/templates/mail/html/invitation2.html:190 #, python-format -msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgid "%(username)s shared a document with you" msgstr "" -#: core/templates/mail/text/invitation.txt:8 -msgid "Welcome to Docs!" +#: core/templates/mail/html/invitation2.html:197 +#: core/templates/mail/text/invitation2.txt:8 +#, python-format +msgid "%(username)s invited you as an %(role)s on the following document :" +msgstr "" + +#: core/templates/mail/html/invitation2.html:228 +#: core/templates/mail/text/invitation2.txt:15 +msgid "Docs, your new essential tool for organizing, sharing and collaborate on your document as a team." +msgstr "" + +#: impress/settings.py:176 +msgid "English" +msgstr "" + +#: impress/settings.py:177 +msgid "French" msgstr "" diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.mo b/src/backend/locale/fr_FR/LC_MESSAGES/django.mo index 59acfc10ddb422269e2c3b20f16c68af1639be01..b6e0032a4bab31273cb9ab23022568973e80cc60 100644 GIT binary patch literal 2205 zcmcJQOK)366vqc>d6-uzmDm*Nu!v}ACd6q2$&FH}%|l9+5X&{C3nVnYcWe*6p1GNs zYZKON5J)T#Th@*E3hc6F0b3S)f{Gn`{^!Py^PoUg80Grs@jY{1GxN`H7tehsFfQS_ zjORx@Z{qp*DSTl346cK}fLFmco)#hlSHV^A0r)of5L^H+JtM@+;O!Cbfm4`wKm~pc zJ`4U1z6$;Uo&(S0<2+acUj#3J?B_Db_V0{X2Wyxwf)9|>D!7IDLoBX?OE9+JeegE; zD=5LK=Y&`W?|`p>-+(WH--87H0QSJ2z~{jQe7pwU06BgG)i-H}%U*+{Wh%G=d zQ&-BMy;XfZ9mv>$i8`Y_SCR^(EM9w;^DAd5_B3@|p1Yy3UCLZq_O*?a&?zsWr#zgf ziOJB!Ugh*H*si%W%<#;U)kD%Dz>85iMdxw^@Z@|~S@Suf%n&={aLQ(sBDiWhucGFB zDi`B4kS+cwYSo`5@gG!m(#NA~`nProdO1#ZI*6ND-&hkOig8}tEYVzaAw_AKxaD2h z?L{=CYFc}bwiMkdu{HET*+1C#X1CPh|LNngHj4GkaB`dd!uhDM)fv(YVyDnn>=FuX*rA(MpW=jN}=xg|NjK=rv~zFyl>AEu4&mHoUfJ@95WrI{uT5W^H?Odwr5leRi(4>TJZ0$ktwgKv91d z-z{=w>@uY|kwM3m4_g~@abm|oJKD>2o4O1qHlf9~iM2*vdX>u!=ldZcTU67qGQUiR zUstYJxD>fI1a<)}qx`f|oXZmuQt-nI9au3bO2d|WaYckJg4lcSQhO7Cl% zNz*SpuHJ0n;whWT>0<5Fr5?DF?^mS|2m7QU2Ye!M5OJ5dNvu$FqL4i0E>nA{}$E&-biw0UbuG|3*Ll zqQ4_WM!z4cwY*Pbfjiz?aquN{g!AJ|i+?g>IbkU&2i`zNkgG@1Q5mmKh{`6kB+#L> VSe@rsGg6iU!LJ?!D*w*Zq6H zV0fOx`!e1i@V}j9?(mf7H=X?gd1zTTxNatp7j=1|2_&V?_;0wT?fiN%nPX58nod*=f=VAPX8S$aJ=^<{( zemavLx*IM<4qys<7B4+d;w3vlCj(XWv+Se@l4mw82GRuIWNj%m?>Z@Yuv}ivwRMsU zt$FB6-o@&|NzZLJjzykpm5QLO;lgCx_XSpuY~ip}W*w1UF6WD0PkLJB`IZWOUic>e zXxB33`B3OWbacGA@Nwgo!p+jeSxmvC)S9470gFal4RU9PlG8z6x}i#CldTML>w++W zXK>B46*E+!G!fe`S!MW1oBEmieGofL@antd13BnO7hR5yrFJkVj0z*NCeBRQ<2d?K z;R6@&ev7A|<}w&PV^T2K6Uxl-Evc~|!;Td$o8jm26O2jGla9_4DL&`IjOb(zR;w$u z#tv5zoedExgaJpx@#z?V#7uhCGcu#o`cmiRL9Qo^x+dp9-{dF^C}aa+a5>MV8z}E7 zLQS?_59qhIMrb(Kwd|aNGfwK!9NR!XtO|avP)MM)Vlduz>PjK`h7<#~sk{o2XI8n0 zxOG(q!;v_m{Df3Mba#xz(a1&*Ho9GvDrwSDv=A}QiZm#Mam2U!3JKzalctA^G|Kd1 zCUz`*5d({16|m;y=1gkU>xYt(NdSmmFhrSC2NZl$YRr|a8;W6!2BkL^PjN?~nS|Z% z7#zS0cnY9I4T+>O`DKb==@A)JMjvM#g$pqDcud8k2dmNaiui?{r)t?Ts${G~`4h{e z#m-xI8P(X;${-)soxLQ}kgR0MCgKLWTU-lIAxd&-b1fTZC6z~V+V@nJoG5xe*|06% zSU;1Tl|w|$n&c$vro|TyEi5L7mXi5JKEKdfTxzTeACe6xjMpMqhfS-(^a^B8LNRag zHiDA&cV=6Vk&ErKjngZqPu1qkHxD(IQNzfDWMh=$q9Ct^gSke19N{Sh#LIB(!;N;b zRIj5;yV516OlmWPyv3I~Dm2!0;e<}w)(w1%n>-Hvv4tbN{CVt6!;ka%14kMcl4WPN zur;YDx`&s0RwOGYTm0?A@4S0>accX-WpZw6x{a)Cand_!vV?R=df&`#xNA*3bg99X z-FRDGqhhVosL9r5`{QjC4!-2V^YM*|0FyQp5HqgvcCA4*Sc9Te0qb!J*R#_yAOr0+ z7K+&w3i^@@2RW2{Xnjm~kWcf-+`xUU%}u^}_kwr`1R(GnCZj5gtF$RjlV-?3d5ptn z1r$IlbPKAesL@huNnHi2QLnW^Q+|08?^36CYcvdZl2kgw7E1hy5|`q)>vK^T;bc`s zDro@u7k#G7%OV#A2!qECOwepr^*yv04(-x-K@fBsB1pN0C51uTvkIcnfh0kBA#pGQ zYMk*IzD68-bcE6&*a&~CYpI2mat=Lq=tgLM<+Y*`@F_)sULgL_s9ljnHvyaDo47S6 zu^Q5a0z&G@3LAADt*;h#d_a79P-Fa}c>k}muRzc}FZJC}tbCOB@humlHpfIX4~wb_E~p30Syktq2hrF$23&{#R($Q zwQhWqIy{ww2IWX(L-8bktI!jhwM~5q2}bJ1d?*7`NOT`n#ih*9yOV@WpR0^P#t)?^ zD3Nl}GtmDSk4aAe*_2kh3cBnIA}#5x8w1tE9JvW^VqJ5O(kdKz-()9t(u@wA?h|~b uZWOy$MUH3K`$L&l%_0(x#6W;jk;irc-&+j&Jrr;p_Vz9Qt3hj|#_=CM^wFRI diff --git a/src/backend/locale/fr_FR/LC_MESSAGES/django.po b/src/backend/locale/fr_FR/LC_MESSAGES/django.po index f57fc1a3..8c4ad0b4 100644 --- a/src/backend/locale/fr_FR/LC_MESSAGES/django.po +++ b/src/backend/locale/fr_FR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: lasuite-people\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-14 12:43+0000\n" -"PO-Revision-Date: 2024-08-14 12:48\n" +"POT-Creation-Date: 2024-09-25 10:15+0000\n" +"PO-Revision-Date: 2024-09-25 10:21\n" "Last-Translator: \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -17,547 +17,330 @@ msgstr "" "X-Crowdin-File: backend-impress.pot\n" "X-Crowdin-File-ID: 8\n" -#: build/lib/build/lib/build/lib/build/lib/core/admin.py:31 -#: build/lib/build/lib/build/lib/core/admin.py:31 -#: build/lib/build/lib/core/admin.py:31 build/lib/core/admin.py:31 -#: core/admin.py:31 +#: core/admin.py:32 msgid "Personal info" msgstr "Infos Personnelles" -#: build/lib/build/lib/build/lib/build/lib/core/admin.py:33 -#: build/lib/build/lib/build/lib/core/admin.py:33 -#: build/lib/build/lib/core/admin.py:33 build/lib/core/admin.py:33 -#: core/admin.py:33 +#: core/admin.py:34 msgid "Permissions" msgstr "Permissions" -#: build/lib/build/lib/build/lib/build/lib/core/admin.py:45 -#: build/lib/build/lib/build/lib/core/admin.py:45 -#: build/lib/build/lib/core/admin.py:45 build/lib/core/admin.py:45 -#: core/admin.py:45 +#: core/admin.py:46 msgid "Important dates" msgstr "Dates importantes" -#: build/lib/build/lib/build/lib/build/lib/core/api/serializers.py:176 -#: build/lib/build/lib/build/lib/core/api/serializers.py:176 -#: build/lib/build/lib/core/api/serializers.py:176 -#: build/lib/core/api/serializers.py:176 core/api/serializers.py:176 +#: core/api/serializers.py:253 msgid "Body" msgstr "" -#: build/lib/build/lib/build/lib/build/lib/core/api/serializers.py:179 -#: build/lib/build/lib/build/lib/core/api/serializers.py:179 -#: build/lib/build/lib/core/api/serializers.py:179 -#: build/lib/core/api/serializers.py:179 core/api/serializers.py:179 +#: core/api/serializers.py:256 msgid "Body type" msgstr "" -#: build/lib/build/lib/build/lib/build/lib/core/authentication/backends.py:71 -#: build/lib/build/lib/build/lib/core/authentication/backends.py:71 -#: build/lib/build/lib/core/authentication/backends.py:71 -#: build/lib/core/authentication/backends.py:71 -#: core/authentication/backends.py:71 -msgid "User info contained no recognizable user identification" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/authentication/backends.py:91 -#: build/lib/build/lib/build/lib/core/authentication/backends.py:91 -#: build/lib/build/lib/core/authentication/backends.py:91 -#: build/lib/core/authentication/backends.py:91 -#: core/authentication/backends.py:91 -msgid "Claims contained no recognizable user identification" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:60 -#: build/lib/build/lib/build/lib/core/models.py:60 -#: build/lib/build/lib/core/models.py:60 build/lib/core/models.py:60 -#: core/models.py:61 -msgid "Reader" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:61 -#: build/lib/build/lib/build/lib/core/models.py:61 -#: build/lib/build/lib/core/models.py:61 build/lib/core/models.py:61 -#: core/models.py:62 -msgid "Editor" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:62 -#: build/lib/build/lib/build/lib/core/models.py:62 -#: build/lib/build/lib/core/models.py:62 build/lib/core/models.py:62 -#: core/models.py:63 -msgid "Administrator" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:63 -#: build/lib/build/lib/build/lib/core/models.py:63 -#: build/lib/build/lib/core/models.py:63 build/lib/core/models.py:63 -#: core/models.py:64 -msgid "Owner" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:75 -#: build/lib/build/lib/build/lib/core/models.py:75 -#: build/lib/build/lib/core/models.py:75 build/lib/core/models.py:75 -#: core/models.py:76 -msgid "id" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:76 -#: build/lib/build/lib/build/lib/core/models.py:76 -#: build/lib/build/lib/core/models.py:76 build/lib/core/models.py:76 -#: core/models.py:77 -msgid "primary key for the record as UUID" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:82 -#: build/lib/build/lib/build/lib/core/models.py:82 -#: build/lib/build/lib/core/models.py:82 build/lib/core/models.py:82 -#: core/models.py:83 -msgid "created on" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:83 -#: build/lib/build/lib/build/lib/core/models.py:83 -#: build/lib/build/lib/core/models.py:83 build/lib/core/models.py:83 -#: core/models.py:84 -msgid "date and time at which a record was created" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:88 -#: build/lib/build/lib/build/lib/core/models.py:88 -#: build/lib/build/lib/core/models.py:88 build/lib/core/models.py:88 -#: core/models.py:89 -msgid "updated on" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:89 -#: build/lib/build/lib/build/lib/core/models.py:89 -#: build/lib/build/lib/core/models.py:89 build/lib/core/models.py:89 -#: core/models.py:90 -msgid "date and time at which a record was last updated" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:109 -#: build/lib/build/lib/build/lib/core/models.py:109 -#: build/lib/build/lib/core/models.py:109 build/lib/core/models.py:109 -#: core/models.py:110 -msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_ characters." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:115 -#: build/lib/build/lib/build/lib/core/models.py:115 -#: build/lib/build/lib/core/models.py:115 build/lib/core/models.py:115 -#: core/models.py:116 -msgid "sub" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:117 -#: build/lib/build/lib/build/lib/core/models.py:117 -#: build/lib/build/lib/core/models.py:117 build/lib/core/models.py:117 -#: core/models.py:118 -msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_ characters only." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:125 -#: build/lib/build/lib/build/lib/core/models.py:125 -#: build/lib/build/lib/core/models.py:125 build/lib/core/models.py:125 -#: core/models.py:126 -msgid "identity email address" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:130 -#: build/lib/build/lib/build/lib/core/models.py:130 -#: build/lib/build/lib/core/models.py:130 build/lib/core/models.py:130 -#: core/models.py:131 -msgid "admin email address" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:137 -#: build/lib/build/lib/build/lib/core/models.py:137 -#: build/lib/build/lib/core/models.py:137 build/lib/core/models.py:137 -#: core/models.py:138 -msgid "language" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:138 -#: build/lib/build/lib/build/lib/core/models.py:138 -#: build/lib/build/lib/core/models.py:138 build/lib/core/models.py:138 -#: core/models.py:139 -msgid "The language in which the user wants to see the interface." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:144 -#: build/lib/build/lib/build/lib/core/models.py:144 -#: build/lib/build/lib/core/models.py:144 build/lib/core/models.py:144 -#: core/models.py:145 -msgid "The timezone in which the user wants to see times." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:147 -#: build/lib/build/lib/build/lib/core/models.py:147 -#: build/lib/build/lib/core/models.py:147 build/lib/core/models.py:147 -#: core/models.py:148 -msgid "device" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:149 -#: build/lib/build/lib/build/lib/core/models.py:149 -#: build/lib/build/lib/core/models.py:149 build/lib/core/models.py:149 -#: core/models.py:150 -msgid "Whether the user is a device or a real user." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:152 -#: build/lib/build/lib/build/lib/core/models.py:152 -#: build/lib/build/lib/core/models.py:152 build/lib/core/models.py:152 -#: core/models.py:153 -msgid "staff status" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:154 -#: build/lib/build/lib/build/lib/core/models.py:154 -#: build/lib/build/lib/core/models.py:154 build/lib/core/models.py:154 -#: core/models.py:155 -msgid "Whether the user can log into this admin site." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:157 -#: build/lib/build/lib/build/lib/core/models.py:157 -#: build/lib/build/lib/core/models.py:157 build/lib/core/models.py:157 -#: core/models.py:158 -msgid "active" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:160 -#: build/lib/build/lib/build/lib/core/models.py:160 -#: build/lib/build/lib/core/models.py:160 build/lib/core/models.py:160 -#: core/models.py:161 -msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:172 -#: build/lib/build/lib/build/lib/core/models.py:172 -#: build/lib/build/lib/core/models.py:172 build/lib/core/models.py:172 -#: core/models.py:173 -msgid "user" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:173 -#: build/lib/build/lib/build/lib/core/models.py:173 -#: build/lib/build/lib/core/models.py:173 build/lib/core/models.py:173 -#: core/models.py:174 -msgid "users" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:304 -#: build/lib/build/lib/build/lib/build/lib/core/models.py:531 -#: build/lib/build/lib/build/lib/core/models.py:304 -#: build/lib/build/lib/build/lib/core/models.py:531 -#: build/lib/build/lib/core/models.py:304 -#: build/lib/build/lib/core/models.py:531 build/lib/core/models.py:304 -#: build/lib/core/models.py:531 core/models.py:305 core/models.py:532 -msgid "title" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:306 -#: build/lib/build/lib/build/lib/build/lib/core/models.py:536 -#: build/lib/build/lib/build/lib/core/models.py:306 -#: build/lib/build/lib/build/lib/core/models.py:536 -#: build/lib/build/lib/core/models.py:306 -#: build/lib/build/lib/core/models.py:536 build/lib/core/models.py:306 -#: build/lib/core/models.py:536 core/models.py:307 core/models.py:537 -msgid "public" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:308 -#: build/lib/build/lib/build/lib/core/models.py:308 -#: build/lib/build/lib/core/models.py:308 build/lib/core/models.py:308 -#: core/models.py:309 -msgid "Whether this document is public for anyone to use." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:316 -#: build/lib/build/lib/build/lib/core/models.py:316 -#: build/lib/build/lib/core/models.py:316 build/lib/core/models.py:316 -#: core/models.py:317 -msgid "Document" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:317 -#: build/lib/build/lib/build/lib/core/models.py:317 -#: build/lib/build/lib/core/models.py:317 build/lib/core/models.py:317 -#: core/models.py:318 -msgid "Documents" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:495 -#: build/lib/build/lib/build/lib/core/models.py:495 -#: build/lib/build/lib/core/models.py:495 build/lib/core/models.py:495 -#: core/models.py:496 -msgid "Document/user relation" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:496 -#: build/lib/build/lib/build/lib/core/models.py:496 -#: build/lib/build/lib/core/models.py:496 build/lib/core/models.py:496 -#: core/models.py:497 -msgid "Document/user relations" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:502 -#: build/lib/build/lib/build/lib/core/models.py:502 -#: build/lib/build/lib/core/models.py:502 build/lib/core/models.py:502 -#: core/models.py:503 -msgid "This user is already in this document." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:508 -#: build/lib/build/lib/build/lib/core/models.py:508 -#: build/lib/build/lib/core/models.py:508 build/lib/core/models.py:508 -#: core/models.py:509 -msgid "This team is already in this document." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:514 -#: build/lib/build/lib/build/lib/build/lib/core/models.py:691 -#: build/lib/build/lib/build/lib/core/models.py:514 -#: build/lib/build/lib/build/lib/core/models.py:691 -#: build/lib/build/lib/core/models.py:514 -#: build/lib/build/lib/core/models.py:691 build/lib/core/models.py:514 -#: build/lib/core/models.py:691 core/models.py:515 core/models.py:704 -msgid "Either user or team must be set, not both." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:532 -#: build/lib/build/lib/build/lib/core/models.py:532 -#: build/lib/build/lib/core/models.py:532 build/lib/core/models.py:532 -#: core/models.py:533 -msgid "description" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:533 -#: build/lib/build/lib/build/lib/core/models.py:533 -#: build/lib/build/lib/core/models.py:533 build/lib/core/models.py:533 -#: core/models.py:534 -msgid "code" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:534 -#: build/lib/build/lib/build/lib/core/models.py:534 -#: build/lib/build/lib/core/models.py:534 build/lib/core/models.py:534 -#: core/models.py:535 -msgid "css" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:538 -#: build/lib/build/lib/build/lib/core/models.py:538 -#: build/lib/build/lib/core/models.py:538 build/lib/core/models.py:538 -#: core/models.py:539 -msgid "Whether this template is public for anyone to use." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:544 -#: build/lib/build/lib/build/lib/core/models.py:544 -#: build/lib/build/lib/core/models.py:544 build/lib/core/models.py:544 -#: core/models.py:545 -msgid "Template" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:545 -#: build/lib/build/lib/build/lib/core/models.py:545 -#: build/lib/build/lib/core/models.py:545 build/lib/core/models.py:545 -#: core/models.py:546 -msgid "Templates" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:672 -#: build/lib/build/lib/build/lib/core/models.py:672 -#: build/lib/build/lib/core/models.py:672 build/lib/core/models.py:672 -#: core/models.py:685 -msgid "Template/user relation" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:673 -#: build/lib/build/lib/build/lib/core/models.py:673 -#: build/lib/build/lib/core/models.py:673 build/lib/core/models.py:673 -#: core/models.py:686 -msgid "Template/user relations" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:679 -#: build/lib/build/lib/build/lib/core/models.py:679 -#: build/lib/build/lib/core/models.py:679 build/lib/core/models.py:679 -#: core/models.py:692 -msgid "This user is already in this template." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:685 -#: build/lib/build/lib/build/lib/core/models.py:685 -#: build/lib/build/lib/core/models.py:685 build/lib/core/models.py:685 -#: core/models.py:698 -msgid "This team is already in this template." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:708 -#: build/lib/build/lib/build/lib/core/models.py:708 -#: build/lib/build/lib/core/models.py:708 build/lib/core/models.py:708 -#: core/models.py:721 -msgid "email address" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:725 -#: build/lib/build/lib/build/lib/core/models.py:725 -#: build/lib/build/lib/core/models.py:725 build/lib/core/models.py:725 -#: core/models.py:738 -msgid "Document invitation" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:726 -#: build/lib/build/lib/build/lib/core/models.py:726 -#: build/lib/build/lib/core/models.py:726 build/lib/core/models.py:726 -#: core/models.py:739 -msgid "Document invitations" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:751 -#: build/lib/build/lib/build/lib/core/models.py:751 -#: build/lib/build/lib/core/models.py:751 build/lib/core/models.py:751 -#: core/models.py:764 -msgid "This email is already associated to a registered user." -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/core/models.py:795 -#: build/lib/build/lib/build/lib/core/models.py:795 -#: build/lib/build/lib/core/models.py:795 build/lib/core/models.py:795 -msgid "Invitation to join Impress!" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/impress/settings.py:158 -#: build/lib/build/lib/build/lib/impress/settings.py:158 -#: build/lib/build/lib/impress/settings.py:158 -#: build/lib/impress/settings.py:158 impress/settings.py:158 -msgid "English" -msgstr "" - -#: build/lib/build/lib/build/lib/build/lib/impress/settings.py:159 -#: build/lib/build/lib/build/lib/impress/settings.py:159 -#: build/lib/build/lib/impress/settings.py:159 -#: build/lib/impress/settings.py:159 impress/settings.py:159 -msgid "French" -msgstr "" - -#: build/lib/build/lib/core/api/serializers.py:185 -#: build/lib/core/api/serializers.py:185 core/api/serializers.py:185 +#: core/api/serializers.py:262 msgid "Format" msgstr "" -#: core/models.py:808 -msgid "Invitation to join Docs!" -msgstr "Invitation à rejoindre Docs !" - -#: core/templates/mail/html/hello.html:159 core/templates/mail/text/hello.txt:3 -msgid "Company logo" +#: core/authentication/backends.py:56 +msgid "Invalid response format or token verification failed" msgstr "" -#: core/templates/mail/html/hello.html:188 core/templates/mail/text/hello.txt:5 +#: core/authentication/backends.py:81 +msgid "User info contained no recognizable user identification" +msgstr "" + +#: core/authentication/backends.py:101 +msgid "Claims contained no recognizable user identification" +msgstr "" + +#: core/models.py:62 core/models.py:69 +msgid "Reader" +msgstr "Lecteur" + +#: core/models.py:63 core/models.py:70 +msgid "Editor" +msgstr "Éditeur" + +#: core/models.py:71 +msgid "Administrator" +msgstr "Administrateur" + +#: core/models.py:72 +msgid "Owner" +msgstr "Propriétaire" + +#: core/models.py:80 +msgid "Restricted" +msgstr "Restreint" + +#: core/models.py:84 +msgid "Authenticated" +msgstr "Authentifié" + +#: core/models.py:86 +msgid "Public" +msgstr "Public" + +#: core/models.py:98 +msgid "id" +msgstr "" + +#: core/models.py:99 +msgid "primary key for the record as UUID" +msgstr "" + +#: core/models.py:105 +msgid "created on" +msgstr "" + +#: core/models.py:106 +msgid "date and time at which a record was created" +msgstr "" + +#: core/models.py:111 +msgid "updated on" +msgstr "" + +#: core/models.py:112 +msgid "date and time at which a record was last updated" +msgstr "" + +#: core/models.py:132 +msgid "Enter a valid sub. This value may contain only letters, numbers, and @/./+/-/_ characters." +msgstr "" + +#: core/models.py:138 +msgid "sub" +msgstr "" + +#: core/models.py:140 +msgid "Required. 255 characters or fewer. Letters, numbers, and @/./+/-/_ characters only." +msgstr "" + +#: core/models.py:148 +msgid "identity email address" +msgstr "" + +#: core/models.py:153 +msgid "admin email address" +msgstr "" + +#: core/models.py:160 +msgid "language" +msgstr "" + +#: core/models.py:161 +msgid "The language in which the user wants to see the interface." +msgstr "" + +#: core/models.py:167 +msgid "The timezone in which the user wants to see times." +msgstr "" + +#: core/models.py:170 +msgid "device" +msgstr "" + +#: core/models.py:172 +msgid "Whether the user is a device or a real user." +msgstr "" + +#: core/models.py:175 +msgid "staff status" +msgstr "" + +#: core/models.py:177 +msgid "Whether the user can log into this admin site." +msgstr "" + +#: core/models.py:180 +msgid "active" +msgstr "" + +#: core/models.py:183 +msgid "Whether this user should be treated as active. Unselect this instead of deleting accounts." +msgstr "" + +#: core/models.py:195 +msgid "user" +msgstr "" + +#: core/models.py:196 +msgid "users" +msgstr "" + +#: core/models.py:328 core/models.py:644 +msgid "title" +msgstr "" + +#: core/models.py:343 +msgid "Document" +msgstr "" + +#: core/models.py:344 +msgid "Documents" +msgstr "" + +#: core/models.py:347 +msgid "Untitled Document" +msgstr "" + +#: core/models.py:537 #, python-format -msgid "Hello %(name)s" +msgid "%(username)s shared a document with you: %(document)s" +msgstr "%(username)s a partagé un document avec vous: %(document)s" + +#: core/models.py:580 +msgid "Document/user link trace" msgstr "" -#: core/templates/mail/html/hello.html:188 core/templates/mail/text/hello.txt:5 -msgid "Hello" +#: core/models.py:581 +msgid "Document/user link traces" msgstr "" -#: core/templates/mail/html/hello.html:189 core/templates/mail/text/hello.txt:6 -msgid "Thank you very much for your visit!" +#: core/models.py:587 +msgid "A link trace already exists for this document/user." msgstr "" -#: core/templates/mail/html/hello.html:221 -#, python-format -msgid "This mail has been sent to %(email)s by %(name)s" +#: core/models.py:608 +msgid "Document/user relation" +msgstr "" + +#: core/models.py:609 +msgid "Document/user relations" +msgstr "" + +#: core/models.py:615 +msgid "This user is already in this document." +msgstr "" + +#: core/models.py:621 +msgid "This team is already in this document." +msgstr "" + +#: core/models.py:627 core/models.py:816 +msgid "Either user or team must be set, not both." +msgstr "" + +#: core/models.py:645 +msgid "description" +msgstr "" + +#: core/models.py:646 +msgid "code" +msgstr "" + +#: core/models.py:647 +msgid "css" +msgstr "" + +#: core/models.py:649 +msgid "public" +msgstr "" + +#: core/models.py:651 +msgid "Whether this template is public for anyone to use." +msgstr "" + +#: core/models.py:657 +msgid "Template" +msgstr "" + +#: core/models.py:658 +msgid "Templates" +msgstr "" + +#: core/models.py:797 +msgid "Template/user relation" +msgstr "" + +#: core/models.py:798 +msgid "Template/user relations" +msgstr "" + +#: core/models.py:804 +msgid "This user is already in this template." +msgstr "" + +#: core/models.py:810 +msgid "This team is already in this template." +msgstr "" + +#: core/models.py:833 +msgid "email address" +msgstr "" + +#: core/models.py:850 +msgid "Document invitation" +msgstr "" + +#: core/models.py:851 +msgid "Document invitations" +msgstr "" + +#: core/models.py:868 +msgid "This email is already associated to a registered user." msgstr "" #: core/templates/mail/html/invitation.html:160 +#: core/templates/mail/html/invitation2.html:160 #: core/templates/mail/text/invitation.txt:3 +#: core/templates/mail/text/invitation2.txt:3 msgid "La Suite Numérique" msgstr "" #: core/templates/mail/html/invitation.html:190 -#: core/templates/mail/text/invitation.txt:5 -msgid "Invitation to join a document !" -msgstr "Invitation à rejoindre un document !" +#: core/templates/mail/text/invitation.txt:6 +#, python-format +msgid " %(username)s shared a document with you ! " +msgstr " %(username)s a partagé un document avec vous ! " -#: core/templates/mail/html/invitation.html:198 -msgid "Welcome to Docs!" -msgstr "Bienvenue sur Docs !" +#: core/templates/mail/html/invitation.html:197 +#: core/templates/mail/text/invitation.txt:8 +#, python-format +msgid " %(username)s invited you as an %(role)s on the following document : " +msgstr " %(username)s vous a invité en tant que %(role)s sur le document suivant : " -#: core/templates/mail/html/invitation.html:213 -#: core/templates/mail/text/invitation.txt:12 -msgid "We are delighted to welcome you to our community on Docs, your new companion to collaborate on documents efficiently, intuitively, and securely." -msgstr "Nous sommes heureux de vous accueillir dans notre communauté sur Docs, votre nouveau compagnon pour collaborer sur des documents efficacement, intuitivement, et en toute sécurité." - -#: core/templates/mail/html/invitation.html:218 -#: core/templates/mail/text/invitation.txt:13 -msgid "Our application is designed to help you organize, collaborate, and manage permissions." -msgstr "Notre application est conçue pour vous aider à organiser, collaborer et gérer vos permissions." +#: core/templates/mail/html/invitation.html:206 +#: core/templates/mail/html/invitation2.html:211 +#: core/templates/mail/text/invitation.txt:10 +#: core/templates/mail/text/invitation2.txt:11 +msgid "Open" +msgstr "Ouvrir" #: core/templates/mail/html/invitation.html:223 #: core/templates/mail/text/invitation.txt:14 -msgid "With Docs, you will be able to:" -msgstr "Avec Docs, vous serez capable de :" +msgid " Docs, your new essential tool for organizing, sharing and collaborate on your documents as a team. " +msgstr " Docs, votre nouvel outil incontournable pour organiser, partager et collaborer sur vos documents en équipe. " -#: core/templates/mail/html/invitation.html:224 -#: core/templates/mail/text/invitation.txt:15 -msgid "Create documents." -msgstr "Créez des documents." - -#: core/templates/mail/html/invitation.html:225 +#: core/templates/mail/html/invitation.html:230 +#: core/templates/mail/html/invitation2.html:235 #: core/templates/mail/text/invitation.txt:16 -msgid "Work offline." -msgstr "Travailler hors ligne." +#: core/templates/mail/text/invitation2.txt:17 +msgid "Brought to you by La Suite Numérique" +msgstr "Proposé par La Suite Numérique" -#: core/templates/mail/html/invitation.html:226 -#: core/templates/mail/text/invitation.txt:17 -msgid "Invite members of your community to your document in just a few clicks." -msgstr "Invitez des membres de votre communauté sur votre document en quelques clics." - -#: core/templates/mail/html/invitation.html:237 -#: core/templates/mail/text/invitation.txt:19 -msgid "Visit Docs" -msgstr "Visitez Docs" - -#: core/templates/mail/html/invitation.html:246 -#: core/templates/mail/text/invitation.txt:21 -msgid "We are confident that Docs will help you increase efficiency and productivity while strengthening the bond among members." -msgstr "Nous sommes persuadés que Docs vous aidera à améliorer votre efficacité et votre productivité tout en renforçant les liens entre vos membres." - -#: core/templates/mail/html/invitation.html:251 -#: core/templates/mail/text/invitation.txt:22 -msgid "Feel free to explore all the features of the application and share your feedback and suggestions with us. Your feedback is valuable to us and will enable us to continually improve our service." -msgstr "N'hésitez pas à explorer toutes les fonctionnalités de l'application et à nous faire part de vos commentaires et suggestions. Vos commentaires nous sont précieux et nous permettront d'améliorer continuellement notre service." - -#: core/templates/mail/html/invitation.html:256 -#: core/templates/mail/text/invitation.txt:23 -msgid "Once again, welcome aboard! We are eager to accompany you on your collaboration adventure." -msgstr "Encore une fois, bienvenue à bord ! Nous sommes impatients de vous accompagner dans votre aventure collaborative." - -#: core/templates/mail/html/invitation.html:263 -#: core/templates/mail/text/invitation.txt:25 -msgid "Sincerely," -msgstr "Sincèrement," - -#: core/templates/mail/html/invitation.html:264 -#: core/templates/mail/text/invitation.txt:27 -msgid "The La Suite Numérique Team" -msgstr "L'équipe La Suite Numérique" - -#: core/templates/mail/text/hello.txt:8 +#: core/templates/mail/html/invitation2.html:190 #, python-format -msgid "This mail has been sent to %(email)s by %(name)s [%(href)s]" +msgid "%(username)s shared a document with you" +msgstr "%(username)s a partagé un document avec vous" + +#: core/templates/mail/html/invitation2.html:197 +#: core/templates/mail/text/invitation2.txt:8 +#, python-format +msgid "%(username)s invited you as an %(role)s on the following document :" +msgstr "%(username)s vous a invité en tant que %(role)s sur le document suivant :" + +#: core/templates/mail/html/invitation2.html:228 +#: core/templates/mail/text/invitation2.txt:15 +msgid "Docs, your new essential tool for organizing, sharing and collaborate on your document as a team." +msgstr "Docs, votre nouvel outil essentiel pour organiser, partager et collaborer sur votre document en équipe." + +#: impress/settings.py:176 +msgid "English" msgstr "" -#: core/templates/mail/text/invitation.txt:8 -msgid "Welcome to Docs!" -msgstr "Bienvenue sur Docs !" +#: impress/settings.py:177 +msgid "French" +msgstr "" diff --git a/src/mail/mjml/invitation.mjml b/src/mail/mjml/invitation.mjml index 8d3779e2..4e5841b1 100644 --- a/src/mail/mjml/invitation.mjml +++ b/src/mail/mjml/invitation.mjml @@ -3,48 +3,64 @@ - + - + - -

{% trans "Invitation to join a document !" %}

+ +

+ {% blocktrans %} + {{username}} shared a document with you ! + {% endblocktrans %} +

- - - -

{% blocktrans %}Welcome to Docs!{% endblocktrans %}

-
- - {% trans "We are delighted to welcome you to our community on Docs, your new companion to collaborate on documents efficiently, intuitively, and securely." %} - {% trans "Our application is designed to help you organize, collaborate, and manage permissions." %} - {% trans "With Docs, you will be able to:" %} -
    -
  • {% trans "Create documents."%}
  • -
  • {% trans "Work offline."%}
  • -
  • {% trans "Invite members of your community to your document in just a few clicks."%}
  • -
+ {% blocktrans %} + {{username}} invited you as an {{role}} on the following document : + {% endblocktrans %} + {{document.title}}
- - {% trans "Visit Docs"%} + + {% trans "Open"%} - {% trans "We are confident that Docs will help you increase efficiency and productivity while strengthening the bond among members." %} - {% trans "Feel free to explore all the features of the application and share your feedback and suggestions with us. Your feedback is valuable to us and will enable us to continually improve our service." %} - {% trans "Once again, welcome aboard! We are eager to accompany you on your collaboration adventure." %} - + + + {% blocktrans %} + Docs, your new essential tool for organizing, sharing and collaborate on your documents as a team. + {% endblocktrans %} + -

{% trans "Sincerely," %}

-

{% trans "The La Suite Numérique Team" %}

+

{% trans "Brought to you by La Suite Numérique" %}

- diff --git a/src/mail/mjml/partial/header.mjml b/src/mail/mjml/partial/header.mjml index 37bc590f..daedebb8 100644 --- a/src/mail/mjml/partial/header.mjml +++ b/src/mail/mjml/partial/header.mjml @@ -25,14 +25,14 @@ } a { - color: inherit; + color: #000091; } /* Global styles */ h1 { color: #161616; - font-size: 2rem; + font-size: 1.5rem; line-height: 1em; font-weight: 700; }