From 21aab96e41a9b772f07cae3a9dbb8e76bf8b7b60 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 2 Aug 2011 11:13:44 +0200 Subject: [PATCH] [IMP] deduplicate display of error dialog, add some error handling improvements to restore db bzr revid: xmo@openerp.com-20110802091344-3lk1wk7ctjhs0j3p --- addons/base/controllers/main.py | 13 +--- addons/base/static/src/js/chrome.js | 114 +++++++++++++++------------- 2 files changed, 66 insertions(+), 61 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 25763a42537..b743cf79122 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -212,20 +212,15 @@ class Database(openerpweb.Controller): @openerpweb.httprequest def restore_db(self, req, db_file, restore_pwd, new_db): - response = None try: data = base64.encodestring(db_file.file.read()) - response = simplejson.dumps( - req.session.proxy("db").restore(restore_pwd, new_db, data)) + req.session.proxy("db").restore(restore_pwd, new_db, data) + return '' except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': - response = simplejson.dumps({'error': e.faultCode, 'title': 'Restore Database'}) - if not response: - response = simplejson.dumps({'error': 'Could not restore database !', 'title': 'Restore Database'}) + raise cherrypy.HTTPError(403) - cherrypy.response.headers['Content-Type'] = 'application/json' - cherrypy.response.headers['Content-Length'] = len(response) - return response + raise cherrypy.HTTPError() @openerpweb.jsonrequest def change_password_db(self, req, fields): diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 8ed5e114ea1..ae8ee5afb36 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -776,6 +776,25 @@ openerp.base.Database = openerp.base.Controller.extend({ }); }); }, + /** + * Displays an error dialog resulting from the various RPC communications + * failing over themselves + * + * @param {Object} error error description + * @param {String} error.title title of the error dialog + * @param {String} error.error message of the error dialog + */ + display_error: function (error) { + return $('
').dialog({ + modal: true, + title: error.title, + buttons: { + Ok: function() { + $(this).dialog("close"); + } + } + }).html(error.error); + }, do_db_create: function() { var self = this; self.$option_id.html(QWeb.render("CreateDB", self)); @@ -785,27 +804,18 @@ openerp.base.Database = openerp.base.Controller.extend({ var fields = $(form).serializeArray(); $.blockUI(); self.rpc("/base/database/create_db", {'fields': fields}, function(result) { - if (!result.error) { - self.db_list.push(self.to_object(fields)['db_name']); - self.db_list.sort(); - var form_obj = self.to_object(fields); - self.wait_for_newdb( - result, { - password: form_obj['super_admin_pwd'], - db: form_obj['db_name'] - }); - } else { + if (result.error) { $.unblockUI(); - $('
').dialog({ - modal: true, - title: result.title, - buttons: { - Ok: function() { - $(this).dialog("close"); - } - } - }).html(result.error); + self.display_error(result); + return; } + self.db_list.push(self.to_object(fields)['db_name']); + self.db_list.sort(); + var form_obj = self.to_object(fields); + self.wait_for_newdb(result, { + password: form_obj['super_admin_pwd'], + db: form_obj['db_name'] + }); }); } }); @@ -826,22 +836,13 @@ openerp.base.Database = openerp.base.Controller.extend({ return; } self.rpc("/base/database/drop_db", {'fields': fields}, function(result) { - if (! result.error) { - $db_list.find(':selected').remove(); - self.db_list.splice( - _.indexOf(self.db_list, db, true), 1); - self.notification.notify("Dropping database", "The database '" + db + "' has been dropped"); - } else { - $('
').dialog({ - modal: true, - title: result.title, - buttons: { - Ok: function() { - $(this).dialog("close"); - } - } - }).html(result.error); + if (result.error) { + self.display_error(result); + return; } + $db_list.find(':selected').remove(); + self.db_list.splice(_.indexOf(self.db_list, db, true), 1); + self.notification.notify("Dropping database", "The database '" + db + "' has been dropped"); }); } }); @@ -906,11 +907,28 @@ openerp.base.Database = openerp.base.Controller.extend({ $(form).ajaxSubmit({ url: '/base/database/restore_db', type: 'POST', - dataType: 'json', resetForm: true, - success: function () { + success: function (body) { // TODO: ui manipulations - // note: response objects don't work + // note: response objects don't work, but we have the + // HTTP body of the response~~ + + // If empty body, everything went fine + if (!body) { return; } + + if (body.indexOf('403 Forbidden') !== -1) { + self.display_error({ + title: 'Access Denied', + error: 'Incorrect super-administrator password' + }) + } else { + self.display_error({ + title: 'Restore Database', + error: 'Could not restore the database' + }) + } + }, + complete: function () { $.unblockUI(); } }); @@ -932,22 +950,14 @@ openerp.base.Database = openerp.base.Controller.extend({ } }, submitHandler: function (form) { - var fields = $(form).serializeArray(); - - self.rpc("/base/database/change_password_db", {'fields': fields}, function(result) { - if (!result.error) { - self.notification.notify("Changed Password", "Password has been changed successfully"); - } else { - $('
').dialog({ - modal: true, - title: result.title, - buttons: { - Ok: function() { - $(this).dialog("close"); - } - } - }).html(result.error); + self.rpc("/base/database/change_password_db", { + 'fields': $(form).serializeArray() + }, function(result) { + if (result.error) { + self.display_error(result); + return; } + self.notification.notify("Changed Password", "Password has been changed successfully"); }); } });