view gpp/accounts/models.py @ 286:72fd300685d5

For #95. You can now make posts with no text in the body if you have attachments. And now if you create a new topic with an attachment, and the POST fails (say you forgot the topic title), we will now re-attach attachments. Also fixed a bug in the smiley code that would arise if it was asked to markup an empty string.
author Brian Neal <bgneal@gmail.com>
date Sat, 23 Oct 2010 20:19:46 +0000
parents 75ea1a8be7f2
children
line wrap: on
line source
"""Contains models for the accounts application"""

import datetime
import random
import string
import hashlib
import base64

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings


class IllegalUsername(models.Model):
   """model to represent the list of illegal usernames"""
   username = models.CharField(max_length=30, db_index=True)

   def __unicode__(self):
      return self.username

   class Meta:
      ordering = ('username', )


class IllegalEmail(models.Model):
   """model to represent the list of illegal/restricted email addresses"""
   email = models.EmailField(db_index=True)

   def __unicode__(self):
      return self.email

   class Meta:
      ordering = ('email', )


class PendingUserManager(models.Manager):
   """user manager for PendingUser model"""

   create_count = 0

   def create_pending_user(self, username, email, password):
      '''creates a new pending user and saves it to the database'''

      temp_user = User()
      temp_user.set_password(password)

      now = datetime.datetime.now() 
      pending_user = self.model(None, 
            username, 
            email, 
            temp_user.password, 
            now, 
            self._make_key())

      pending_user.save()
      self.create_count += 1
      return pending_user


   def purge_expired(self):
      expire_time = datetime.datetime.now() - datetime.timedelta(days=1)
      expired_pending_users = self.filter(date_joined__lt=expire_time)
      expired_pending_users.delete()


   def _make_key(self):
      s = ''.join(random.sample(string.printable, 8))
      delta = datetime.date.today() - datetime.date(1846, 12, 28)
      days = base64.urlsafe_b64encode(str(delta * 10))
      key = hashlib.sha1(settings.SECRET_KEY +
         unicode(self.create_count) +
         unicode(s) +
         unicode(days)).hexdigest()[::2]
      return key


class PendingUser(models.Model):
   """model for holding users while they go through the email registration cycle"""

   username = models.CharField(max_length=30, db_index=True)
   email = models.EmailField()
   password = models.CharField(max_length=128)
   date_joined = models.DateTimeField(default=datetime.datetime.now, db_index=True)
   key = models.CharField(max_length=20, editable=True)

   objects = PendingUserManager()

   def __unicode__(self):
      return self.username