diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 894faec7e51..911f42575d0 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -37,7 +37,6 @@ from openerp.tools import topological_sort from openerp.tools.translate import _ from openerp.tools import ustr from openerp import http - from openerp.http import request, serialize_exception as _serialize_exception from openerp.exceptions import AccessError @@ -679,118 +678,93 @@ class Proxy(http.Controller): class Database(http.Controller): - @http.route('/web/database/selector', type='http', auth="none") - def selector(self, **kw): + def _render_template(self, **d): + d.setdefault('manage',True) + d['insecure'] = openerp.tools.config['admin_passwd'] == 'admin' + d['list_db'] = openerp.tools.config['list_db'] + d['langs'] = openerp.service.db.exp_list_lang() + # databases list + d['databases'] = [] try: - dbs = http.db_list() - if not dbs: - return http.local_redirect('/web/database/manager') - except openerp.exceptions.AccessDenied: - dbs = False - return env.get_template("database_selector.html").render({ - 'databases': dbs, - 'debug': request.debug, - 'error': kw.get('error') - }) - - @http.route('/web/database/manager', type='http', auth="none") - def manager(self, **kw): - # TODO: migrate the webclient's database manager to server side views - request.session.logout() - return env.get_template("database_manager.html").render({ - 'modules': simplejson.dumps(module_boot()), - }) - - @http.route('/web/database/get_list', type='json', auth="none") - def get_list(self): - # TODO change js to avoid calling this method if in monodb mode - try: - return http.db_list() + d['databases'] = http.db_list() except openerp.exceptions.AccessDenied: monodb = db_monodb() if monodb: - return [monodb] - raise + d['databases'] = [monodb] + return env.get_template("database_manager.html").render(d) - @http.route('/web/database/create', type='json', auth="none") - def create(self, fields): - params = dict(map(operator.itemgetter('name', 'value'), fields)) - db_created = request.session.proxy("db").create_database( - params['super_admin_pwd'], - params['db_name'], - bool(params.get('demo_data')), - params['db_lang'], - params['create_admin_pwd']) - if db_created: - request.session.authenticate(params['db_name'], 'admin', params['create_admin_pwd']) - return db_created + @http.route('/web/database/selector', type='http', auth="none") + def selector(self, **kw): + return self._render_template(manage=False) - @http.route('/web/database/duplicate', type='json', auth="none") - def duplicate(self, fields): - params = dict(map(operator.itemgetter('name', 'value'), fields)) - duplicate_attrs = ( - params['super_admin_pwd'], - params['db_original_name'], - params['db_name'], - ) - - return request.session.proxy("db").duplicate_database(*duplicate_attrs) - - @http.route('/web/database/drop', type='json', auth="none") - def drop(self, fields): - password, db = operator.itemgetter( - 'drop_pwd', 'drop_db')( - dict(map(operator.itemgetter('name', 'value'), fields))) + @http.route('/web/database/manager', type='http', auth="none") + def manager(self, **kw): + return self._render_template() + @http.route('/web/database/create', type='http', auth="none") + def create(self, master_pwd, name, lang, password, **post): try: - if request.session.proxy("db").drop(password, db): - return True - else: - return False - except openerp.exceptions.AccessDenied: - return {'error': 'AccessDenied', 'title': 'Drop Database'} - except Exception: - return {'error': _('Could not drop database !'), 'title': _('Drop Database')} + request.session.proxy("db").create_database(master_pwd, name, bool(post.get('demo')), lang, password) + request.session.authenticate(name, login, password) + return http.local_redirect('/web/') + except Exception, e: + error = "Database creation error: %s" % e + return self._render_template(error=error) + + @http.route('/web/database/duplicate', type='http', auth="none") + def duplicate(self, master_pwd, name, new_name): + try: + request.session.proxy("db").duplicate_database(master_pwd, name, new_name) + return http.local_redirect('/web/database/manager') + except Exception, e: + error = "Database duplication error: %s" % e + return self._render_template(error=error) + + @http.route('/web/database/drop', type='http', auth="none") + def drop(self, master_pwd, name): + try: + request.session.proxy("db").drop(master_pwd, name) + return http.local_redirect('/web/database/manager') + except Exception, e: + error = "Database deletion error: %s" % e + return self._render_template(error=error) @http.route('/web/database/backup', type='http', auth="none") - def backup(self, backup_db, backup_pwd, token, backup_format='zip'): + def backup(self, master_pwd, name, backup_format = 'zip'): try: - openerp.service.security.check_super(backup_pwd) + openerp.service.db.check_super(master_pwd) ts = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H-%M-%S") - filename = "%s_%s.%s" % (backup_db, ts, backup_format) + filename = "%s_%s.%s" % (name, ts, backup_format) headers = [ ('Content-Type', 'application/octet-stream; charset=binary'), ('Content-Disposition', content_disposition(filename)), ] - dump_stream = openerp.service.db.dump_db(backup_db, None, backup_format) + dump_stream = openerp.service.db.dump_db(name, None, backup_format) response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True) - response.set_cookie('fileToken', token) return response except Exception, e: _logger.exception('Database.backup') - return simplejson.dumps([[],[{'error': openerp.tools.ustr(e), 'title': _('Backup Database')}]]) + error = "Database backup error: %s" % e + return self._render_template(error=error) @http.route('/web/database/restore', type='http', auth="none") - def restore(self, db_file, restore_pwd, new_db, mode): + def restore(self, master_pwd, backup_file, name, copy=False): try: - copy = mode == 'copy' - data = base64.b64encode(db_file.read()) - request.session.proxy("db").restore(restore_pwd, new_db, data, copy) - return '' - except openerp.exceptions.AccessDenied, e: - raise Exception("AccessDenied") + data = base64.b64encode(backup_file.read()) + request.session.proxy("db").restore(master_pwd, name, data, copy) + return http.local_redirect('/web/database/manager') + except Exception, e: + error = "Database restore error: %s" % e + return self._render_template(error=error) - @http.route('/web/database/change_password', type='json', auth="none") - def change_password(self, fields): - old_password, new_password = operator.itemgetter( - 'old_pwd', 'new_pwd')( - dict(map(operator.itemgetter('name', 'value'), fields))) + @http.route('/web/database/change_password', type='http', auth="none") + def change_password(self, master_pwd, master_pwd_new): try: - return request.session.proxy("db").change_admin_password(old_password, new_password) - except openerp.exceptions.AccessDenied: - return {'error': 'AccessDenied', 'title': _('Change Password')} - except Exception: - return {'error': _('Error, password not changed !'), 'title': _('Change Password')} + request.session.proxy("db").change_admin_password(master_pwd, master_pwd_new) + return http.local_redirect('/web/database/manager') + except Exception, e: + error = "Master password update error: %s" % e + return self._render_template(error=error) class Session(http.Controller): diff --git a/addons/web/static/src/img/logo_inverse_white_206px.png b/addons/web/static/src/img/logo_inverse_white_206px.png new file mode 100644 index 00000000000..528d485f2fa Binary files /dev/null and b/addons/web/static/src/img/logo_inverse_white_206px.png differ diff --git a/addons/web/static/src/js/widgets/database_manager.js b/addons/web/static/src/js/widgets/database_manager.js deleted file mode 100644 index cbffa5117dc..00000000000 --- a/addons/web/static/src/js/widgets/database_manager.js +++ /dev/null @@ -1,215 +0,0 @@ -odoo.define('web.DatabaseManager', 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, - $content: $('