· 9 years ago · Jun 25, 2016, 01:48 AM
1"""
2Represents the User database entity
3"""
4from argon2 import PasswordHasher
5from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, BadSignature, SignatureExpired
6from current.config import SECRET_KEY
7from current.models.database_model import DatabaseModel, CharField
8
9
10class User(DatabaseModel):
11 username = CharField(unique=True)
12 email = CharField(unique=True)
13 password = CharField()
14
15 @classmethod
16 def create_user(cls, username, email, password, **kwargs):
17 email = email.lower()
18 try:
19 cls.select().where(
20 (cls.email == email) | (cls.username**username)
21 ).get()
22 except cls.DoesNotExist:
23 user = cls(username=username, email=email)
24 user.password = user.set_password(password)
25 user.save()
26 return user
27 else:
28 raise AlreadyExistsException()
29
30 @staticmethod
31 def verify_auth_token(token):
32 serializer = Serializer(SECRET_KEY)
33 try:
34 data = serializer.loads(token)
35 except (SignatureExpired, BadSignature):
36 return None
37 else:
38 user = User.get(User.id == data['id'])
39 return user
40
41 @staticmethod
42 def set_password(password):
43 return PasswordHasher().hash(password)
44
45 def verify_password(self, password):
46 return PasswordHasher().verify(self.password, password)
47
48 def generate_auth_token(self, expires=None):
49 serializer = Serializer(SECRET_KEY, expires_in=expires)
50 return serializer.dumps({'id': self.id})
51
52
53class AlreadyExistsException(Exception):
54 def __init__(self, *args, **kwargs):
55 pass