summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/widgets/database_manager.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/widgets/database_manager.js')
-rw-r--r--addons/web/static/src/js/widgets/database_manager.js217
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;
+
+});