1 from db import Base
2 from hashlib import sha1
3 from sqlalchemy import Column, Integer, String, Unicode, ForeignKey, Boolean, DateTime, Table
4 from sqlalchemy.orm import relation, backref
5 from gettext import gettext as _
6 import string
7 from random import Random
8 import datetime
9 import config
10 import web
11
12 metadata = Base.metadata
15 __tablename__ = 'user'
16
17 id = Column(Integer, primary_key=True)
18 name = Column(Unicode(60), unique=True)
19 password = Column(String(128))
20 email = Column(Unicode(256))
21 super_user = Column(Boolean)
22 creation_date = Column(DateTime())
23
24 state = Column(Unicode(30))
25
26 temp_token = Column(String(50))
27 temp_token_valid_until = Column(DateTime(50))
28
29 user_organizative_unit = Table('user_organizative_unit', metadata,
30 Column('user_id', Integer, ForeignKey('user.id')),
31 Column('organizative_unit_id', Integer, ForeignKey('organizative_unit.id'))
32 )
33 organizative_units = relation('OrganizativeUnit', secondary=user_organizative_unit)
34
35
36 - def __init__(self, name=u'', password='', email=u''):
45
47 '''
48 Generates a new temporal token valid for 48 hours
49 '''
50 self.temp_token_valid_until = datetime.timedelta(days = 2)+datetime.datetime.now()
51 self.temp_token = ''.join(Random().sample(string.letters + string.digits, 50))
52
54 title = _('Welcome to %s, %s') % (config.sitename, self.name)
55 text = _("""
56 Welcome to %s, %s!
57
58 You can activate you account using the URL below:
59 %suser/confirmemail/%s/%s
60
61 If you didn't request the creation of this user, you should ignore this email.
62
63 Thanks for joining us,
64 %s
65 """) % (config.sitename, self.name, config.siteurl, self.name, self.temp_token, config.sitename)
66 print text
67 try:
68 web.sendmail(config.system_email, self.email, title, text)
69 except:
70 print " ** CAN'T SEND EMAIL ** "
71
73 self.generate_temp_token()
74 title = _('Reset password for %s, %s') % (config.sitename, self.name)
75 text = _("""
76 To recover your password in %s for the user %s, use the following URL:
77
78 %suser/recoverpassword/%s/%s
79
80 If you didn't request the recovery of your password, you should ignore this email.
81
82 Regards,
83 %s
84 """) % (config.sitename, self.name, config.siteurl, self.name, self.temp_token, config.sitename)
85 print text
86 web.sendmail(config.system_email, self.email, title, text)
87
103
106
107 - def auth(self, password):
109
112
114 return self.state == u'active'
115
118
119 @classmethod
134
135
136
137
138
139 @classmethod
141 return ('name', 'email', 'super_user', 'state')
142
143
144 -class Role(Base):
145 __tablename__ = 'role'
146
147 id = Column(Integer, primary_key=True)
148 name = Column(Unicode(60), unique=True)
149
150 user_role = Table('user_role', metadata,
151 Column('user_id', Integer, ForeignKey('user.id')),
152 Column('role_id', Integer, ForeignKey('role.id'))
153 )
154 users = relation('User', secondary=user_role, backref='roles')
155
156 - def __init__(self, name=u'', users=None):
160
163
164 @classmethod
167
170 __tablename__ = 'action'
171 permissions = Table('permissions', metadata,
172 Column('role_id', Integer, ForeignKey('role.id')),
173 Column('action_id', Integer, ForeignKey('action.id'))
174 )
175
176 id = Column(Integer, primary_key=True)
177 name = Column(Unicode(120), unique=True)
178 roles = relation('Role', secondary=permissions, backref='actions')
179
180 - def __init__(self, name=u'', roles=None):
184
187
188 @classmethod
191