diff --git a/CHANGELOG b/CHANGELOG index f31321969c..67a958ab5d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Manage custom login process * Add erase on Many2One * Re-position icons on Many2One widget diff --git a/src/sao.js b/src/sao.js index 0eeba0c960..76b181b70b 100644 --- a/src/sao.js +++ b/src/sao.js @@ -206,6 +206,9 @@ var Sao = {}; Sao.i18n.loadJSON(data); }); }; + Sao.i18n.getlang = function() { + return Sao.i18n.getLocale(); + }; Sao.i18n.setlang( (navigator.language || navigator.browserLanguge || diff --git a/src/session.js b/src/session.js index 96373b41be..1fbca7f130 100644 --- a/src/session.js +++ b/src/session.js @@ -18,46 +18,23 @@ get_auth: function() { return btoa(this.login + ':' + this.user_id + ':' + this.session); }, - do_login: function(login, password) { + do_login: function(login, parameters) { var dfd = jQuery.Deferred(); - var timeoutID = Sao.common.processing.show(); - var args = { - 'method': 'common.db.login', - 'params': [login, password] + var func = function(parameters) { + return { + 'method': 'common.db.login', + 'params': [login, parameters, Sao.i18n.getlang()] + }; }; - var ajax_prm = jQuery.ajax({ - 'contentType': 'application/json', - 'data': JSON.stringify(args), - 'dataType': 'json', - 'url': '/' + this.database + '/', - 'type': 'post', - 'complete': [function() { - Sao.common.processing.hide(timeoutID); - }] + new Sao.Login(func).run().then(function(result) { + this.user_id = result[0]; + this.session = result[1]; + dfd.resolve(); + }.bind(this), function() { + this.user_id = null; + this.session = null; + dfd.reject(); }); - - var ajax_success = function(data) { - if (data === null) { - Sao.common.warning.run('', - Sao.i18n.gettext('Unable to reach the server.')); - dfd.reject(); - } else if (data.error) { - Sao.common.error.run(data.error[0], data.error[1]); - dfd.reject(); - } else { - if (!data.result) { - this.user_id = null; - this.session = null; - dfd.reject(); - } else { - this.user_id = data.result[0]; - this.session = data.result[1]; - dfd.resolve(); - } - } - }; - ajax_prm.success(ajax_success.bind(this)); - ajax_prm.error(dfd.reject); return dfd.promise(); }, do_logout: function() { @@ -114,12 +91,6 @@ 'id': 'login-login', 'placeholder': Sao.i18n.gettext('Login') }); - dialog.password_input = jQuery('', { - 'class': 'form-control', - 'type': 'password', - 'id': 'login-password', - 'placeholder': Sao.i18n.gettext('Password') - }); dialog.body.append(jQuery('
', { 'class': 'form-group' }).append(jQuery('', { @@ -135,13 +106,7 @@ 'for': 'login-login' }).append(Sao.i18n.gettext('Login'))) .append(dialog.login_input) - ).append(jQuery('', { - 'class': 'form-group' - }).append(jQuery('', { - 'class': 'control-label', - 'for': 'login-password' - }).append(Sao.i18n.gettext('Password'))) - .append(dialog.password_input)); + ); dialog.button = jQuery('', { 'class': 'btn btn-primary', 'type': 'submit' @@ -164,24 +129,24 @@ var ok_func = function() { var login = dialog.login_input.val(); - var password = dialog.password_input.val(); var database = database || dialog.database_select.val() || dialog.database_input.val(); dialog.modal.find('.has-error').removeClass('has-error'); - if (!(login && password && database)) { + if (!(login && database)) { empty_field().closest('.form-group').addClass('has-error'); return; } dialog.button.focus(); dialog.button.prop('disabled', true); + dialog.modal.modal('hide'); var session = new Sao.Session(database, login); - session.do_login(login, password) + session.do_login(login) .then(function() { dfd.resolve(session); dialog.modal.remove(); }, function() { dialog.button.prop('disabled', false); - dialog.password_input.val(''); + dialog.modal.modal('show'); empty_field().closest('.form-group').addClass('has-error'); empty_field().first().focus(); }); @@ -216,70 +181,88 @@ return dfd.promise(); }; - Sao.Session.password_dialog = function() { - var dialog = new Sao.Dialog(Sao.i18n.gettext('Password'), 'lg'); - dialog.password_input = jQuery('', { - 'class': 'form-control', - 'type': 'password', - 'id': 'password-password', - 'placeholder': Sao.i18n.gettext('Password') - }); - dialog.body.append(jQuery('', { - 'class': 'form-group' - }).append(jQuery('', { - 'for': 'password-password' - }).append(Sao.i18n.gettext('Password'))) - .append(dialog.password_input)); - dialog.button = jQuery('', { - 'class': 'btn btn-primary', - 'type': 'submit' - }).append(Sao.i18n.gettext('OK')).appendTo(dialog.footer); - return dialog; - }; - Sao.Session.renew = function(session) { if (session.prm.state() == 'pending') { return session.prm; } var dfd = jQuery.Deferred(); session.prm = dfd.promise(); - var dialog = Sao.Session.password_dialog(); if (!session.login) { dfd.reject(); return session.prm; } - - var ok_func = function() { - var password = dialog.password_input.val(); - dialog.button.focus(); - dialog.button.prop('disabled', true); - session.do_login(session.login, password) - .then(function() { - dfd.resolve(); - dialog.modal.remove(); - }, function() { - dialog.button.prop('disabled', false); - dialog.password_input.val('').focus(); - }); - }; - - dialog.modal.modal({ - backdrop: false, - keyboard: false - }); - dialog.modal.on('shown.bs.modal', function() { - dialog.password_input.focus(); - }); - dialog.modal.find('form').unbind().submit(function(e) { - ok_func(); - e.preventDefault(); - }); - dialog.modal.modal('show'); + session.do_login(session.login).then(dfd.resolve, dfd.reject); return session.prm; }; Sao.Session.current_session = null; + Sao.Login = Sao.class_(Object, { + init: function(func) { + this.func = func; + }, + run: function(parameters) { + if (parameters === undefined) { + parameters = {}; + } + var dfd = jQuery.Deferred(); + var timeoutID = Sao.common.processing.show(); + var session = Sao.Session.current_session; + var args = { + 'contentType': 'application/json', + 'data': JSON.stringify(this.func(parameters)), + 'dataType': 'json', + 'url': '/' + session.database + '/', + 'type': 'post', + 'complete': [function() { + Sao.common.processing.hide(timeoutID); + }] + }; + if (session.user_id && session.session) { + args.headers = { + 'Authorization': 'Session ' + session.get_auth() + }; + } + var ajax_prm = jQuery.ajax(args); + + var ajax_success = function(data) { + if (data === null) { + Sao.common.warning.run('', + Sao.i18n.gettext('Unable to reach the server.')); + dfd.reject(); + } else if (data.error) { + if (data.error[0].startsWith('403')) { + return this.run({}).then(dfd.resolve, dfd.reject); + } else if (data.error[0] != 'LoginException') { + Sao.common.error.run(data.error[0], data.error[1]); + dfd.reject(); + } else { + var args = data.error[1]; + var name = args[0]; + var message = args[1]; + var type = args[2]; + this['get_' + type](message).then(function(value) { + parameters[name] = value; + return this.run(parameters).then( + dfd.resolve, dfd.reject); + }.bind(this), dfd.reject); + } + } else { + dfd.resolve(data.result); + } + }; + ajax_prm.success(ajax_success.bind(this)); + ajax_prm.error(dfd.reject); + return dfd.promise(); + }, + get_char: function(message) { + return Sao.common.ask.run(message); + }, + get_password: function(message) { + return Sao.common.ask.run(message, false); + }, + }); + Sao.DB = {}; Sao.DB.list = function() { diff --git a/src/window.js b/src/window.js index de32a491ef..179ef293fa 100644 --- a/src/window.js +++ b/src/window.js @@ -629,19 +629,15 @@ .then(function(validate) { if (validate) { var values = jQuery.extend({}, this.screen.get()); - var set_preferences = function(password) { - return this.screen.model.execute( - 'set_preferences', [values, password], {}); - }.bind(this); - if ('password' in values) { - return Sao.common.ask.run( - 'Current Password:', false) - .then(function(password) { - return set_preferences(password); - }); - } else { - return set_preferences(false); - } + var context = jQuery.extend({}, + Sao.Session.current_session.context); + var func = function(parameters) { + return { + 'method': 'model.res.user.set_preferences', + 'params': [values, parameters, context] + }; + }; + return new Sao.Login(func).run(); } }.bind(this)); }