You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
from __future__ import unicode_literals
|
|
|
|
from django.utils.encoding import python_2_unicode_compatible
|
|
import django.dispatch
|
|
from django.conf import settings
|
|
from django.db import models
|
|
from django.utils.timezone import now as tznow
|
|
|
|
from nano.activation.signals import key_activated
|
|
|
|
Q = models.Q
|
|
|
|
class ActivationError(Exception):
|
|
pass
|
|
|
|
class ActivationKeyError(ActivationError):
|
|
pass
|
|
|
|
def activate(keystring, user):
|
|
"""Attempts to activate a specific key for user, returns activated key on activation,
|
|
raises an exception otherwise"""
|
|
try:
|
|
key = Key.objects.get(key=keystring)
|
|
except Key.DoesNotExist:
|
|
raise ActivationKeyError('Key %s does not exist, typo?' % keystring)
|
|
key.activate(user)
|
|
return key
|
|
|
|
class KeyManager(models.Manager):
|
|
|
|
def expired(self):
|
|
now = tznow()
|
|
return self.get_queryset().exclude(expires=None).filter(expires__lte=now)
|
|
|
|
def available(self):
|
|
now = tznow()
|
|
return self.get_queryset().filter(Q(expires__gt=now)|Q(expires=None)).filter(activated=None)
|
|
|
|
def activated(self):
|
|
now = tznow()
|
|
return self.get_queryset().exclude(activated=None)
|
|
|
|
def activate(self, *args):
|
|
return activate(*args)
|
|
|
|
@python_2_unicode_compatible
|
|
class Key(models.Model):
|
|
key = models.CharField(max_length=255)
|
|
group = models.SlugField(max_length=32, blank=True, null=True)
|
|
pub_date = models.DateTimeField(auto_now_add=True)
|
|
expires = models.DateTimeField(blank=True, null=True)
|
|
activated = models.DateTimeField(blank=True, null=True)
|
|
activated_by = models.ForeignKey(
|
|
settings.AUTH_USER_MODEL,
|
|
on_delete=models.CASCADE,
|
|
blank=True,
|
|
null=True,
|
|
related_name='activation_keys'
|
|
)
|
|
|
|
objects = KeyManager()
|
|
|
|
class Meta:
|
|
db_table = 'nano_activation_code'
|
|
ordering = ('-pub_date',)
|
|
get_latest_by = 'pub_date'
|
|
|
|
def __str__(self):
|
|
pp_pub_date = self.pub_date
|
|
pp_expires = self.expires or ''
|
|
return "%s (%s) %s %s" % (self.key, self.group, pp_pub_date, pp_expires)
|
|
|
|
def activate(self, user):
|
|
"""Activates a specific key for user, returns activated key on activation,
|
|
raises an exception otherwise"""
|
|
now = tznow()
|
|
if self.expires and self.expires <= now:
|
|
raise ActivationKeyError('Key expired on %s' % self.expires)
|
|
if self.activated:
|
|
raise ActivationKeyError('Key has already been activated')
|
|
self.activated_by = user
|
|
self.activated = now
|
|
self.save()
|
|
key_activated.send_robust(sender=self, user=user, group=self.group)
|
|
return self
|