Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 24 additions & 18 deletions emailconfirmation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,30 @@

from emailconfirmation.signals import email_confirmed, email_confirmation_sent

try:
from django.utils.timezone import now
except ImportError:
now = datetime.datetime.now


# this code based in-part on django-registration

class EmailAddressManager(models.Manager):

def add_email(self, user, email):
try:
email_address = self.create(user=user, email=email)
EmailConfirmation.objects.send_confirmation(email_address)
return email_address
except IntegrityError:
return None

def get_primary(self, user):
try:
return self.get(user=user, primary=True)
except EmailAddress.DoesNotExist:
return None

def get_users_for(self, email):
"""
returns a list of users with the given email.
Expand All @@ -43,14 +49,14 @@ def get_users_for(self, email):


class EmailAddress(models.Model):

user = models.ForeignKey(User)
email = models.EmailField()
verified = models.BooleanField(default=False)
primary = models.BooleanField(default=False)

objects = EmailAddressManager()

def set_as_primary(self, conditional=False):
old_primary = EmailAddress.objects.get_primary(self.user)
if old_primary:
Expand All @@ -63,10 +69,10 @@ def set_as_primary(self, conditional=False):
self.user.email = self.email
self.user.save()
return True

def __unicode__(self):
return u"%s (%s)" % (self.email, self.user)

class Meta:
verbose_name = _("email address")
verbose_name_plural = _("email addresses")
Expand All @@ -76,7 +82,7 @@ class Meta:


class EmailConfirmationManager(models.Manager):

def confirm_email(self, confirmation_key):
try:
confirmation = self.get(confirmation_key=confirmation_key)
Expand All @@ -89,7 +95,7 @@ def confirm_email(self, confirmation_key):
email_address.save()
email_confirmed.send(sender=self.model, email_address=email_address)
return email_address

def send_confirmation(self, email_address):
salt = sha_constructor(str(random())).hexdigest()[:5]
confirmation_key = sha_constructor(salt + email_address.email).hexdigest()
Expand Down Expand Up @@ -123,38 +129,38 @@ def send_confirmation(self, email_address):
send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [email_address.email])
confirmation = self.create(
email_address=email_address,
sent=datetime.datetime.now(),
sent=now(),
confirmation_key=confirmation_key
)
email_confirmation_sent.send(
sender=self.model,
confirmation=confirmation,
)
return confirmation

def delete_expired_confirmations(self):
for confirmation in self.all():
if confirmation.key_expired():
confirmation.delete()


class EmailConfirmation(models.Model):

email_address = models.ForeignKey(EmailAddress)
sent = models.DateTimeField()
confirmation_key = models.CharField(max_length=40)

objects = EmailConfirmationManager()

def key_expired(self):
expiration_date = self.sent + datetime.timedelta(
days=settings.EMAIL_CONFIRMATION_DAYS)
return expiration_date <= datetime.datetime.now()
return expiration_date <= now()
key_expired.boolean = True

def __unicode__(self):
return u"confirmation for %s" % self.email_address

class Meta:
verbose_name = _("email confirmation")
verbose_name_plural = _("email confirmations")