Merge lp:~jfb-tempo-consulting/unifield-web/us-1519 into lp:unifield-web
- us-1519
- Merge into trunk
Proposed by
jftempo
Status: | Merged |
---|---|
Merged at revision: | 4802 |
Proposed branch: | lp:~jfb-tempo-consulting/unifield-web/us-1519 |
Merge into: | lp:unifield-web |
Diff against target: |
303 lines (+127/-28) 7 files modified
addons/openerp/controllers/database.py (+60/-18) addons/openerp/controllers/preferences.py (+5/-3) addons/openerp/controllers/root.py (+7/-0) addons/openerp/controllers/templates/login.mako (+17/-4) addons/openerp/controllers/utils.py (+4/-1) openobject/widgets/_widgets.py (+2/-1) openobject/widgets/templates/form.mako (+32/-1) |
To merge this branch: | bzr merge lp:~jfb-tempo-consulting/unifield-web/us-1519 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
UniField Reviewer Team | Pending | ||
Review via email: mp+303673@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'addons/openerp/controllers/database.py' |
2 | --- addons/openerp/controllers/database.py 2016-05-09 12:01:47 +0000 |
3 | +++ addons/openerp/controllers/database.py 2016-08-23 11:52:35 +0000 |
4 | @@ -50,20 +50,52 @@ |
5 | except: |
6 | return [] |
7 | |
8 | +class ReplacePasswordField(openobject.widgets.PasswordField): |
9 | + params = { |
10 | + 'autocomplete': 'Autocomplete field', |
11 | + } |
12 | + autocomplete = 'off' |
13 | + replace_for = False |
14 | + |
15 | + def __init__(self, *arg, **kwargs): |
16 | + # disable form default submit action when user hits Enter in the field |
17 | + self.replace_for = kwargs['name'] |
18 | + kwargs['name'] = 'show_%s' % kwargs['name'] |
19 | + kwargs.setdefault('attrs', {}).update({ |
20 | + 'onkeydown': 'if (event.keyCode == 13) replace_pass_submit()', |
21 | + 'class': 'requiredfield', |
22 | + }) |
23 | + super(ReplacePasswordField, self).__init__(*arg, **kwargs) |
24 | + |
25 | + |
26 | class DBForm(openobject.widgets.Form): |
27 | strip_name = True |
28 | |
29 | def __init__(self, *args, **kw): |
30 | super(DBForm, self).__init__(*args, **kw) |
31 | + to_add = [] |
32 | + for field in self.fields: |
33 | + if isinstance(field, ReplacePasswordField): |
34 | + to_add.append(openobject.widgets.HiddenField(name=field.replace_for, attrs={'autocomplete':'off'})) |
35 | + self.replace_password_fields[field.name] = field.replace_for |
36 | + if to_add: |
37 | + self.hidden_fields += to_add |
38 | if self.validator is openobject.validators.DefaultValidator: |
39 | self.validator = openobject.validators.Schema() |
40 | for f in self.fields: |
41 | self.validator.add_field(f.name, f.validator) |
42 | + for add in to_add: |
43 | + self.validator.add_field(add.name, formencode.validators.NotEmpty()) |
44 | |
45 | def update_params(self, params): |
46 | super(DBForm, self).update_params(params) |
47 | params['attrs']['action'] = url(self.action) |
48 | |
49 | + def error_for(self, item, error): |
50 | + if error and isinstance(item, ReplacePasswordField): |
51 | + return error.error_dict.get(item.replace_for) |
52 | + return super(DBForm, self).error_for(item, error) |
53 | + |
54 | class FormCreate(DBForm): |
55 | name = "create" |
56 | string = _('Create database') |
57 | @@ -71,31 +103,37 @@ |
58 | submit_text = _('Create') |
59 | strip_name = True |
60 | form_attrs = {'onsubmit': 'return on_create()'} |
61 | - fields = [openobject.widgets.PasswordField(name='password', label=_('Super admin password:'), validator=formencode.validators.NotEmpty(), help=_("This is the password of the user that have the rights to administer databases. This is not a OpenERP user, just a super administrator.")), |
62 | - openobject.widgets.TextField(name='dbname', label=_('New database name:'), validator=formencode.validators.NotEmpty(), help=_("Choose the name of the database that will be created. The name must not contain any special character. Exemple: 'terp'.")), |
63 | -# openobject.widgets.CheckBox(name='demo_data', label=_('Load Demonstration data:'), default=False, validator=validators.Bool(if_empty=False), help=_("Check this box if you want demonstration data to be installed on your new database. These data will help you to understand OpenERP, with predefined products, partners, etc.")), |
64 | - openobject.widgets.SelectField(name='language', options=get_lang_list, validator=validators.String(), label=_('Default Language:'), help=_("Choose the default language that will be installed for this database. You will be able to install new languages after installation through the administration menu.")), |
65 | - openobject.widgets.PasswordField(name='admin_password', label=_('Administrator password:'), validator=formencode.validators.NotEmpty(), help=_("This is the password of the 'admin' user that will be created in your new database.")), |
66 | - openobject.widgets.PasswordField(name='confirm_password', label=_('Confirm password:'), validator=formencode.validators.NotEmpty(), help=_("This is the password of the 'admin' user that will be created in your new database. It has to be the same than the above field.")) |
67 | - ] |
68 | + fields = [ |
69 | + ReplacePasswordField(name='password', label=_('Super admin password:'), help=_("This is the password of the user that have the rights to administer databases. This is not a OpenERP user, just a super administrator.")), |
70 | + openobject.widgets.TextField(name='dbname', label=_('New database name:'), validator=formencode.validators.NotEmpty(), help=_("Choose the name of the database that will be created. The name must not contain any special character. Exemple: 'terp'.")), |
71 | +# openobject.widgets.CheckBox(name='demo_data', label=_('Load Demonstration data:'), default=False, validator=validators.Bool(if_empty=False), help=_("Check this box if you want demonstration data to be installed on your new database. These data will help you to understand OpenERP, with predefined products, partners, etc.")), |
72 | + openobject.widgets.SelectField(name='language', options=get_lang_list, validator=validators.String(), label=_('Default Language:'), help=_("Choose the default language that will be installed for this database. You will be able to install new languages after installation through the administration menu.")), |
73 | + ReplacePasswordField(name='confirm_password', label=_('Confirm password:'), help=_("This is the password of the 'admin' user that will be created in your new database. It has to be the same than the above field.")), |
74 | + ReplacePasswordField(name='admin_password', label=_('Administrator password:'), help=_("This is the password of the 'admin' user that will be created in your new database.")), |
75 | + ] |
76 | validator = openobject.validators.Schema(chained_validators=[formencode.validators.FieldsMatch("admin_password","confirm_password")]) |
77 | |
78 | + |
79 | class FormDrop(DBForm): |
80 | name = "drop" |
81 | string = _('Drop database') |
82 | action = '/openerp/database/do_drop' |
83 | submit_text = _('Drop') |
84 | form_attrs = {'onsubmit': 'return window.confirm(_("Do you really want to drop the selected database?"))'} |
85 | - fields = [openobject.widgets.SelectField(name='dbname', options=get_db_list, label=_('Database:'), validator=validators.String(not_empty=True)), |
86 | - openobject.widgets.PasswordField(name='password', label=_('Drop password:'), validator=formencode.validators.NotEmpty())] |
87 | + fields = [ |
88 | + openobject.widgets.SelectField(name='dbname', options=get_db_list, label=_('Database:'), validator=validators.String(not_empty=True)), |
89 | + ReplacePasswordField(name='password', label=_('Drop password:')), |
90 | + ] |
91 | |
92 | class FormBackup(DBForm): |
93 | name = "backup" |
94 | string = _('Backup database') |
95 | action = '/openerp/database/do_backup' |
96 | submit_text = _('Backup') |
97 | - fields = [openobject.widgets.SelectField(name='dbname', options=get_db_list, label=_('Database:'), validator=validators.String(not_empty=True)), |
98 | - openobject.widgets.PasswordField(name='password', label=_('Backup password:'), validator=formencode.validators.NotEmpty())] |
99 | + fields = [ |
100 | + openobject.widgets.SelectField(name='dbname', options=get_db_list, label=_('Database:'), validator=validators.String(not_empty=True)), |
101 | + ReplacePasswordField(name='password', label=_('Backup password:')), |
102 | + ] |
103 | |
104 | class FileField(openobject.widgets.FileField): |
105 | def adjust_value(self, value, **params): |
106 | @@ -106,9 +144,12 @@ |
107 | string = _('Restore database') |
108 | action = '/openerp/database/do_restore' |
109 | submit_text = _('Restore') |
110 | - fields = [FileField(name="filename", label=_('File:')), |
111 | - openobject.widgets.PasswordField(name='password', label=_('Restore password:'), validator=formencode.validators.NotEmpty()), |
112 | - openobject.widgets.TextField(name='dbname', label=_('New database name:'), validator=formencode.validators.NotEmpty(), readonly=1, attrs={'readonly': ''})] |
113 | + fields = [ |
114 | + FileField(name="filename", label=_('File:')), |
115 | + ReplacePasswordField(name='password', label=_('Restore password:')), |
116 | + openobject.widgets.TextField(name='dbname', label=_('New database name:'), validator=formencode.validators.NotEmpty(), readonly=1, attrs={'readonly': ''}) |
117 | + ] |
118 | + |
119 | hidden_fields = [openobject.widgets.HiddenField(name='fpath', label=_('Path:'))] |
120 | |
121 | class FormPassword(DBForm): |
122 | @@ -116,10 +157,11 @@ |
123 | string = _('Change Administrator Password') |
124 | action = '/openerp/database/do_password' |
125 | submit_text = _('Change Password') |
126 | - fields = [openobject.widgets.PasswordField(name='old_password', label=_('Old super admin password:'), validator=formencode.validators.NotEmpty()), |
127 | - openobject.widgets.PasswordField(name='new_password', label=_('New super admin password:'), validator=formencode.validators.NotEmpty()), |
128 | - openobject.widgets.PasswordField(name='confirm_password', label=_('Confirm Password:'), validator=formencode.validators.NotEmpty())] |
129 | - |
130 | + fields = [ |
131 | + ReplacePasswordField(name='old_password', label=_('Old super admin password:')), |
132 | + ReplacePasswordField(name='new_password', label=_('New super admin password:')), |
133 | + ReplacePasswordField(name='confirm_password', label=_('Confirm Password:')), |
134 | + ] |
135 | validator = openobject.validators.Schema(chained_validators=[formencode.validators.FieldsMatch("new_password","confirm_password")]) |
136 | |
137 | |
138 | |
139 | === modified file 'addons/openerp/controllers/preferences.py' |
140 | --- addons/openerp/controllers/preferences.py 2015-05-13 15:01:35 +0000 |
141 | +++ addons/openerp/controllers/preferences.py 2016-08-23 11:52:35 +0000 |
142 | @@ -34,9 +34,11 @@ |
143 | class PrefsPassword(database.FormPassword): |
144 | action = "/openerp/pref/password" |
145 | string = _('Change your password') |
146 | - fields = [openobject.widgets.PasswordField(name='old_password', label=_('Old Password:'), validator=formencode.validators.NotEmpty()), |
147 | - openobject.widgets.PasswordField(name='new_password', label=_('New Password:'), validator=formencode.validators.NotEmpty()), |
148 | - openobject.widgets.PasswordField(name='confirm_password', label=_('Confirm Password:'), validator=formencode.validators.NotEmpty())] |
149 | + fields = [ |
150 | + database.ReplacePasswordField(name='old_password', label=_('Old Password:')), |
151 | + database.ReplacePasswordField(name='new_password', label=_('New Password:')), |
152 | + database.ReplacePasswordField(name='confirm_password', label=_('Confirm Password:')), |
153 | + ] |
154 | |
155 | int_pattern = re.compile(r'^\d+$') |
156 | class Preferences(Form): |
157 | |
158 | === modified file 'addons/openerp/controllers/root.py' |
159 | --- addons/openerp/controllers/root.py 2014-01-10 17:12:18 +0000 |
160 | +++ addons/openerp/controllers/root.py 2016-08-23 11:52:35 +0000 |
161 | @@ -150,6 +150,13 @@ |
162 | .get_controller('/openerp/widgets')\ |
163 | .user_home_widgets(ctx)) |
164 | |
165 | + @expose() |
166 | + def do_login(self, *arg, **kw): |
167 | + target = kw.get('target') or '/' |
168 | + if target.startswith('/openerp/do_login'): |
169 | + target = '/' |
170 | + raise redirect(target) |
171 | + |
172 | @expose(allow_json=True) |
173 | @unsecured |
174 | def login(self, db=None, user=None, password=None, style=None, location=None, message=None, **kw): |
175 | |
176 | === modified file 'addons/openerp/controllers/templates/login.mako' |
177 | --- addons/openerp/controllers/templates/login.mako 2016-03-04 16:58:44 +0000 |
178 | +++ addons/openerp/controllers/templates/login.mako 2016-08-23 11:52:35 +0000 |
179 | @@ -12,6 +12,15 @@ |
180 | form.attr('action') + separator + jQuery.param({'next': url})); |
181 | }) |
182 | } |
183 | + function disable_save() { |
184 | + var pass = $("#show_password").val() |
185 | + $("#password").val(pass); |
186 | + $("#show_password").val(false); |
187 | + $("#replace_password").show(); |
188 | + $("#replace_password").val(Array(pass.length+1).join('\u2022')); |
189 | + $("#show_password").remove(); |
190 | + $("#loginform").submit(); |
191 | + } |
192 | </script> |
193 | </%def> |
194 | |
195 | @@ -51,11 +60,15 @@ |
196 | </tr> |
197 | <tr> |
198 | <td class="label"><label for="user">${_("User:")}</label></td> |
199 | - <td style="padding: 3px;"><input type="text" id="user" name="user" class="db_user_pass" value="${user}" autofocus="true"/></td> |
200 | + <td style="padding: 3px;"><input type="text" id="user" name="user" class="db_user_pass" value="${user}" autofocus="true" autocomplete="off"/></td> |
201 | </tr> |
202 | <tr> |
203 | - <td class="label"><label for="password">${_("Password:")}</label></td> |
204 | - <td style="padding: 3px;"><input type="password" value="${password}" id="password" name="password" class="db_user_pass" autocomplete="off"/></td> |
205 | + <td class="label"><label for="show_password">${_("Password:")}</label></td> |
206 | + <td style="padding: 3px;"><input type="password" id="show_password" name="show_password" class="db_user_pass" autocomplete="off" onkeydown = "if (event.keyCode == 13) disable_save()"/> |
207 | + <input id="replace_password" type="text" class="db_user_pass" style="display:none;"/> |
208 | + <input type="hidden" name="password" id="password" /> |
209 | + </td> |
210 | + |
211 | </tr> |
212 | <tr> |
213 | <td></td> |
214 | @@ -64,7 +77,7 @@ |
215 | <button type="button" class="static_boxes" tabindex="-1" onclick="location.href='${py.url('/openerp/database')}'">${_("Databases")} |
216 | </button> |
217 | % endif |
218 | - <button type="submit" class="static_boxes">${_("Login")}</button> |
219 | + <button type="button" class="static_boxes" onclick="disable_save()">${_("Login")}</button> |
220 | </td> |
221 | </tr> |
222 | </table> |
223 | |
224 | === modified file 'addons/openerp/controllers/utils.py' |
225 | --- addons/openerp/controllers/utils.py 2016-07-18 12:51:46 +0000 |
226 | +++ addons/openerp/controllers/utils.py 2016-08-23 11:52:35 +0000 |
227 | @@ -94,7 +94,10 @@ |
228 | info = rpc.session.execute_noauth('common', 'login_message') or '' |
229 | except: |
230 | pass |
231 | - return dict(target=target, url=url, dblist=dblist, db=db, user=user, password=password, |
232 | + do_login_page = '/openerp/do_login' |
233 | + if target != do_login_page: |
234 | + origArgs['target'] = target |
235 | + return dict(target=do_login_page, url=url, dblist=dblist, db=db, user=user, password=password, |
236 | action=action, message=message, origArgs=origArgs, info=info, bad_regional=bad_regional, tz_offset=tz_offset) |
237 | |
238 | def secured(fn): |
239 | |
240 | === modified file 'openobject/widgets/_widgets.py' |
241 | --- openobject/widgets/_widgets.py 2012-10-22 12:24:58 +0000 |
242 | +++ openobject/widgets/_widgets.py 2016-08-23 11:52:35 +0000 |
243 | @@ -226,7 +226,7 @@ |
244 | |
245 | template = "/openobject/widgets/templates/form.mako" |
246 | |
247 | - params = ['action', 'method', 'submit_text'] |
248 | + params = ['action', 'method', 'submit_text', 'replace_password_fields'] |
249 | member_widgets = ['hidden_fields', 'fields'] |
250 | |
251 | hidden_fields = [] |
252 | @@ -236,6 +236,7 @@ |
253 | submit_text = "Submit" |
254 | form_attrs = {} |
255 | form = True |
256 | + replace_password_fields = {} |
257 | |
258 | def __init__(self, name=None, **params): |
259 | super(Form, self).__init__(name, **params) |
260 | |
261 | === modified file 'openobject/widgets/templates/form.mako' |
262 | --- openobject/widgets/templates/form.mako 2010-12-03 06:06:41 +0000 |
263 | +++ openobject/widgets/templates/form.mako 2016-08-23 11:52:35 +0000 |
264 | @@ -32,7 +32,38 @@ |
265 | % endfor |
266 | <tr> |
267 | <td> </td> |
268 | - <td align="right" style="padding: 0px 5px 5px 0px;"><button type="submit" class="static_boxes">${submit_text}</button></td> |
269 | + <td align="right" style="padding: 0px 5px 5px 0px;"> |
270 | + % if not replace_password_fields: |
271 | + <button type="submit" class="static_boxes">${submit_text}</button> |
272 | + % else: |
273 | + <script type="text/javascript"> |
274 | + function replace_pass_submit() { |
275 | + var this_form = false; |
276 | + % for src_field, target_field in replace_password_fields.iteritems(): |
277 | + if (!this_form) { |
278 | + this_form = $("#${target_field}").attr('form'); |
279 | + var result = true; |
280 | + if (this_form.onsubmit) { |
281 | + result = this_form.onsubmit.call(this_form); |
282 | + } |
283 | + if (!result) { |
284 | + return false; |
285 | + } |
286 | + } |
287 | + var ${src_field}_val = $("#${src_field}").val() |
288 | + var fake_${src_field} = jQuery('<input type="text"/>'); |
289 | + fake_${src_field}.addClass($("#${src_field}").attr('class')); |
290 | + fake_${src_field}.val(Array(${src_field}_val.length+1).join('\u2022')); |
291 | + $("#${target_field}").val(${src_field}_val); |
292 | + $("#${src_field}").val(false); |
293 | + $("#${src_field}").replaceWith(fake_${src_field}); |
294 | + % endfor |
295 | + this_form.submit(); |
296 | + } |
297 | + </script> |
298 | + <button type="button" class="static_boxes" onclick="replace_pass_submit()">${submit_text}</button> |
299 | + % endif |
300 | + </td> |
301 | </tr> |
302 | </table> |
303 | </form> |