diff options
Diffstat (limited to 'addons/web/static/src/js/widgets/database_manager.js')
| -rw-r--r-- | addons/web/static/src/js/widgets/database_manager.js | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/addons/web/static/src/js/widgets/database_manager.js b/addons/web/static/src/js/widgets/database_manager.js new file mode 100644 index 00000000000..9bd5b4d05c3 --- /dev/null +++ b/addons/web/static/src/js/widgets/database_manager.js @@ -0,0 +1,217 @@ +odoo.define('web.DatabaseManager', ['web.core', 'web.Dialog', 'web.framework', 'web.web_client', 'web.Widget'], function (require) { +"use strict"; + +var core = require('web.core'); +var Dialog = require('web.Dialog'); +var framework = require('web.framework'); +var Widget = require('web.Widget'); + +var _t = core._t; +var QWeb = core.qweb; + +var DataBaseManager = Widget.extend({ + init: function(parent) { + this._super(parent); + $.validator.addMethod('matches', function (s, _, re) { + return new RegExp(re).test(s); + }, _t("Invalid database name")); + }, + start: function() { + var self = this; + $('.oe_secondary_menus_container,.oe_user_menu_placeholder').empty(); + var fetch_db = this.rpc("/web/database/get_list", {}).then( + function(result) { + self.db_list = result; + }, + function (_, ev) { + ev.preventDefault(); + self.db_list = null; + }); + var fetch_langs = this.rpc("/web/session/get_lang_list", {}).done(function(result) { + self.lang_list = result; + }); + return $.when(fetch_db, fetch_langs).always(self.do_render); + }, + do_render: function() { + var self = this; + core.bus.trigger('web_client_toggle_bars', true); + self.$el.html(QWeb.render("DatabaseManager", { widget : self })); + $('.oe_user_menu_placeholder').append(QWeb.render("DatabaseManager.user_menu",{ widget : self })); + $('.oe_secondary_menus_container').append(QWeb.render("DatabaseManager.menu",{ widget : self })); + $('ul.oe_secondary_submenu > li:first').addClass('active'); + $('ul.oe_secondary_submenu > li').bind('click', function (event) { + var menuitem = $(this); + menuitem.addClass('active').siblings().removeClass('active'); + var form_id =menuitem.find('a').attr('href'); + $(form_id).show().siblings().hide(); + event.preventDefault(); + }); + $('#back-to-login').click(self.do_exit); + self.$el.find("td").addClass("oe_form_group_cell"); + self.$el.find("tr td:first-child").addClass("oe_form_group_cell_label"); + self.$el.find("label").addClass("oe_form_label"); + self.$el.find("form[name=create_db_form]").validate({ submitHandler: self.do_create }); + self.$el.find("form[name=duplicate_db_form]").validate({ submitHandler: self.do_duplicate }); + self.$el.find("form[name=drop_db_form]").validate({ submitHandler: self.do_drop }); + self.$el.find("form[name=backup_db_form]").validate({ submitHandler: self.do_backup }); + self.$el.find("form[name=restore_db_form]").validate({ submitHandler: self.do_restore }); + self.$el.find("form[name=change_pwd_form]").validate({ + messages: { + old_pwd: _t("Please enter your previous password"), + new_pwd: _t("Please enter your new password"), + confirm_pwd: { + required: _t("Please confirm your new password"), + equalTo: _t("The confirmation does not match the password") + } + }, + submitHandler: self.do_change_password + }); + }, + destroy: function () { + this.$el.find('#db-create, #db-drop, #db-backup, #db-restore, #db-change-password, #back-to-login').unbind('click').end().empty(); + this._super(); + }, + /** + * Blocks UI and replaces $.unblockUI by a noop to prevent third parties + * from unblocking the UI + */ + blockUI: function () { + framework.blockUI(); + $.unblockUI = function () {}; + }, + /** + * Reinstates $.unblockUI so third parties can play with blockUI, and + * unblocks the UI + */ + unblockUI: function () { + $.unblockUI = framework.unblockUI; + framework.unblockUI(); + }, + /** + * 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 new Dialog(this, { + size: 'medium', + title: error.title, + buttons: [ + {text: _t("Ok"), click: function() { this.parents('.modal').modal('hide'); }} + ] + }, $('<div>').html(error.error)).open(); + }, + do_create: function(form) { + var fields = $(form).serializeArray(); + this.rpc("/web/database/create", {'fields': fields}).done(function(result) { + if (result) { + framework.redirect('/web'); + } else { + alert("Failed to create database"); + } + }); + }, + do_duplicate: function(form) { + var self = this; + var fields = $(form).serializeArray(); + self.rpc("/web/database/duplicate", {'fields': fields}).then(function(result) { + if (result.error) { + self.display_error(result); + return; + } + self.do_notify(_t("Duplicating database"), _t("The database has been duplicated.")); + self.start(); + }); + }, + do_drop: function(form) { + var self = this; + var $form = $(form), + fields = $form.serializeArray(), + $db_list = $form.find('[name=drop_db]'), + db = $db_list.val(); + if (!db || !confirm(_.str.sprintf(_t("Do you really want to delete the database: %s ?"), db))) { + return; + } + self.rpc("/web/database/drop", {'fields': fields}).done(function(result) { + if (result.error) { + self.display_error(result); + return; + } + self.do_notify(_t("Dropping database"), _.str.sprintf(_t("The database %s has been dropped"), db)); + self.start(); + }); + }, + do_backup: function(form) { + var self = this; + self.blockUI(); + self.session.get_file({ + form: form, + success: function () { + self.do_notify(_t("Backed"), _t("Database backed up successfully")); + }, + error: function(error){ + if (error && error[1]) { + self.display_error(error[1][0]); + } + }, + complete: function() { + self.unblockUI(); + } + }); + }, + do_restore: function(form) { + var self = this; + self.blockUI(); + $(form).ajaxSubmit({ + url: '/web/database/restore', + type: 'POST', + resetForm: true, + success: function (body) { + // If empty body, everything went fine + if (!body) { return; } + + if (body.indexOf('403 Forbidden') !== -1) { + self.display_error({ + title: _t("Access Denied"), + error: _t("Incorrect super-administrator password") + }); + } else { + self.display_error({ + title: _t("Restore Database"), + error: _t("Could not restore the database") + }); + } + }, + complete: function() { + self.unblockUI(); + self.do_notify(_t("Restored"), _t("Database restored successfully")); + } + }); + }, + do_change_password: function(form) { + var self = this; + self.rpc("/web/database/change_password", { + 'fields': $(form).serializeArray() + }).done(function(result) { + if (result.error) { + self.display_error(result); + return; + } + self.unblockUI(); + self.do_notify(_t("Changed Password"), _t("Password has been changed successfully")); + }); + }, + do_exit: function () { + this.$el.remove(); + framework.redirect('/web'); + } +}); + +core.action_registry.add("database_manager", DataBaseManager); + +return DataBaseManager; + +}); |
