Отправить электронное письмо, если пользователю Django изменен их активный статус - PullRequest
1 голос
/ 15 декабря 2010

Я создал сайт, который требует членства для некоторых частей. Это клубный сайт, поэтому чтобы быть участником на сайте, вы должны быть участником в реальной жизни. План состоит в том, чтобы кто-нибудь из Клуба проверил наличие новых членов (вероятно, система отправит им электронное письмо, когда пользователь зарегистрируется), а затем администратор установит флажок active под записью пользователя в администраторе Django и сохраняет пользователя.

Проблема, которую я пытаюсь преодолеть, заключается в том, что нам нужно, чтобы новые действительные пользователи были уведомлены о том, когда они смогут начать использовать свою учетную запись. Очевидно, что отправка электронной почты вручную является обременительной.

Есть ли способ подключиться к логике save(), проверить, изменилось ли состояние записи active, и, если она была активирована, отправить этому пользователю электронное письмо, сообщающее ему, что теперь он может войти в систему?

Я в курсе всей логики электронной почты, мне просто нужно знать, где ее разместить.

Я понимаю, что есть другие способы тестирования (проверьте наличие last_login==None на active==True учетных записях в задании в стиле cron), но я бы хотел, чтобы уведомления были почти мгновенными.

Ответы [ 3 ]

1 голос
/ 30 декабря 2015

хорошо, 5 лет спустя, но это работает для меня с django 1.8 и python 2.7

Контекст таков: пользователь создает новую учетную запись, затем администратор получает электронное письмо, чтобы подтвердить, что пользователь активен в True, когдаадминистратор вносит изменения, пользователь получает электронное письмо с сообщением, что теперь он может войти в систему.

Извините за мой плохой английский.

#forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

#A register form that save field is_active as False
class RegisterForm(UserCreationForm):
    email = forms.EmailField(label=_("E-mail"))
    first_name = forms.CharField(label=_("First Name"))
    last_name = forms.CharField(label=_("Last Name"))
    is_active = forms.BooleanField(required=False, initial=False, label=_("Activo"), widget=forms.HiddenInput())

    class Meta:
        model = User
        fields = ('username','first_name','last_name','email','password1','password2','is_active')

        def save(self, commit=True):
            user = super(UserCreationForm, self).save(commit=False)
            user.first_name = self.cleaned_data['first_name']
            user.last_name = self.cleaned_data['last_name']
            user.email = self.cleaned_data['email']
            user.is_active = self.cleaned_data['is_active']
            if commit:
                user.save()
            return user

Я использую сигналы в файле models.py, но выможно использовать в файле signal.py

#models.py
from django.contrib.auth.models import User
from django.db.models import signals
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import pre_save, post_save
from django.conf import settings
from django.core.mail import send_mail

#signal used for is_active=False to is_active=True
@receiver(pre_save, sender=User, dispatch_uid='active')
def active(sender, instance, **kwargs):
    if instance.is_active and User.objects.filter(pk=instance.pk, is_active=False).exists():
        subject = 'Active account'
        mesagge = '%s your account is now active' %(instance.username)
        from_email = settings.EMAIL_HOST_USER
        send_mail(subject, mesagge, from_email, [instance.email], fail_silently=False)

#signal to send an email to the admin when a user creates a new account
@receiver(post_save, sender=User, dispatch_uid='register')
def register(sender, instance, **kwargs):
    if kwargs.get('created', False):
        subject = 'Verificatión of the %s account' %(instance.username)
        mesagge = 'here goes your message to the admin'
        from_email = settings.EMAIL_HOST_USER
        send_mail(subject, mesagge, from_email, [from_email], fail_silently=False)
1 голос
/ 15 декабря 2010

Да, вам нужно использовать сигналы Джанго , в частности post_save () .Это, как вы, наверное, догадались, get вызывается после сохранения вашей модели, и вы можете затем реализовать любую необходимую вам функцию сохранения после записи (то есть, запись после записи в базу данных).

0 голосов
/ 16 декабря 2010

Это не было проверено, но вот измененная версия чего-то похожего:

from django.contrib.auth.models import User
from django.db.models import signals
from django.conf import settings
from django.core.mail import send_mail

def pre_user_save(sender, instance, *args, **kwargs):
    if instance.active != User.objects.get(id=instance.id).active:
        send_mail(
            subject='Active changed: %s -> %s' % (instance.username, instance.active),
            message='Guess who changed active status??',
            from_email=settings.SERVER_EMAIL,
            recipient_list=[p[1] for p in settings.MANAGERS],
        )
signals.pre_save.connect(pre_user_save, sender=User, dispatch_uid='pre_user_save')

Надеюсь, это поможет!

...