From fff55213b59d4a3ea260b5975ab2b67506e9480b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 21 Jan 2014 16:20:27 +0100 Subject: [PATCH] [IMP] auth_signup converted to server side module bzr revid: fme@openerp.com-20140121152027-7wch4r7dt2ew0did --- addons/auth_signup/__openerp__.py | 1 - addons/auth_signup/controllers/main.py | 120 ++++++----- addons/auth_signup/res_users.py | 3 +- .../auth_signup/static/src/js/auth_signup.js | 189 +----------------- .../static/src/xml/auth_signup.xml | 39 ---- .../auth_signup/views/auth_signup_login.xml | 48 +++-- 6 files changed, 102 insertions(+), 298 deletions(-) delete mode 100644 addons/auth_signup/static/src/xml/auth_signup.xml diff --git a/addons/auth_signup/__openerp__.py b/addons/auth_signup/__openerp__.py index 7318ecfd8ef..50402207018 100644 --- a/addons/auth_signup/__openerp__.py +++ b/addons/auth_signup/__openerp__.py @@ -43,6 +43,5 @@ Allow users to sign up and reset their password 'views/auth_signup_login.xml', ], 'js': ['static/src/js/auth_signup.js'], - 'qweb': ['static/src/xml/auth_signup.xml'], 'bootstrap': True, } diff --git a/addons/auth_signup/controllers/main.py b/addons/auth_signup/controllers/main.py index 7948e737327..4cb8e5b75f0 100644 --- a/addons/auth_signup/controllers/main.py +++ b/addons/auth_signup/controllers/main.py @@ -21,77 +21,71 @@ import logging import openerp +import openerp.addons.web.controllers.main as webmain from openerp import http from openerp.http import request, LazyResponse -from openerp.modules.registry import RegistryManager -from ..res_users import SignupError +from openerp.tools.translate import _ _logger = logging.getLogger(__name__) class Home(openerp.addons.web.controllers.main.Home): - @http.route('/web/login', type='http', auth="none") + @http.route() def web_login(self, *args, **kw): - response = super(Home, self).web_login(*args, **kw) - if isinstance(response, LazyResponse): - config = self.get_auth_signup_config(request.session.db) - response.params['values'].update(config) - if request.params.get('signup', None) and config['signup']: - response.params['template'] = 'auth_signup.signup' - if request.params.get('reset', None) and config['signup']: - response.params['template'] = 'auth_signup.reset' + # TODO: ensure_db() + request.disable_db = False + + mode = request.params.get('mode') + qcontext = request.params.copy() + response = webmain.render_bootstrap_template(request.session.db, 'auth_signup.signup', qcontext, lazy=True) + token = qcontext.get('token', None) + token_infos = None + if token: + try: + # retrieve the user info (name, login or email) corresponding to a signup token + res_partner = request.registry.get('res.partner') + token_infos = res_partner.signup_retrieve_info(request.cr, openerp.SUPERUSER_ID, token) + for k, v in token_infos.items(): + qcontext.setdefault(k, v) + except: + qcontext['error'] = _("Invalid signup token") + response.params['template'] = 'web.login' + return response + + # retrieve the module config (which features are enabled) for the login page + icp = request.registry.get('ir.config_parameter') + config = { + 'signup': icp.get_param(request.cr, openerp.SUPERUSER_ID, 'auth_signup.allow_uninvited') == 'True', + 'reset': icp.get_param(request.cr, openerp.SUPERUSER_ID, 'auth_signup.reset_password') == 'True', + } + qcontext.update(config) + + if 'error' in qcontext or mode not in ('reset', 'signup') or (not token and not config[mode]): + response = super(Home, self).web_login(*args, **kw) + if isinstance(response, LazyResponse): + response.params['values'].update(config) + return response + + if request.httprequest.method == 'GET': + if token_infos: + qcontext.update(token_infos) + else: + res_users = request.registry.get('res.users') + login = request.params.get('login') + if mode == 'reset' and not token: + try: + res_users.reset_password(request.cr, openerp.SUPERUSER_ID, login) + qcontext['message'] = _("An email has been sent with credentials to reset your password") + response.params['template'] = 'web.login' + except: + qcontext['error'] = _("Could not reset your password") + _logger.exception('error when resetting password') + else: + values = {key: qcontext.get(key) for key in ('login', 'name', 'password')} + res_users.signup(request.cr, openerp.SUPERUSER_ID, values, token) + request.cr.commit() + return super(Home, self).web_login(*args, **kw) + return response - def get_auth_signup_config(self, dbname): - """ retrieve the module config (which features are enabled) for the login page """ - registry = RegistryManager.get(dbname) - with registry.cursor() as cr: - icp = registry.get('ir.config_parameter') - config = { - 'signup': icp.get_param(cr, openerp.SUPERUSER_ID, 'auth_signup.allow_uninvited') == 'True', - 'reset_password': icp.get_param(cr, openerp.SUPERUSER_ID, 'auth_signup.reset_password') == 'True', - } - return config - -class Controller(http.Controller): - - @http.route('/auth_signup/retrieve', type='json', auth="none") - def retrieve(self, dbname, token): - """ retrieve the user info (name, login or email) corresponding to a signup token """ - registry = RegistryManager.get(dbname) - with registry.cursor() as cr: - res_partner = registry.get('res.partner') - user_info = res_partner.signup_retrieve_info(cr, openerp.SUPERUSER_ID, token) - return user_info - - @http.route('/auth_signup/signup', type='json', auth="none") - def signup(self, dbname, token, **values): - """ sign up a user (new or existing)""" - try: - self._signup_with_values(dbname, token, values) - except SignupError, e: - return {'error': openerp.tools.exception_to_unicode(e)} - return {} - - def _signup_with_values(self, dbname, token, values): - registry = RegistryManager.get(dbname) - with registry.cursor() as cr: - res_users = registry.get('res.users') - res_users.signup(cr, openerp.SUPERUSER_ID, values, token) - - @http.route('/auth_signup/reset_password', type='json', auth="none") - def reset_password(self, dbname, login): - """ retrieve user, and perform reset password """ - registry = RegistryManager.get(dbname) - with registry.cursor() as cr: - try: - res_users = registry.get('res.users') - res_users.reset_password(cr, openerp.SUPERUSER_ID, login) - cr.commit() - except Exception as e: - # signup error - _logger.exception('error when resetting password') - raise(e) - return True - # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/auth_signup/res_users.py b/addons/auth_signup/res_users.py index 0379cd2c0c1..37ad9f68fe4 100644 --- a/addons/auth_signup/res_users.py +++ b/addons/auth_signup/res_users.py @@ -69,7 +69,8 @@ class res_partner(osv.Model): # the parameters to encode for the query query = dict(db=cr.dbname) signup_type = context.get('signup_force_type_in_url', partner.signup_type or '') - query[signup_type] = 1 + if signup_type: + query['mode'] = signup_type if partner.signup_token and signup_type: query['token'] = partner.signup_token diff --git a/addons/auth_signup/static/src/js/auth_signup.js b/addons/auth_signup/static/src/js/auth_signup.js index b5e6f91b139..a317440fd6b 100644 --- a/addons/auth_signup/static/src/js/auth_signup.js +++ b/addons/auth_signup/static/src/js/auth_signup.js @@ -1,188 +1,19 @@ openerp.auth_signup = function(instance) { - instance.auth_signup = instance.auth_signup || {}; - var _t = instance.web._t; - - return; - - instance.web.Login.include({ - start: function() { + openerp.web.LoginForm.include({ + start: function () { var self = this; - this.signup_enabled = false; - this.reset_password_enabled = false; - return this._super().always(function() { - - // Switches the login box to the select mode whith mode == [default|signup|reset] - self.on('change:login_mode', self, function() { - var mode = self.get('login_mode') || 'default'; - self.$('*[data-modes]').each(function() { - var modes = $(this).data('modes').split(/\s+/); - $(this).toggle(modes.indexOf(mode) > -1); - }); - self.$('a.oe_signup_signup:visible').toggle(self.signup_enabled); - self.$('a.oe_signup_reset_password:visible').toggle(self.reset_password_enabled); - }); - - // to switch between the signup and regular login form - self.$('a.oe_signup_signup').click(function(ev) { - self.set('login_mode', 'signup'); + this.$el.on('submit', function () { + var password = self.get_password_field('password'); + var confirm_password = self.get_password_field('confirm_password'); + if (password && confirm_password && (password.value != confirm_password.value)) { + alert("Passwords do not match; please retype them."); return false; - }); - self.$('a.oe_signup_back').click(function(ev) { - self.set('login_mode', 'default'); - delete self.params.token; - return false; - }); - - var dbname = self.selected_db; - - // if there is an error message in params, show it then forget it - if (self.params.error_message) { - self.show_error(self.params.error_message); - delete self.params.error_message; - } - - if (dbname && self.params.login) { - self.$("form input[name=login]").val(self.params.login); - } - - // bind reset password link - self.$('a.oe_signup_reset_password').click(self.do_reset_password); - - if (dbname) { - self.rpc("/auth_signup/get_config", {dbname: dbname}).then(function(result) { - self.signup_enabled = result.signup; - self.reset_password_enabled = result.reset_password; - if (!self.signup_enabled || self.$("form input[name=login]").val()){ - self.set('login_mode', self.params.type || 'default'); - } else { - self.set('login_mode', 'signup'); - } - - // in case of a signup, retrieve the user information from the token - if (self.params.token) { - self.rpc("/auth_signup/retrieve", {dbname: dbname, token: self.params.token}) - .then(self.on_token_loaded, self.on_token_failed); - } - - }); - } else { - // TODO: support multiple database mode - self.set('login_mode', self.params.type || 'default'); } }); }, - - on_token_loaded: function(result) { - // select the right the database - this.selected_db = result.db; - this.on_db_loaded([result.db]); - if (result.token) { - // switch to signup mode, set user name and login - this.set('login_mode', (this.params.type === 'reset' ? 'reset' : 'signup')); - this.$("form input[name=name]").val(result.name).attr("readonly", "readonly"); - if (result.login) { - this.$("form input[name=login]").val(result.login).attr("readonly", "readonly"); - } else { - this.$("form input[name=login]").val(result.email); - } - } else { - // remain in login mode, set login if present - delete this.params.token; - this.set('login_mode', 'default'); - this.$("form input[name=login]").val(result.login || ""); - } - }, - - on_token_failed: function(result, ev) { - if (ev) { - ev.preventDefault(); - } - this.show_error(_t("Invalid signup token")); - delete this.params.db; - delete this.params.token; - this.set('login_mode', 'default'); - }, - - get_params: function(){ - // signup user (or reset password) - var db = this.$("form [name=db]").val(); - var name = this.$("form input[name=name]").val(); - var login = this.$("form input[name=login]").val(); - var password = this.$("form input[name=password]").val(); - var confirm_password = this.$("form input[name=confirm_password]").val(); - if (!db) { - this.do_warn(_t("Login"), _t("No database selected !")); - return false; - } else if (!name) { - this.do_warn(_t("Login"), _t("Please enter a name.")); - return false; - } else if (!login) { - this.do_warn(_t("Login"), _t("Please enter a username.")); - return false; - } else if (!password || !confirm_password) { - this.do_warn(_t("Login"), _t("Please enter a password and confirm it.")); - return false; - } else if (password !== confirm_password) { - this.do_warn(_t("Login"), _t("Passwords do not match; please retype them.")); - return false; - } - var params = { - dbname : db, - token: this.params.token || "", - name: name, - login: login, - password: password, - }; - return params; - }, - - on_submit: function(ev) { - if (ev) { - ev.preventDefault(); - } - var login_mode = this.get('login_mode'); - if (login_mode === 'signup' || login_mode === 'reset') { - var params = this.get_params(); - if (_.isEmpty(params)){ - return false; - } - var self = this, - super_ = this._super; - this.rpc('/auth_signup/signup', params) - .done(function(result) { - if (result.error) { - self.show_error(result.error); - } else { - super_.apply(self, [ev]); - } - }); - } else { - // regular login - this._super(ev); - } - }, - - do_reset_password: function(ev) { - if (ev) { - ev.preventDefault(); - } - var self = this; - var db = this.$("form [name=db]").val(); - var login = this.$("form input[name=login]").val(); - if (!db) { - this.do_warn(_t("Login"), _t("No database selected !")); - return $.Deferred().reject(); - } else if (!login) { - this.do_warn(_t("Login"), _t("Please enter a username or email address.")); - return $.Deferred().reject(); - } - return self.rpc("/auth_signup/reset_password", { dbname: db, login: login }).done(function(result) { - self.show_error(_t("An email has been sent with credentials to reset your password")); - self.set('login_mode', 'default'); - }).fail(function(result, ev) { - ev.preventDefault(); - self.show_error(result.message); - }); + get_password_field: function (field) { + var selector = 'input[name="' + field + '"][type="password"]:visible'; + return this.$(selector)[0]; }, }); }; diff --git a/addons/auth_signup/static/src/xml/auth_signup.xml b/addons/auth_signup/static/src/xml/auth_signup.xml deleted file mode 100644 index 1c41dbed181..00000000000 --- a/addons/auth_signup/static/src/xml/auth_signup.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - -
  • Name
  • -
  • -
    - -
  • Username
  • -
  • Username (Email)
  • -
    - - this.attr('data-modes', 'default signup reset'); - - -
  • Confirm Password
  • -
  • -
    - -
  • - - - - -
  • -
    - - this.attr('data-modes', 'default'); - -
    - -
    diff --git a/addons/auth_signup/views/auth_signup_login.xml b/addons/auth_signup/views/auth_signup_login.xml index 38aef1e2099..9f5d88eb33a 100644 --- a/addons/auth_signup/views/auth_signup_login.xml +++ b/addons/auth_signup/views/auth_signup_login.xml @@ -5,8 +5,8 @@ @@ -20,40 +20,58 @@ + + +