Djoser zmienia język e-maili
Czy istnieje sposób na zmianę wiadomości e-mail wysyłanej w djoserze w oparciu o język wystąpienia użytkownika? Znalazłem to pytanie. Jak wyraźnie określić język e-maili, które chcę wysłać? , ale nie wydaje się to być opcją w ostatniej wersji djosera, ponieważ nie ma już widoków dla każdej akcji (aktywacja, resetowanie hasła itp.) lub nie wiem, jak to działa. Próbowałem również wprowadzić klasę UserViewSet i zastosować tłumaczenie, ale nie wiem, czy to jest sposób na zrobienie tego i jak określić wszystkie adresy URL djosera.
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)
Czy ktoś ma jakieś sugestie lub zrobił to?
Odpowiedzi
Oczywiście że możesz!
Prawidłowo zidentyfikowałeś akcję, podczas której wysyłana jest poczta.
@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)
Więc po UserViewSetutworzeniu podklasy możesz podać nazwę szablonu w activationakcji.
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 używa templated-maildo tworzenia treści poczty.
Ale, jak widać, userjednostka jest przekazywana w kontekście. Radziłbym więc nieco poprawić ustawienia i zrobić to w klasie odpowiedzialnej za wygenerowanie tego e-maila.
w Twoim 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"
i ustawić CountryActivationMailw ustawieniach djosera, jak wyjaśniono w dokumentacji.