##// END OF EJS Templates
CHanged form error when user account is disabled.
marcink -
r227:35101304 default
parent child Browse files
Show More
@@ -1,125 +1,127 b''
1 1 """ this is forms validation classes
2 2 http://formencode.org/module-formencode.validators.html
3 3 for list off all availible validators
4 4
5 5 we can create our own validators
6 6
7 7 The table below outlines the options which can be used in a schema in addition to the validators themselves
8 8 pre_validators [] These validators will be applied before the schema
9 9 chained_validators [] These validators will be applied after the schema
10 10 allow_extra_fields False If True, then it is not an error when keys that aren't associated with a validator are present
11 11 filter_extra_fields False If True, then keys that aren't associated with a validator are removed
12 12 if_key_missing NoDefault If this is given, then any keys that aren't available but are expected will be replaced with this value (and then validated). This does not override a present .if_missing attribute on validators. NoDefault is a special FormEncode class to mean that no default values has been specified and therefore missing keys shouldn't take a default value.
13 13 ignore_key_missing False If True, then missing keys will be missing in the result, if the validator doesn't have .if_missing on it already
14 14
15 15
16 16 <name> = formencode.validators.<name of validator>
17 17 <name> must equal form name
18 18 list=[1,2,3,4,5]
19 19 for SELECT use formencode.All(OneOf(list), Int())
20 20
21 21 """
22 22 from formencode.validators import UnicodeString, OneOf, Int, Number, Regex
23 23 from pylons import session
24 24 from pylons.i18n.translation import _
25 25 from pylons_app.lib.auth import get_crypt_password
26 26 from pylons_app.model import meta
27 27 from pylons_app.model.db import Users
28 28 from sqlalchemy.exc import OperationalError
29 29 from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
30 30 from webhelpers.pylonslib.secure_form import authentication_token
31 31 import formencode
32 32 import logging
33 33 log = logging.getLogger(__name__)
34 34
35 35
36 36 #this is needed to translate the messages using _() in validators
37 37 class State_obj(object):
38 38 _ = staticmethod(_)
39 39
40 40 #===============================================================================
41 41 # VALIDATORS
42 42 #===============================================================================
43 43 class ValidAuthToken(formencode.validators.FancyValidator):
44 44 messages = {'invalid_token':_('Token mismatch')}
45 45
46 46 def validate_python(self, value, state):
47 47
48 48 if value != authentication_token():
49 49 raise formencode.Invalid(self.message('invalid_token', state,
50 50 search_number=value), value, state)
51 51
52 52 class ValidAuth(formencode.validators.FancyValidator):
53 53 messages = {
54 54 'invalid_password':_('invalid password'),
55 55 'invalid_login':_('invalid user name'),
56 56 'disabled_account':_('Your acccount is disabled')
57 57
58 58 }
59 59 #error mapping
60 60 e_dict = {'username':messages['invalid_login'],
61 61 'password':messages['invalid_password']}
62 e_dict_disable = {'username':messages['disabled_account']}
62 63
63 64 def validate_python(self, value, state):
64 65 sa = meta.Session
65 66 crypted_passwd = get_crypt_password(value['password'])
66 67 username = value['username']
67 68 try:
68 69 user = sa.query(Users).filter(Users.username == username).one()
69 70 except (NoResultFound, MultipleResultsFound, OperationalError) as e:
70 71 log.error(e)
71 72 user = None
72 73 if user:
73 74 if user.active:
74 75 if user.username == username and user.password == crypted_passwd:
75 76 from pylons_app.lib.auth import AuthUser
76 77 auth_user = AuthUser()
77 78 auth_user.username = username
78 79 auth_user.is_authenticated = True
79 80 auth_user.is_admin = user.admin
80 81 session['hg_app_user'] = auth_user
81 82 session.save()
82 83 log.info('user %s is now authenticated', username)
83 84 return value
84 85 else:
85 86 log.warning('user %s not authenticated', username)
86 87 raise formencode.Invalid(self.message('invalid_password',
87 88 state=State_obj), value, state,
88 89 error_dict=self.e_dict)
89 90 else:
90 91 log.warning('user %s is disabled', username)
91 92 raise formencode.Invalid(self.message('disabled_account',
92 93 state=State_obj),
93 value, state, error_dict=self.e_dict)
94 value, state,
95 error_dict=self.e_dict_disable)
94 96
95 97
96 98
97 99 #===============================================================================
98 100 # FORMS
99 101 #===============================================================================
100 102 class LoginForm(formencode.Schema):
101 103 allow_extra_fields = True
102 104 filter_extra_fields = True
103 105 username = UnicodeString(
104 106 strip=True,
105 107 min=3,
106 108 not_empty=True,
107 109 messages={
108 110 'empty':_('Please enter a login'),
109 111 'tooShort':_('Enter a value %(min)i characters long or more')}
110 112 )
111 113
112 114 password = UnicodeString(
113 115 strip=True,
114 116 min=3,
115 117 not_empty=True,
116 118 messages={
117 119 'empty':_('Please enter a password'),
118 120 'tooShort':_('Enter a value %(min)i characters long or more')}
119 121 )
120 122
121 123
122 124 #chained validators have access to all data
123 125 chained_validators = [ValidAuth]
124 126
125 127
General Comments 0
You need to be logged in to leave comments. Login now