-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathmodel.py
76 lines (54 loc) · 1.99 KB
/
model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import hashlib
from datetime import datetime
import peewee as pw
from playhouse.signals import Model, pre_save
import config
DoesNotExist = pw.DoesNotExist
SelectQuery = pw.SelectQuery
def better_get(self, **kwargs):
if kwargs:
return self.filter(**kwargs).get()
clone = self.paginate(1, 1)
try:
return clone.execute().next()
except StopIteration:
raise self.model_class.DoesNotExist(
'instance matching query does not exist:\nSQL: %s\nPARAMS: %s' % (
self.sql()))
pw.SelectQuery.get = better_get
class BaseModel(Model):
created_at = pw.DateTimeField(default="now()")
class Meta:
database = config.db
def update_fields(self, **kwargs):
for field, value in kwargs.items():
setattr(self, field, value)
return self.save()
class User(BaseModel):
email = pw.CharField(max_length=200, null=False)
crypted_password = pw.CharField(max_length=40, null=False)
salt = pw.CharField(max_length=40, null=False)
remember_token = pw.CharField(max_length=64, null=True)
def authenticate(self, password):
return self.crypted_password == crypt_password(password,
self.salt)
def __unicode__(self):
return unicode(self.email)
def create_salt(email):
return hashlib.md5("--%s--%s--" % (datetime.now(),
email)).hexdigest()
def crypt_password(password, salt):
return hashlib.md5("--%s--%s--" % (salt, password)).hexdigest()
# Fix reloading during development :-/
try:
pre_save.disconnect(name='crypt_password_before_save')
except:
pass
@pre_save(sender=User)
def crypt_password_before_save(model_class, instance, created):
if not instance.password:
return
if not instance.salt:
instance.salt = create_salt(instance.email)
instance.crypted_password = crypt_password(instance.password,
instance.salt)