comparison pylons_app/model/forms.py @ 442:d66a7fa7689b

moved loged in user propagation out of forms, update user model to get auto update last login. bugfix with redirect log fixed forms logic a little bit some other tweeks
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 01 Sep 2010 23:32:47 +0200
parents 63c697d1a631
children 00f883abdb0c
comparison
equal deleted inserted replaced
441:c59c4d4323e7 442:d66a7fa7689b
24 Email, Bool, StringBoolean 24 Email, Bool, StringBoolean
25 from pylons import session 25 from pylons import session
26 from pylons.i18n.translation import _ 26 from pylons.i18n.translation import _
27 from pylons_app.lib.auth import check_password, get_crypt_password 27 from pylons_app.lib.auth import check_password, get_crypt_password
28 from pylons_app.model import meta 28 from pylons_app.model import meta
29 from pylons_app.model.user_model import UserModel
29 from pylons_app.model.db import User, Repository 30 from pylons_app.model.db import User, Repository
30 from sqlalchemy.exc import OperationalError 31 from sqlalchemy.exc import OperationalError
31 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound 32 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
32 from webhelpers.pylonslib.secure_form import authentication_token 33 from webhelpers.pylonslib.secure_form import authentication_token
33 import datetime
34 import formencode 34 import formencode
35 import logging 35 import logging
36 import os 36 import os
37 import pylons_app.lib.helpers as h 37 import pylons_app.lib.helpers as h
38 log = logging.getLogger(__name__) 38 log = logging.getLogger(__name__)
91 e_dict = {'username':messages['invalid_login'], 91 e_dict = {'username':messages['invalid_login'],
92 'password':messages['invalid_password']} 92 'password':messages['invalid_password']}
93 e_dict_disable = {'username':messages['disabled_account']} 93 e_dict_disable = {'username':messages['disabled_account']}
94 94
95 def validate_python(self, value, state): 95 def validate_python(self, value, state):
96 sa = meta.Session
97 password = value['password'] 96 password = value['password']
98 username = value['username'] 97 username = value['username']
99 try: 98 try:
100 user = sa.query(User).filter(User.username == username).one() 99 user = UserModel().get_user_by_name(username)
101 except (NoResultFound, MultipleResultsFound, OperationalError) as e: 100 except (NoResultFound, MultipleResultsFound, OperationalError) as e:
102 log.error(e) 101 log.error(e)
103 user = None 102 user = None
104 raise formencode.Invalid(self.message('invalid_password', 103 raise formencode.Invalid(self.message('invalid_password',
105 state=State_obj), value, state, 104 state=State_obj), value, state,
106 error_dict=self.e_dict) 105 error_dict=self.e_dict)
107 if user: 106 if user:
108 if user.active: 107 if user.active:
109 if user.username == username and check_password(password, user.password): 108 if user.username == username and check_password(password,
110 from pylons_app.lib.auth import AuthUser 109 user.password):
111 auth_user = AuthUser()
112 auth_user.username = username
113 auth_user.is_authenticated = True
114 auth_user.is_admin = user.admin
115 auth_user.user_id = user.user_id
116 auth_user.name = user.name
117 auth_user.lastname = user.lastname
118 session['hg_app_user'] = auth_user
119 session.save()
120 log.info('user %s is now authenticated', username)
121
122 try:
123 user.last_login = datetime.datetime.now()
124 sa.add(user)
125 sa.commit()
126 except (OperationalError) as e:
127 log.error(e)
128 sa.rollback()
129
130 return value 110 return value
131 else: 111 else:
132 log.warning('user %s not authenticated', username) 112 log.warning('user %s not authenticated', username)
133 raise formencode.Invalid(self.message('invalid_password', 113 raise formencode.Invalid(self.message('invalid_password',
134 state=State_obj), value, state, 114 state=State_obj), value, state,
137 log.warning('user %s is disabled', username) 117 log.warning('user %s is disabled', username)
138 raise formencode.Invalid(self.message('disabled_account', 118 raise formencode.Invalid(self.message('disabled_account',
139 state=State_obj), 119 state=State_obj),
140 value, state, 120 value, state,
141 error_dict=self.e_dict_disable) 121 error_dict=self.e_dict_disable)
142
143 meta.Session.remove()
144
145 122
146 class ValidRepoUser(formencode.validators.FancyValidator): 123 class ValidRepoUser(formencode.validators.FancyValidator):
147 124
148 def to_python(self, value, state): 125 def to_python(self, value, state):
149 sa = meta.Session
150 try: 126 try:
151 self.user_db = sa.query(User)\ 127 self.user_db = meta.Session.query(User)\
152 .filter(User.active == True)\ 128 .filter(User.active == True)\
153 .filter(User.username == value).one() 129 .filter(User.username == value).one()
154 except Exception: 130 except Exception:
155 raise formencode.Invalid(_('This username is not valid'), 131 raise formencode.Invalid(_('This username is not valid'),
156 value, state) 132 value, state)
157 meta.Session.remove() 133 finally:
134 meta.Session.remove()
135
158 return self.user_db.user_id 136 return self.user_db.user_id
159 137
160 def ValidRepoName(edit, old_data): 138 def ValidRepoName(edit, old_data):
161 class _ValidRepoName(formencode.validators.FancyValidator): 139 class _ValidRepoName(formencode.validators.FancyValidator):
162 140