Djoser изменить язык электронной почты

Есть ли способ изменить электронную почту, отправляемую в djoser, в зависимости от языка пользовательского экземпляра? Я нашел этот вопрос Как мне явно указать язык электронной почты, который я хочу отправить?, но, похоже, это не опция в последней версии djoser, поскольку больше нет просмотров для каждого действия (активация, сброс пароля и т. д.) или я так и не разобрались, как это работает. Кроме того, я попытался унаследовать класс UserViewSet и применить перевод, но я не знаю, как это сделать и как указать все URL-адреса 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)

Есть ли у кого-нибудь предложения или уже сделал это?


person Andreea A    schedule 01.11.2020    source источник


Ответы (1)


Что вы можете!

Вы правильно определили действие, на которое отправляется письмо.

    @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)

Таким образом, после создания подкласса UserViewSet вы можете указать имя шаблона в действии activation.

        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 использует templated-mail для создания содержимого почты. .

Но, как видите, user сущность передается в контексте. Поэтому я бы посоветовал немного изменить ваши настройки и сделать это в классе, который отвечает за создание этого электронного письма.

в вашем 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"

и установите CountryActivationMail в настройках djoser, как описано в документации.

person Tom Wojcik    schedule 02.12.2020