Skip to content

Commit

Permalink
Remove User model dependency in account/models
Browse files Browse the repository at this point in the history
  • Loading branch information
andrei1089 committed Jan 9, 2014
1 parent bd1e102 commit 789f708
Showing 1 changed file with 40 additions and 40 deletions.
80 changes: 40 additions & 40 deletions account/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import pytz

from account import signals
from account.compat import User
#from account.compat import User
from account.conf import settings
from account.fields import TimeZoneField
from account.managers import EmailAddressManager, EmailConfirmationManager
Expand All @@ -33,15 +33,15 @@
AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')

class Account(models.Model):

user = models.OneToOneField(AUTH_USER_MODEL, related_name="account", verbose_name=_("user"))
timezone = TimeZoneField(_("timezone"))
language = models.CharField(_("language"),
max_length=10,
choices=settings.ACCOUNT_LANGUAGES,
default=settings.LANGUAGE_CODE
)

@classmethod
def for_request(cls, request):
if request.user.is_authenticated():
Expand All @@ -52,7 +52,7 @@ def for_request(cls, request):
else:
account = AnonymousAccount(request)
return account

@classmethod
def create(cls, request=None, **kwargs):
create_email = kwargs.pop("create_email", True)
Expand All @@ -70,18 +70,18 @@ def create(cls, request=None, **kwargs):
kwargs["confirm"] = confirm_email
EmailAddress.objects.add_email(account.user, account.user.email, **kwargs)
return account

def __unicode__(self):
return self.user.username

def now(self):
"""
Returns a timezone aware datetime localized to the account's timezone.
"""
now = datetime.datetime.utcnow().replace(tzinfo=pytz.timezone("UTC"))
timezone = settings.TIME_ZONE if not self.timezone else self.timezone
return now.astimezone(pytz.timezone(timezone))

def localtime(self, value):
"""
Given a datetime object as value convert it to the timezone of
Expand All @@ -91,31 +91,31 @@ def localtime(self, value):
if value.tzinfo is None:
value = pytz.timezone(settings.TIME_ZONE).localize(value)
return value.astimezone(pytz.timezone(timezone))
post_save.connect(user_post_save, sender=User)
#post_save.connect(user_post_save, sender=User)


class AnonymousAccount(object):

def __init__(self, request=None):
self.user = AnonymousUser()
self.timezone = settings.TIME_ZONE
if request is None:
self.language = settings.LANGUAGE_CODE
else:
self.language = translation.get_language_from_request(request, check_path=True)

def __unicode__(self):
return "AnonymousAccount"


class SignupCode(models.Model):

class AlreadyExists(Exception):
pass

class InvalidCode(Exception):
pass

code = models.CharField(max_length=64, unique=True)
max_uses = models.PositiveIntegerField(default=1)
expiry = models.DateTimeField(null=True, blank=True)
Expand All @@ -125,13 +125,13 @@ class InvalidCode(Exception):
sent = models.DateTimeField(null=True, blank=True)
created = models.DateTimeField(default=timezone.now, editable=False)
use_count = models.PositiveIntegerField(editable=False, default=0)

def __unicode__(self):
if self.email:
return u"%s [%s]" % (self.email, self.code)
else:
return self.code

@classmethod
def exists(cls, code=None, email=None):
checks = []
Expand All @@ -140,7 +140,7 @@ def exists(cls, code=None, email=None):
if email:
checks.append(Q(email=code))
return cls._default_manager.filter(reduce(operator.or_, checks)).exists()

@classmethod
def create(cls, **kwargs):
email, code = kwargs.get("email"), kwargs.get("code")
Expand All @@ -159,7 +159,7 @@ def create(cls, **kwargs):
if email:
params["email"] = email
return cls(**params)

@classmethod
def check(cls, code):
try:
Expand All @@ -174,11 +174,11 @@ def check(cls, code):
raise cls.InvalidCode()
else:
return signup_code

def calculate_use_count(self):
self.use_count = self.signupcoderesult_set.count()
self.save()

def use(self, user):
"""
Add a SignupCode result attached to the given user.
Expand All @@ -188,7 +188,7 @@ def use(self, user):
result.user = user
result.save()
signup_code_used.send(sender=result.__class__, signup_code_result=result)

def send(self, **kwargs):
protocol = getattr(settings, "DEFAULT_HTTP_PROTOCOL", "http")
current_site = kwargs["site"] if "site" in kwargs else Site.objects.get_current()
Expand All @@ -212,34 +212,34 @@ def send(self, **kwargs):


class SignupCodeResult(models.Model):

signup_code = models.ForeignKey(SignupCode)
user = models.ForeignKey(AUTH_USER_MODEL)
timestamp = models.DateTimeField(default=datetime.datetime.now)

def save(self, **kwargs):
super(SignupCodeResult, self).save(**kwargs)
self.signup_code.calculate_use_count()


class EmailAddress(models.Model):

user = models.ForeignKey(AUTH_USER_MODEL)
email = models.EmailField(unique=settings.ACCOUNT_EMAIL_UNIQUE, max_length=254)
verified = models.BooleanField(default=False)
primary = models.BooleanField(default=False)

objects = EmailAddressManager()

class Meta:
verbose_name = _("email address")
verbose_name_plural = _("email addresses")
if not settings.ACCOUNT_EMAIL_UNIQUE:
unique_together = [("user", "email")]

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

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

def send_confirmation(self):
confirmation = EmailConfirmation.create(self)
confirmation.send()
return confirmation

def change(self, new_email, confirm=True):
"""
Given a new email address, change self and re-confirm.
Expand All @@ -273,31 +273,31 @@ def change(self, new_email, confirm=True):


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 __unicode__(self):
return u"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
Expand All @@ -306,7 +306,7 @@ def confirm(self):
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")
Expand All @@ -332,12 +332,12 @@ def send(self, **kwargs):


class AccountDeletion(models.Model):

user = models.ForeignKey(AUTH_USER_MODEL, null=True, blank=True, on_delete=models.SET_NULL)
email = models.EmailField(max_length=254)
date_requested = models.DateTimeField(default=timezone.now)
date_expunged = models.DateTimeField(null=True, blank=True)

@classmethod
def expunge(cls, hours_ago=None):
if hours_ago is None:
Expand All @@ -355,7 +355,7 @@ def expunge(cls, hours_ago=None):
logger.error("Failed to delete user %s", account_deletion.user)
logger.error("%s", traceback.format_exc())
return count

@classmethod
def mark(cls, user):
account_deletion, created = cls.objects.get_or_create(user=user)
Expand Down

0 comments on commit 789f708

Please sign in to comment.