/ / Envoyer un e-mail à un utilisateur Django si son statut actif est modifié - django, django-models, django-users

Envoyer un e-mail à un utilisateur Django si son statut actif est modifié - django, django-models, django-users

"J'ai créé un site qui nécessite une adhésion pourcertaines portions. C'est un site Web de club, donc pour être membre sur le site Web, vous devez être membre dans la vraie vie. un utilisateur s'inscrit), puis l'administrateur vérifie la active case à cocher sous l'enregistrement de l'utilisateur dans l'administrateur Django et enregistre l'utilisateur.

Le problème que j'essaie de surmonter est que nous avons besoin de nouveaux utilisateurs valides pour être informés du moment où ils peuvent commencer à utiliser leur compte. Évidemment, l'envoi manuel d'un e-mail est lourd.

Y a-t-il un moyen de s’accrocher au save() la logique, vérifier si l'enregistrement "s active l'état a changé et s'il a été activé, envoyer à cet utilisateur un e-mail lui indiquant qu'il peut désormais se connecter?

Je suis au-dessus de toute la logique de l'email, j'ai juste besoin de savoir où le mettre.

Je me rends compte qu'il existe d'autres façons de tester (vérifier last_login==None sur active==True comptes sur un travail de style cron) mais j'aimerais que les notifications soient presque instantanées.

Réponses:

1 pour la réponse № 1

Oui, vous devez utiliser signaux django, Plus précisément post_save (). Ceci, comme vous l'avez probablement deviné, est appelé après la sauvegarde de votre modèle et vous pouvez ensuite implémenter la fonctionnalité de post-sauvegarde (c'est-à-dire la post-écriture dans la base de données) dont vous avez besoin.


1 pour la réponse № 2

ok 5 ans plus tard, mais cela fonctionne pour moi avec django 1.8 et python 2.7

Le contexte est: l'utilisateur crée un nouveau compte, puis l'administrateur reçoit un e-mail pour vérifier l'utilisateur et le chage actif sur True lorsque l'administrateur effectue la modification, l'utilisateur reçoit un e-mail lui indiquant qu'il peut désormais se connecter.

Désolé pour mon mauvais anglais.

#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

J'utilise les signaux dans le fichier models.py mais vous pouvez l'utiliser dans un fichier signaux.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)

0 pour la réponse № 3

Cela n'a pas été testé mais voici une version modifiée de quelque chose que je fais qui est similaire:

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

J'espère que cela t'aides!