diff -r 000000000000 -r 40c8f766c9b8 src/cm/models_base.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cm/models_base.py Mon Nov 23 15:14:29 2009 +0100 @@ -0,0 +1,118 @@ +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): + if self.user: + return self.user.username + else: + return self.name + + def get_email(self): + if self.user: + 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) +