Djoser e-posta dilini değiştir

Nov 01 2020

Djoser'da gönderilen e-postayı kullanıcı örneğinin diline göre değiştirmenin bir yolu var mı? Bu soruyu buldum Göndermek istediğim e-posta dilini açıkça nasıl belirtebilirim? , ancak djoser'ın son sürümünde bir seçenek gibi görünmüyor, çünkü artık her eylem için görünüm yok (etkinleştirme, şifre sıfırlama vb.) veya nasıl çalıştığını anlamadım. Ayrıca, UserViewSet sınıfını miras almayı ve çeviriyi uygulamayı denedim, ancak bunu yapmanın yolu mu ve djoser'ın tüm url'lerini nasıl belirteceğimi bilmiyorum.

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)

Herhangi bir önerisi olan veya bunu yapan var mı?

Yanıtlar

TomWojcik Dec 02 2020 at 18:30

Tabi ki yapabilirsin!

Postanın gönderildiği eylemi doğru bir şekilde tanımladınız.

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

Bu nedenle, alt sınıflandırma işleminden sonra eylemde UserViewSetbir şablon adı sağlayabilirsiniz 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-mailposta içeriği oluşturmak için kullanıyor .

Ancak gördüğünüz gibi, uservarlık bağlam içinde aktarılır. Bu nedenle, ayarlarınızı biraz değiştirmenizi ve bunu bu e-postayı oluşturmaktan sorumlu olan sınıfta yapmanızı öneririm.

senin içinde 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"

ve CountryActivationMaildjoser ayarlarında belgelerde açıklandığı gibi ayarlayın .