Djoser alterar o idioma do e-mail
Existe uma maneira de alterar o e-mail enviado no djoser com base no idioma da instância do usuário? Encontrei esta pergunta. Como posso especificar explicitamente o idioma do e-mail que desejo enviar? , mas não parece ser uma opção na última versão do djoser, já que não há mais visualizações para cada ação (ativação, redefinir senha etc.) ou ainda não descobri como funciona. Além disso, tentei herdar a classe UserViewSet e aplicar a tradução, mas não sei se essa é a maneira de fazer e como especificar todos os urls do 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)
Alguém tem alguma sugestão ou já fez isso?
Respostas
Certamente você pode!
Você identificou corretamente a ação para a qual o e-mail é enviado.
@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)
Portanto, após a subclasse, UserViewSetvocê pode fornecer um nome de modelo em activationação.
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 está usando templated-mailpara criar conteúdo de e-mail.
Mas, como você pode ver, a userentidade é passada no contexto. Portanto, prefiro ajustar um pouco as configurações e fazer isso na classe responsável por gerar este e-mail.
na tua 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"
e definido CountryActivationMailnas configurações djoser conforme explicado nos documentos.