PageRenderTime 31ms CodeModel.GetById 19ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 0ms

/shabti/templates/formalchemy/+package+/model/identity.py_tmpl

https://bitbucket.org/gawel/shabti
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