src/cm/models_base.py
changeset 0 40c8f766c9b8
child 292 3442202aff1a
equal deleted inserted replaced
-1:000000000000 0:40c8f766c9b8
       
     1 from django.contrib.auth.models import User
       
     2 from django.db import models
       
     3 from django.utils.translation import ugettext as _
       
     4 import random
       
     5 
       
     6 random.seed()
       
     7 
       
     8 # no 0,1,o,l,O (difficult to differentiate)
       
     9 KEY_CHARS = '23456789' + \
       
    10             'abcdefghijklmnpqrstuvwxyz' + \
       
    11             'ABCDEFGHIJKLMNPQRSTUVWXYZ'  
       
    12 
       
    13 
       
    14 KEY_SIZE = 11
       
    15 
       
    16 # database column length
       
    17 KEY_MAX_SIZE = 20
       
    18 
       
    19 def generate_key(size=KEY_SIZE):
       
    20     key = ''.join([random.choice(KEY_CHARS) for i in range(size)])
       
    21     return key
       
    22 
       
    23 class KeyModel(models.Model):        
       
    24     key      = models.CharField(max_length=KEY_MAX_SIZE, db_index=True, unique=True, blank=False)
       
    25     adminkey = models.CharField(max_length=KEY_MAX_SIZE, db_index=True, unique=True, blank=False)
       
    26 
       
    27     class Meta:
       
    28         abstract = True
       
    29             
       
    30 class PermanentModel(KeyModel):
       
    31     """
       
    32     Permanent model: delete only sets a flag in database 
       
    33     """
       
    34     deleted = models.BooleanField(default=False, db_index=True)
       
    35     state = models.CharField(max_length=16, blank=False)
       
    36     class Meta:
       
    37         abstract = True
       
    38 
       
    39     def delete(self):
       
    40         self.deleted = True
       
    41         self.save()
       
    42 
       
    43     def undelete(self):
       
    44         self.deleted = False
       
    45         self.save()
       
    46         
       
    47     def real_delete(self):
       
    48         super(KeyModel, self).delete() 
       
    49 
       
    50 
       
    51 class AuthorModel(models.Model):
       
    52     user = models.ForeignKey(User, blank=True, null=True)
       
    53     name = models.CharField(_("Name:"), max_length=100, null=True, blank=True)
       
    54     email = models.CharField(_("Email:"), max_length=100, null=True, blank=True)
       
    55 
       
    56     class Meta:
       
    57         abstract = True
       
    58     
       
    59     def get_name(self):
       
    60         if self.user:
       
    61             return self.user.username
       
    62         else:
       
    63             return self.name
       
    64 
       
    65     def get_email(self):
       
    66         if self.user:
       
    67             return self.user.email
       
    68         else:
       
    69             return self.email
       
    70 
       
    71     def set_email_or_user(self, email_or_user):
       
    72         if type(email_or_user) == User:
       
    73             self.user = email_or_user
       
    74         else:
       
    75             self.email = email_or_user
       
    76         self.save()
       
    77 
       
    78 class KeyManager(models.Manager):
       
    79     """
       
    80     Manager for key-models
       
    81     """
       
    82     def _gen_key(self):
       
    83         # generate unique key
       
    84         key = generate_key()
       
    85         while self.filter(key=key).count():
       
    86             key = generate_key()
       
    87         return key
       
    88         
       
    89     def _gen_adminkey(self):
       
    90         # generate unique adminkey
       
    91 
       
    92         adminkey = generate_key()
       
    93         while self.filter(adminkey=adminkey).count():
       
    94             adminkey = generate_key()
       
    95         return adminkey
       
    96         
       
    97     def create(self, *args, **kwargs):
       
    98         key = self._gen_key()
       
    99         adminkey = self._gen_adminkey()
       
   100 
       
   101         obj = models.Manager.create(self, key=key, adminkey=adminkey, *args, **kwargs)
       
   102         return obj
       
   103 
       
   104     def update_keys(self, comment):
       
   105         comment.key = self._gen_key()
       
   106         comment.adminkey = self._gen_adminkey()
       
   107 
       
   108     def real_all(self):
       
   109         return super(KeyManager, self).get_query_set()
       
   110         
       
   111 class Manager(KeyManager):
       
   112     """
       
   113     Manager for permanent- and key- models
       
   114     """
       
   115     
       
   116     def get_query_set(self):
       
   117         return super(KeyManager, self).get_query_set().filter(deleted=False)    
       
   118