/shabti/templates/formalchemy/+package+/model/identity.py_tmpl
Unknown | 94 lines | 71 code | 23 blank | 0 comment | 0 complexity | 2e5df56071cba4e1c4a787efa8e202f2 MD5 | raw file
1from datetime import datetime
2from elixir import *
3from elixir import events
4import hashlib
5from {{package}}.model import Session, metadata
6
7options_defaults['inheritance'] = 'multi'
8
9def encrypt_value(value):
10 return hashlib.sha1(value).hexdigest()
11
12
13class NotAuthenticated(Exception):pass
14
15class User(Entity):
16 username = Field(Unicode(30), unique=True) # undocumented
17 password = Field(String(40)) # undocumented
18 password_check = Field(String(40)) # undocumented
19 email = Field(String(255)) # undocumented
20 created = Field(DateTime) # undocumented
21 active = Field(Boolean) # undocumented
22 groups = ManyToMany('Group')
23 using_options(shortnames=True)
24
25 def __repr__(self):
26 return self.username
27
28 __unicode__ = __repr__
29
30 @classmethod
31 def authenticate(cls, username, password):
32 try:
33 user=cls.query.filter_by(username=username, active=True).one()
34 if user and encrypt_value(password) == user.password:
35 return user
36 except Exception:
37 raise NotAuthenticated
38 raise NotAuthenticated
39
40 def validate_password(user, password):
41 return encrypt_value(password) == user.password
42
43 @events.before_insert
44 @events.before_update
45 def encrypt_password(self):
46 if self.password and self.password != self.password_check:
47 self.password = encrypt_value(self.password)
48 self.password_check = self.password
49
50 @property
51 def permissions(self):
52 permissions = set()
53 for g in self.groups:
54 permissions = permissions | set(g.permissions)
55 return permissions
56
57 @property
58 def permission_names(self):
59 return [p.name for p in self.permissions]
60
61 def has_permission(self, perm):
62 return (perm in self.permission_names)
63
64
65class Group(Entity):
66 name = Field(Unicode(30)) # undocumented
67 description = Field(Unicode(255)) # undocumented
68 created = Field(DateTime) # undocumented
69 active = Field(Boolean) # undocumented
70 users = ManyToMany('User')
71 permissions = ManyToMany('Permission')
72 using_options(shortnames=True)
73
74 def __repr__(self):
75 return self.name
76
77 __unicode__ = __repr__
78
79class Permission(Entity):
80 name = Field(Unicode(30)) # undocumented
81 description = Field(Unicode(255)) # undocumented
82 groups = ManyToMany('Group', onupdate = 'CASCADE',
83 ondelete = 'CASCADE', uselist = True)
84 using_options(shortnames=True)
85
86 def __repr__(self):
87 return self.name
88
89 __unicode__ = __repr__
90
91
92__all__=['User', 'Permission', 'Group', 'NotAuthenticated']
93
94# Overwritten by Shabti formalchemy template