src/cm/models_base.py
changeset 0 40c8f766c9b8
child 292 3442202aff1a
--- /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)    
+