Djoser changer la langue des e-mails
Existe-t-il un moyen de modifier l'e-mail envoyé dans djoser en fonction de la langue de l'instance utilisateur? J'ai trouvé cette question Comment spécifier explicitement la langue de l'e-mail que je souhaite envoyer? , mais cela ne semble pas être une option dans la dernière version de djoser, car il n'y a plus de vues pour chaque action (activation, réinitialisation du mot de passe, etc.) ou je n'ai pas compris comment cela fonctionne. De plus, j'ai essayé d'hériter de la classe UserViewSet et d'appliquer la traduction, mais je ne sais pas si c'est la façon de le faire et comment spécifier toutes les URL de djoser.
class UserViewSet(djoser_view.UserViewSet):
def perform_create(self, serializer):
user = serializer.save()
signals.user_registered.send(
sender=self.__class__, user=user, request=self.request
)
context = {"user": user}
to = [get_user_email(user)]
language = user.language or 'en-us'
with translation.override(language):
if settings.SEND_ACTIVATION_EMAIL:
settings.EMAIL.activation(self.request, context).send(to)
elif settings.SEND_CONFIRMATION_EMAIL:
settings.EMAIL.confirmation(self.request, context).send(to)
def perform_update(self, serializer):
super().perform_update(serializer)
user = serializer.instance
language = user.language or 'en-us'
with translation.override(language):
if settings.SEND_ACTIVATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
settings.EMAIL.activation(self.request, context).send(to)
@action(["post"], detail=False)
def activation(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.user
user.is_active = True
user.save()
signals.user_activated.send(
sender=self.__class__, user=user, request=self.request
)
language = user.language or 'en-us'
with translation.override(language):
if settings.SEND_CONFIRMATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
settings.EMAIL.confirmation(self.request, context).send(to)
return Response(status=status.HTTP_204_NO_CONTENT)
Quelqu'un a-t-il des suggestions ou a-t-il fait cela?
Réponses
Sûr que vous pouvez!
Vous avez correctement identifié l'action à laquelle le courrier est envoyé.
@action(["post"], detail=False)
def activation(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.user
user.is_active = True
user.save()
signals.user_activated.send(
sender=self.__class__, user=user, request=self.request
)
if settings.SEND_CONFIRMATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
settings.EMAIL.confirmation(self.request, context).send(to)
Ainsi, après le sous-classement, UserViewSetvous pouvez fournir un nom de modèle en activationaction.
if settings.SEND_CONFIRMATION_EMAIL:
context = {"user": user}
to = [get_user_email(user)]
kwargs = {"request": self.request, "context": context}
if user.country == "Country1":
kwargs["template_name"] = "email/country1/activation.html"
settings.EMAIL.confirmation(**kwargs)).send(to)
Djoser utilise templated-mailpour créer du contenu de messagerie.
Mais, comme vous pouvez le voir, l' userentité est passée dans le contexte. Je vous conseille donc plutôt de modifier un peu vos paramètres et de le faire dans la classe responsable de la génération de cet e-mail.
dans votre app/email.py
class CountryActivationMail(ActivationEmail):
def __init__(self, **kwargs):
super().__init__(**kwargs)
if self.context.user.country == "Country1":
self.template_name = "email/country1/activation.html"
et définissez les CountryActivationMailparamètres djoser comme expliqué dans la documentation.