src/cm/models_base.py
author gibus
Wed, 11 Sep 2013 23:13:01 +0200
changeset 532 0bad3613f59d
parent 472 39f17ac0388c
permissions -rw-r--r--
Reverse to YUI 3.0.0 since with YUI.3.10.3, comment content including words 'paragraph' or 'section' do not show up on Firefox, this is weird and has to be investigated.

from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import ugettext as _
import random

random.seed()

# no 0,1,o,l,O (difficult to differentiate)
KEY_CHARS = '23456789' + \
            'abcdefghijklmnpqrstuvwxyz' + \
            'ABCDEFGHIJKLMNPQRSTUVWXYZ'  


KEY_SIZE = 11

# database column length
KEY_MAX_SIZE = 20

def generate_key(size=KEY_SIZE):
    key = ''.join([random.choice(KEY_CHARS) for i in range(size)])
    return key

class KeyModel(models.Model):        
    key      = models.CharField(max_length=KEY_MAX_SIZE, db_index=True, unique=True, blank=False)
    adminkey = models.CharField(max_length=KEY_MAX_SIZE, db_index=True, unique=True, blank=False)

    class Meta:
        abstract = True
            
class PermanentModel(KeyModel):
    """
    Permanent model: delete only sets a flag in database 
    """
    deleted = models.BooleanField(default=False, db_index=True)
    state = models.CharField(max_length=16, blank=False)
    class Meta:
        abstract = True

    def delete(self):
        self.deleted = True
        self.save()

    def undelete(self):
        self.deleted = False
        self.save()
        
    def real_delete(self):
        super(KeyModel, self).delete() 


class AuthorModel(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    name = models.CharField(_("Name:"), max_length=100, null=True, blank=True)
    email = models.CharField(_("Email:"), max_length=100, null=True, blank=True)

    class Meta:
        abstract = True
    
    def get_name(self):
        from cm.cm_settings import DECORATED_CREATORS
        
        if self.user and (not DECORATED_CREATORS or self.name == None):
            return self.user.username
        else:
            return self.name

    def get_email(self):
        from cm.cm_settings import DECORATED_CREATORS
        
        if self.user and (not DECORATED_CREATORS or self.email == None):
            return self.user.email
        else:
            return self.email

    def set_email_or_user(self, email_or_user):
        if type(email_or_user) == User:
            self.user = email_or_user
        else:
            self.email = email_or_user
        self.save()

class KeyManager(models.Manager):
    """
    Manager for key-models
    """
    def _gen_key(self):
        # generate unique key
        key = generate_key()
        while self.filter(key=key).count():
            key = generate_key()
        return key
        
    def _gen_adminkey(self):
        # generate unique adminkey

        adminkey = generate_key()
        while self.filter(adminkey=adminkey).count():
            adminkey = generate_key()
        return adminkey
        
    def create(self, *args, **kwargs):
        key = self._gen_key()
        adminkey = self._gen_adminkey()

        obj = models.Manager.create(self, key=key, adminkey=adminkey, *args, **kwargs)
        return obj

    def update_keys(self, comment):
        comment.key = self._gen_key()
        comment.adminkey = self._gen_adminkey()

    def real_all(self):
        return super(KeyManager, self).get_query_set()
        
class Manager(KeyManager):
    """
    Manager for permanent- and key- models
    """
    
    def get_query_set(self):
        return super(KeyManager, self).get_query_set().filter(deleted=False)