For some reason, when exporting commented text with background colors, angle brackets for html spans are sometimes returned as entities by soup.
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)