|
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 |