class EmailConfirmation(models.Model): email_address = models.ForeignKey(EmailAddress) created = models.DateTimeField(default=timezone.now) sent = models.DateTimeField(null=True) key = models.CharField(max_length=64, unique=True) objects = EmailConfirmationManager() class Meta: verbose_name = _("email confirmation") verbose_name_plural = _("email confirmations") def __str__(self): return "confirmation for {0}".format(self.email_address) @classmethod def create(cls, email_address): key = hookset.generate_email_confirmation_token(email_address.email) return cls._default_manager.create(email_address=email_address, key=key) def key_expired(self): expiration_date = self.sent + datetime.timedelta( days=settings.ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS) return expiration_date <= timezone.now() key_expired.boolean = True def confirm(self): if not self.key_expired() and not self.email_address.verified: email_address = self.email_address email_address.verified = True email_address.set_as_primary(conditional=True) email_address.save() signals.email_confirmed.send(sender=self.__class__, email_address=email_address) return email_address def send(self, **kwargs): current_site = kwargs[ "site"] if "site" in kwargs else Site.objects.get_current() protocol = getattr(settings, "DEFAULT_HTTP_PROTOCOL", "http") activate_url = "{0}://{1}{2}".format( protocol, current_site.domain, reverse(settings.ACCOUNT_EMAIL_CONFIRMATION_URL, args=[self.key])) ctx = { "email_address": self.email_address, "user": self.email_address.user, "activate_url": activate_url, "current_site": current_site, "key": self.key, } hookset.send_confirmation_email([self.email_address.email], ctx) self.sent = timezone.now() self.save() signals.email_confirmation_sent.send(sender=self.__class__, confirmation=self)
class EmailConfirmation(models.Model): email_address = models.ForeignKey(EmailAddress) created = models.DateTimeField(default=timezone.now()) sent = models.DateTimeField(null=True) key = models.CharField(max_length=64, unique=True) objects = EmailConfirmationManager() class Meta: verbose_name = _("email confirmation") verbose_name_plural = _("email confirmations") def __str__(self): return "confirmation for %s" % self.email_address @classmethod def create(cls, email_address): key = random_token([email_address.email]) return cls._default_manager.create(email_address=email_address, key=key) def key_expired(self): expiration_date = self.sent + datetime.timedelta(days=settings.ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS) return expiration_date <= timezone.now() key_expired.boolean = True def confirm(self): if not self.key_expired() and not self.email_address.verified: email_address = self.email_address email_address.verified = True email_address.set_as_primary(conditional=True) email_address.save() signals.email_confirmed.send(sender=self.__class__, email_address=email_address) return email_address def send(self, **kwargs): current_site = kwargs["site"] if "site" in kwargs else Site.objects.get_current() protocol = getattr(settings, "DEFAULT_HTTP_PROTOCOL", "http") activate_url = "%s://%s%s" % ( protocol, unicode(current_site.domain), reverse("account_confirm_email", args=[self.key]) ) ctx = { "email_address": self.email_address, "user": self.email_address.user, "activate_url": activate_url, "current_site": current_site, "key": self.key, } subject = render_to_string("account/email/email_confirmation_subject.txt", ctx) subject = "".join(subject.splitlines()) # remove superfluous line breaks message = render_to_string("account/email/email_confirmation_message.txt", ctx) send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [self.email_address.email]) self.sent = timezone.now() self.save() signals.email_confirmation_sent.send(sender=self.__class__, confirmation=self)
class EmailConfirmation(models.Model): email_address = models.ForeignKey(EmailAddress, on_delete=models.CASCADE) created = models.DateTimeField(default=timezone.now) sent = models.DateTimeField(null=True) key = models.CharField(max_length=64, unique=True) objects = EmailConfirmationManager() class Meta: verbose_name = _("email confirmation") verbose_name_plural = _("email confirmations") def __str__(self): return "confirmation for {0}".format(self.email_address) @classmethod def create(cls, email_address): key = hookset.generate_email_confirmation_token(email_address.email) return cls._default_manager.create(email_address=email_address, key=key) def key_expired(self): expiration_date = self.sent + datetime.timedelta( days=settings.ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS) return expiration_date <= timezone.now() key_expired.boolean = True def confirm(self): if not self.key_expired() and not self.email_address.verified: email_address = self.email_address email_address.verified = True email_address.set_as_primary(conditional=True) email_address.save() signals.email_confirmed.send(sender=self.__class__, email_address=email_address) return email_address