[MERGE] web: database manager and login
This commit is contained in:
@@ -9,7 +9,6 @@
|
||||
</template>
|
||||
|
||||
<template id="auth_signup.fields" name="Auth Signup/ResetPassword form fields">
|
||||
<t t-call="web.database_select"/>
|
||||
|
||||
<div class="form-group field-login">
|
||||
<label for="login" class="control-label">Your Email</label>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -511,13 +510,7 @@ class Home(http.Controller):
|
||||
return http.redirect_with_hash(redirect)
|
||||
request.uid = old_uid
|
||||
values['error'] = "Wrong login/password"
|
||||
if request.env.ref('web.login', False):
|
||||
return request.render('web.login', values)
|
||||
else:
|
||||
# probably not an odoo compatible database
|
||||
error = 'Unable to login on database %s' % request.session.db
|
||||
return werkzeug.utils.redirect('/web/database/selector?error=%s' % error, 303)
|
||||
|
||||
return request.render('web.login', values)
|
||||
|
||||
@http.route('/login', type='http', auth="none")
|
||||
def login(self, db, login, key, redirect="/web", **kw):
|
||||
@@ -679,118 +672,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):
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 8.0 KiB |
@@ -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: $('<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;
|
||||
|
||||
});
|
||||
@@ -54,283 +54,6 @@
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-name="DatabaseManager">
|
||||
<div class="oe_view_manager_view_form">
|
||||
<div class="oe_form">
|
||||
<form id="db_create" name="create_db_form" style="display: block;">
|
||||
<div class="oe_view_manager oe_view_manager_current">
|
||||
<div class="oe-control-panel" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Create a New Database</span>
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p class="oe_grey" style="margin: 10px">
|
||||
Fill in this form to create an Odoo database. You can
|
||||
create databases for different companies or for different
|
||||
goals (testing, production). Once the database is created,
|
||||
you will be able to install your first application.
|
||||
</p>
|
||||
<p class="oe_grey" style="margin: 10px">
|
||||
By default, the master password is 'admin'. This password
|
||||
is required to create, delete, dump or restore databases.
|
||||
</p>
|
||||
<table class="db_option_table" style="margin: 10px">
|
||||
<tr>
|
||||
<td><label for="super_admin_pwd">Master password:</label></td>
|
||||
<td>
|
||||
<input type="password" name="super_admin_pwd" class="required" value="admin"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="db_name">Select a database name:</label></td>
|
||||
<td>
|
||||
<input type="text" name="db_name" class="required" matches="^[a-zA-Z0-9][a-zA-Z0-9_-]+$" autofocus="true" placeholder="e.g. mycompany"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="demo_data">Load demonstration data:</label></td>
|
||||
<td class="oe_form_group_cell">
|
||||
<span class="oe_form_field oe_form_field_boolean oe_grey" >
|
||||
<input type="checkbox" name="demo_data" />
|
||||
Check this box to evaluate Odoo.
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="db_lang">Default language:</label></td>
|
||||
<td class="oe_form_field oe_form_field_selection">
|
||||
<select name="db_lang" t-if="widget.lang_list" class="oe_inline">
|
||||
<t t-foreach="widget.lang_list" t-as="lang">
|
||||
<option t-att-value="lang[0]" t-att-selected="lang[0] === 'en_US' ? 'selected' : undefined">
|
||||
<t t-esc="lang[1]" />
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="create_admin_pwd">Choose a password:</label></td>
|
||||
<td><input type="password" name="create_admin_pwd" class="required" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="create_confirm_pwd">Confirm password:</label></td>
|
||||
<td><input type="password" name="create_confirm_pwd" class="required" equalTo="input[name=create_admin_pwd]"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><button type="submit" class="oe_button oe_highlight db_create">Create Database</button></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<form id="db_duplicate" name="duplicate_db_form" style="display: none;">
|
||||
<div class="oe_view_manager oe_view_manager_current">
|
||||
<div class="oe-control-panel" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Duplicate Database</span>
|
||||
</h2>
|
||||
<button type="submit" class="oe_button oe_highlight db_duplicate">Duplicate</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table align="center" class="db_option_table">
|
||||
<tr>
|
||||
<td><label for="super_admin_pwd">Master password:</label></td>
|
||||
<td><input type="password" name="super_admin_pwd" class="required" value="admin" /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="db_original_name">Original database name:</label></td>
|
||||
<td><input type="text" name="db_original_name" class="required" matches="^[a-zA-Z][a-zA-Z0-9_-]+$" autofocus="true"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="db_name">New database name:</label></td>
|
||||
<td><input type="text" name="db_name" class="required" matches="^[a-zA-Z][a-zA-Z0-9_-]+$" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<form id="db_drop" name="drop_db_form" style="display: none; ">
|
||||
<div class="oe_view_manager oe_view_manager_current">
|
||||
<div class="oe-control-panel" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Drop Database</span>
|
||||
</h2>
|
||||
<button type="submit" class="oe_button oe_highlight db_drop">Drop</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table align="center" class="db_option_table">
|
||||
<tr>
|
||||
<td><label for="drop_db">Database:</label></td>
|
||||
<td class="oe_form_field oe_form_field_selection">
|
||||
<select t-if="widget.db_list" name="drop_db" autofocus="autofocus">
|
||||
<t t-foreach="widget.db_list" t-as="db">
|
||||
<option t-att-value="db">
|
||||
<t t-esc="db" />
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
<input t-if="!widget.db_list" name="drop_db" class="required" type="text" autofocus="autofocus"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="drop_password">Master Password:</label></td>
|
||||
<td><input type="password" name="drop_pwd" class="required" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<form id="db_backup" name="backup_db_form" target="backup-target" action="/web/database/backup" style="display: none;">
|
||||
<div class="oe_view_manager oe_view_manager_current">
|
||||
<div class="oe-control-panel" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Backup Database</span>
|
||||
</h2>
|
||||
<button type="submit" class="oe_button oe_highlight db_backup">Backup</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<input type="hidden" name="token" />
|
||||
<table align="center" class="db_option_table">
|
||||
<tr>
|
||||
<td><label for="backup_db">Database:</label></td>
|
||||
<td class="oe_form_field oe_form_field_selection ">
|
||||
<select t-if="widget.db_list" name="backup_db" autofocus="autofocus">
|
||||
<t t-foreach="widget.db_list" t-as="db">
|
||||
<option t-att-value="db">
|
||||
<t t-esc="db" />
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
<input t-if="!widget.db_list" name="backup_db" class="required" type="text" autofocus="autofocus"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="backup_format">Backup format:</label></td>
|
||||
<td class="oe_form_field oe_form_field_selection">
|
||||
<select name="backup_format">
|
||||
<option value="zip">zip (includes filestore)</option>
|
||||
<option value="dump">pg_dump custom format (without filestore)</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><input type="password" name="backup_pwd" class="required" /></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<form id="db_restore" name="restore_db_form" style="display: none; ">
|
||||
<div class="oe_view_manager oe_view_manager_current">
|
||||
<div class="oe-control-panel" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Restore Database</span>
|
||||
</h2>
|
||||
<button type="submit" class="oe_button oe_highlight db_restore">Restore</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table align="center" class="db_option_table">
|
||||
<tr>
|
||||
<td><label for="restore_pwd">Master Password:</label></td>
|
||||
<td><input type="password" name="restore_pwd" class="required" autofocus="autofocus"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="restore_db">File:</label></td>
|
||||
<td><input type="file" name="db_file" class="required"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="new_db">New database name:</label></td>
|
||||
<td><input type="text" name="new_db" class="required"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="mode">Mode:</label></td>
|
||||
<td><select name="mode" class="required">
|
||||
<option value="restore">Backup Restore</option>
|
||||
<option value="copy">Copy of an existing database</option>
|
||||
</select></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
<form id="db_change_password" name="change_pwd_form" style="display: none;">
|
||||
<div class="oe_view_manager oe_view_manager_current">
|
||||
<div class="oe-control-panel" style="padding: 8px;">
|
||||
<div class="oe_header_row">
|
||||
<h2 class="oe_view_title">
|
||||
<span class="oe_view_title_text oe_breadcrumb_title">Change Master Password</span>
|
||||
</h2>
|
||||
<button type="submit" class="oe_button oe_highlight db-change-password">Change Password</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table align="center" class="db_option_table">
|
||||
<tr>
|
||||
<td><label for="old_pwd">Master password:</label></td>
|
||||
<td><input type="password" name="old_pwd" class="required" minlength="1" autofocus="autofocus"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="new_pwd">New master password:</label></td>
|
||||
<td><input type="password" name="new_pwd" class="required" minlength="1"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><label for="confirm_pwd">Confirm new master password:</label></td>
|
||||
<td><input type="password" name="confirm_pwd" class="required" equalTo="input[name=new_pwd]" minlength="1"/> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
<t t-name="DatabaseManager.user_menu">
|
||||
<li>
|
||||
<a id="back-to-login" href="#">Back to Login</a>
|
||||
</li>
|
||||
</t>
|
||||
<t t-name="DatabaseManager.menu">
|
||||
<div class="oe_secondary_menu_section">Database Management</div>
|
||||
<ul class="oe_secondary_submenu nav nav-pills nav-stacked">
|
||||
<li><a href="#db_create">Create</a></li>
|
||||
<li><a href="#db_duplicate">Duplicate</a></li>
|
||||
<li><a href="#db_drop">Drop</a></li>
|
||||
<li><a href="#db_backup">Backup</a></li>
|
||||
<li><a href="#db_restore">Restore</a></li>
|
||||
<li><a href="#db_change_password">Password</a></li>
|
||||
</ul>
|
||||
</t>
|
||||
|
||||
<t t-name="ChangePassword">
|
||||
<form name="change_password_form" method="POST">
|
||||
<div class="oe_form">
|
||||
<table align="center">
|
||||
<tr>
|
||||
<td class="oe_form_group_cell oe_form_group_cell_label"><label for="old_pwd" class="oe_form_label">Old Password:</label></td>
|
||||
<td class="oe_form_group_cell"><input type="password" name="old_pwd"
|
||||
minlength="1" autofocus="autofocus"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="oe_form_group_cell oe_form_group_cell_label"><label for="new_password" class="oe_form_label">New Password:</label></td>
|
||||
<td class="oe_form_group_cell"><input type="password" name="new_password"
|
||||
minlength="1"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="oe_form_group_cell oe_form_group_cell_label"><label for="confirm_pwd" class="oe_form_label">Confirm New Password:</label></td>
|
||||
<td class="oe_form_group_cell"><input type="password" name="confirm_pwd"
|
||||
minlength="1"/></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2" align="right">
|
||||
<button class='oe_button oe_form_button'>Change Password</button>
|
||||
<button type="button" class="oe_button oe_form_button_cancel oe_form_button oe_link" href="javascript:void(0)"><span>Cancel</span></button>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</form>
|
||||
</t>
|
||||
|
||||
<t t-name="Menu.needaction_counter">
|
||||
<div id="menu_counter" class="badge pull-right">
|
||||
<t t-if="widget.needaction_counter > 99"> 99+ </t>
|
||||
|
||||
@@ -1,144 +1,311 @@
|
||||
<!DOCTYPE html>
|
||||
<html style="height: 100%;">
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||
<title>Odoo</title>
|
||||
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon"/>
|
||||
<link rel="stylesheet" href="/web/static/src/css/full.css" />
|
||||
<script src="/web/static/lib/es5-shim/es5-shim.min.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/underscore/underscore.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/underscore.string/lib/underscore.string.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/spinjs/spin.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery/jquery.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery/jquery.browser.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.blockUI/jquery.blockUI.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.hotkeys/jquery.hotkeys.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.placeholder/jquery.placeholder.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.timeago/jquery.timeago.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.form/jquery.form.js" type="text/javascript"></script>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Odoo</title>
|
||||
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css">
|
||||
<script src="/web/static/lib/jquery/jquery.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/bootstrap/js/modal.js"></script>
|
||||
<script src="/web/static/lib/bootstrap/js/tooltip.js"></script>
|
||||
<script src="/web/static/lib/bootstrap/js/dropdown.js"></script>
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
// Little eye
|
||||
$('body').on('mousedown','.o_little_eye',function(ev) {
|
||||
$(ev.target).siblings('input').prop('type','text');
|
||||
});
|
||||
$('body').on('mouseup','.o_little_eye',function(ev) {
|
||||
$(ev.target).siblings('input').prop('type','password');
|
||||
});
|
||||
// db modal
|
||||
$('body').on('click','.o_database_action', function(ev) {
|
||||
ev.preventDefault();
|
||||
var db = $(ev.currentTarget).data('db');
|
||||
var target = $(ev.currentTarget).data('target');
|
||||
$(target).find('input[name=name]').val(db);
|
||||
$(target).modal();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<script src="/web/static/lib/jquery.ba-bbq/jquery.ba-bbq.js" type="text/javascript"></script>
|
||||
{% macro master_input() -%}
|
||||
<div class="form-group">
|
||||
{% if insecure %}
|
||||
<input type="hidden" name="master_pwd" class="form-control" value="admin"/>
|
||||
{% else %}
|
||||
<label for="master_pwd" class="control-label">Master Password</label>
|
||||
<input type="password" name="master_pwd" class="form-control" required="required" autofocus="autofocus"/>
|
||||
{% endif %}
|
||||
</div>
|
||||
{%- endmacro %}
|
||||
|
||||
<script src="/web/static/lib/jquery.validate/jquery.validate.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/autosize/autosize.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.scrollTo/jquery.scrollTo.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.textext/jquery.textext.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/select2/select2.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.ui/jquery-ui.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/jquery.ui.notify/js/jquery.notify.js" type="text/javascript"></script>
|
||||
{% macro create_form() -%}
|
||||
<p>Fill in this form to create an Odoo database. You may create
|
||||
databases for different companies or for different goals (testing,
|
||||
production). Once the database is created, you will be able to
|
||||
install your first application.</p>
|
||||
{{ master_input() }}
|
||||
<div class="form-group">
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<label for="name" class="control-label">Database Name</label>
|
||||
<input type="text" name="name" class="form-control" required="required" autocomplete="off"/>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label for="name" class="control-label">Language</label>
|
||||
<select name="lang" class="form-control" required="required" autocomplete="off">
|
||||
{% for lang in langs %}
|
||||
<option {% if lang[0] == "en_US" %}selected="selected" {% endif %}value="{{ lang[0] }}">{{ lang[1] }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group has-feedback">
|
||||
<label for="password" class="control-label">Password of <em>admin</em> user</label>
|
||||
<input type="password" name="password" class="form-control" required="required" autocomplete="off"/>
|
||||
<span class="fa fa-eye o_little_eye form-control-feedback" aria-hidden="true" style="cursor: pointer; pointer-events: auto"></span>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input name="demo" type="checkbox" class="pull-right" value="1">
|
||||
<span>Load demonstration data</span>
|
||||
<span class="text-muted"> (Check this box to evaluate Odoo)</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
{%- endmacro %}
|
||||
|
||||
<link rel="stylesheet" href='/website/static/src/less/import_bootstrap.less'/>
|
||||
<link rel="stylesheet" href="/web/static/src/less/enterprise_compatibility.less"/>
|
||||
<link rel="stylesheet" href="/web/static/src/less/utils.less"/>
|
||||
<script src="/web/static/lib/bootstrap/js/modal.js"></script>
|
||||
<script src="/web/static/lib/bootstrap/js/tooltip.js"></script>
|
||||
|
||||
<script src="/web/static/lib/backbone/backbone.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/qweb/qweb2.js" type="text/javascript"></script>
|
||||
<script src="/web/static/lib/py.js/lib/py.js" type="text/javascript"></script>
|
||||
<body class="container">
|
||||
|
||||
<script type="text/javascript" src="/web/static/src/js/boot.js"></script>
|
||||
<script type="text/javascript">
|
||||
odoo._modules = ['web', 'web_kanban'];
|
||||
</script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/class.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/translation.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/ajax.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/time.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/mixins.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/widget.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/registry.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/session.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/model.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/utils.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/core.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/formats.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/view.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/pyeval.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/data.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/data_model.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/misc.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/session_instance.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/crash_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/action_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/control_panel.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/view_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/web_client.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/data_export.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/date_picker.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/database_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/loading.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/notification.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/sidebar.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/systray_menu.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/user_menu.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/dialog.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/menu.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/list_common.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/list_view.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/form_view.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/form_common.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/search_view.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/search_filters.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/search_inputs.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/views/search_menus.js"></script>
|
||||
|
||||
<script type="text/javascript" src="/web/static/lib/moment/moment.js"></script>
|
||||
<script type="text/javascript" src="/web/static/lib/bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js"></script>
|
||||
<link rel="stylesheet" href="/web/static/lib/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css"/>
|
||||
<link href="/web/static/lib/fontawesome/css/font-awesome.css" rel="stylesheet"/>
|
||||
<link href="/web/static/lib/jquery.textext/jquery.textext.css" rel="stylesheet"/>
|
||||
<link href="/web/static/lib/select2/select2.css" rel="stylesheet"/>
|
||||
<link href="/web/static/lib/jquery.ui/jquery-ui.css" rel="stylesheet"/>
|
||||
<link href="/web/static/lib/jquery.ui.notify/css/ui.notify.css" rel="stylesheet"/>
|
||||
<link href="/web/static/lib/bootstrap/css/bootstrap.css" rel="stylesheet"/>
|
||||
<link href="/web/static/src/css/base.css" rel="stylesheet"/>
|
||||
<link href="/web/static/src/css/data_export.css" rel="stylesheet"/>
|
||||
<link href="/base/static/src/css/modules.css" rel="stylesheet"/>
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
odoo.define('web.web_client', function (require) {
|
||||
var WebClient = require('web.WebClient');
|
||||
var web_client = new WebClient(null, {action: 'database_manager'});
|
||||
web_client.setElement($(document.body));
|
||||
web_client.start();
|
||||
return web_client;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<nav id="oe_main_menu_navbar" class="navbar navbar-inverse" role="navigation">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse" id="oe_main_menu_placeholder">
|
||||
<ul class="nav navbar-nav navbar-right oe_user_menu_placeholder"></ul>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="openerp openerp_webclient_container oe_webclient">
|
||||
<div class="oe_leftbar">
|
||||
<a class="oe_logo">
|
||||
<span class="oe_logo_edit">Edit Company data</span>
|
||||
<img src='/web/binary/company_logo'/>
|
||||
</a>
|
||||
<div class="oe_secondary_menus_container"></div>
|
||||
<div class="oe_footer">
|
||||
Powered by <a href="http://www.odoo.com" target="_blank"><span>Odoo</span></a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="oe_application">
|
||||
<!-- Database List -->
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-md-offset-3 o_database_list">
|
||||
<div class="text-center">
|
||||
<img src="/web/static/src/img/logo2.png" class="img-responsive center-block"/>
|
||||
</div>
|
||||
{% if insecure and databases %}
|
||||
<div class="alert alert-warning">
|
||||
Warning, your Odoo database manager is not protected.
|
||||
Please <a href="#" data-toggle="modal" data-target=".o_database_master">set a master password</a>
|
||||
to secure it.
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if error %}
|
||||
<div class="alert alert-danger">{{ error }}</div>
|
||||
{% endif %}
|
||||
{% if databases %}
|
||||
<div class="list-group">
|
||||
{% for db in databases %}
|
||||
<a href="/web?db={{ db }}" class="list-group-item">
|
||||
{{ db }}
|
||||
{% if manage %}
|
||||
<div class="text-right pull-right">
|
||||
<span data-db="{{ db }}" data-target=".o_database_backup" class="o_database_action btn-link"><i class="fa fa-floppy-o fa-fw"></i> Backup</span>
|
||||
<span data-db="{{ db }}" data-target=".o_database_duplicate" class="o_database_action btn-link"><i class="fa fa-files-o fa-fw"></i> Duplicate</span>
|
||||
<span data-db="{{ db }}" data-target=".o_database_delete" class="o_database_action btn-link"><i class="fa fa-trash-o fa-fw"></i> Delete</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if manage %}
|
||||
<div class="text-left">
|
||||
<button type="button" data-toggle="modal" data-target=".o_database_create" class="btn btn-sm btn-primary">
|
||||
Create Database
|
||||
</button>
|
||||
<button type="button" data-toggle="modal" data-target=".o_database_restore" class="btn btn-sm btn-primary">
|
||||
Restore Database
|
||||
</button>
|
||||
<button type="button" data-toggle="modal" data-target=".o_database_master" class="btn btn-sm btn-primary">
|
||||
Set Master Password
|
||||
</button>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="text-center">
|
||||
<a href="/web/database/manager">Manage databases</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<form role="form" action="/web/database/create" method="post">
|
||||
{{ create_form() }}
|
||||
<input type="submit" value="Create database" class="btn btn-primary pull-left"/>
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--[if lte IE 8]>
|
||||
<script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
|
||||
<script>CFInstall.check({mode: "overlay"});</script>
|
||||
<![endif]-->
|
||||
</body>
|
||||
<!-- Create -->
|
||||
<div class="modal fade o_database_create" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form role="form" action="/web/database/create" method="post">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Create Database</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{{ create_form() }}
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="submit" value="Continue" class="btn btn-primary pull-right"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Restore -->
|
||||
<div class="modal fade o_database_restore" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Restore Database</h4>
|
||||
</div>
|
||||
<form id="form_restore_db" role="form" action="/web/database/restore" method="post" enctype="multipart/form-data">
|
||||
<div class="modal-body">
|
||||
{{ master_input() }}
|
||||
<div class="form-group">
|
||||
<label for="backup_file" class="control-label">File</label>
|
||||
<input type="file" name="backup_file" class="required"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="name" class="control-label">Database Name</label>
|
||||
<input type="text" name="name" class="form-control" required="required"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="checkbox">
|
||||
<label>
|
||||
<input name="copy" type="checkbox" class="pull-right" value="1">
|
||||
<span>Generate a new database uuid.</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="submit" value="Continue" class="btn btn-primary pull-right"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Master password -->
|
||||
<div class="modal fade o_database_master" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Set Master Password</h4>
|
||||
</div>
|
||||
<form id="form_change_pwd" role="form" action="/web/database/change_password" method="post">
|
||||
<div class="modal-body">
|
||||
<p>The master password is required to create, delete, dump or restore databases.</p>
|
||||
{{ master_input() }}
|
||||
<div class="form-group has-feedback">
|
||||
<label for="master_pwd_new" class="control-label">New Master Password</label>
|
||||
<input type="password" name="master_pwd_new" class="form-control" required="required" autocomplete="off"/>
|
||||
<span class="fa fa-eye o_little_eye form-control-feedback" aria-hidden="true" style="cursor: pointer; pointer-events: auto"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="submit" value="Continue" class="btn btn-primary pull-right"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Duplicate DB -->
|
||||
<div class="modal fade o_database_duplicate" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Duplicate Database</h4>
|
||||
</div>
|
||||
<form id="form-duplicate-db" role="form" action="/web/database/duplicate" method="post">
|
||||
<div class="modal-body">
|
||||
{{ master_input() }}
|
||||
<div class="form-group">
|
||||
<label for="name" class="control-label">Database Name</label>
|
||||
<input type="text" name="name" class="form-control" required="required" readonly="readonly"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="new_name" class="control-label">New Name</label>
|
||||
<input type="text" name="new_name" class="form-control" required="required"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="submit" value="Continue" class="btn btn-primary pull-right"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Drop DB -->
|
||||
<div class="modal fade o_database_delete" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Delete Database</h4>
|
||||
</div>
|
||||
<form id="form_drop_db" role="form" action="/web/database/drop" method="post">
|
||||
<div class="modal-body">
|
||||
{{ master_input() }}
|
||||
<div class="form-group">
|
||||
<label for="name" class="control-label">Database</label>
|
||||
<input type="text" name="name" class="form-control" required="required" readonly="readonly"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="submit" value="Delete" class="btn btn-primary pull-right"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Backup DB -->
|
||||
<div class="modal fade o_database_backup" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title">Backup Database</h4>
|
||||
</div>
|
||||
<form id="form_backup_db" role="form" action="/web/database/backup" method="post">
|
||||
<div class="modal-body">
|
||||
{{ master_input() }}
|
||||
<div class="form-group">
|
||||
<label for="name" class="control-label">Database Name</label>
|
||||
<input type="text" name="name" class="form-control" required="required" readonly="readonly"/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="backup_format" class="control-label">Backup Format</label>
|
||||
<select name="backup_format" id="backup_format" class="form-control" required="required">
|
||||
<option value="zip">zip (includes filestore)</option>
|
||||
<option value="dump">pg_dump custom format (without filestore)</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<input type="submit" value="Backup" class="btn btn-primary pull-right"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html style="height: 100%">
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||
<title>Odoo</title>
|
||||
<link rel="shortcut icon" href="/web/static/src/img/favicon.ico" type="image/x-icon">
|
||||
<link rel="stylesheet" href="/web/static/src/css/full.css">
|
||||
<link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css">
|
||||
<link rel="stylesheet" href="/web/static/src/css/base.css">
|
||||
<script type="text/javascript">
|
||||
function dbchanged() {
|
||||
document.getElementById('dbselector').submit();
|
||||
}
|
||||
</script>
|
||||
<body class="oe_single_form">
|
||||
|
||||
<div class="oe_single_form_container modal-content">
|
||||
|
||||
<form class="oe_dbselector_form" id="dbselector" role="form" action="/web" method="get">
|
||||
<div class="oe_single_form_logo">
|
||||
<img src="/web/static/src/img/logo2.png"/>
|
||||
</div>
|
||||
|
||||
<hr/>
|
||||
|
||||
{% if error %}
|
||||
<p class="alert alert-danger">
|
||||
{{ error }}
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
<div class="form-group field-db">
|
||||
<label for="db" class="control-label">Select database</label>
|
||||
{% if databases %}
|
||||
<select name="db" id="db" class="form-control" required="required" autofocus="autofocus" onchange="dbchanged()">
|
||||
<option></option>
|
||||
{% for db in databases %}
|
||||
<option value="{{ db }}">{{ db }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% else %}
|
||||
<input type="text" name="db" id="db" class="form-control" required="required" autofocus="autofocus"/>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% if debug %}
|
||||
<input type="hidden" name="debug" value=""/>
|
||||
{% endif %}
|
||||
|
||||
<noscript>
|
||||
<hr/>
|
||||
<input type="submit" value="Continue" class="btn btn-primary pull-right"/>
|
||||
</noscript>
|
||||
|
||||
<div class="oe_single_form_footer">
|
||||
<a class="oe_login_manage_db" href="/web/database/manager{% if debug %}?debug{% endif %}">Manage Databases</a> |
|
||||
<a href="http://www.openerp.com" target="_blank">Powered by <span>OpenERP</span></a>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -121,7 +121,6 @@
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/session_instance.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/framework/crash_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/change_password.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/database_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/debug_manager.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/data_export.js"></script>
|
||||
<script type="text/javascript" src="/web/static/src/js/widgets/date_picker.js"></script>
|
||||
@@ -152,16 +151,6 @@
|
||||
|
||||
</template>
|
||||
|
||||
<template id="web.assets_webclient_manifest">
|
||||
<!-- This bundle can be used for module manifest asset declaration backward compatibility -->
|
||||
<t t-foreach="manifest_list('css')" t-as="css_file">
|
||||
<link rel="stylesheet" t-att-href="css_file"/>
|
||||
</t>
|
||||
<t t-foreach="manifest_list('js')" t-as="js_file">
|
||||
<script type="text/javascript" t-att-src="js_file"></script>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.layout" name="Web layout"><!DOCTYPE html>
|
||||
<html style="height: 100%">
|
||||
<head>
|
||||
@@ -178,6 +167,73 @@
|
||||
</html>
|
||||
</template>
|
||||
|
||||
<template id="web.login_layout" name="Login Layout">
|
||||
<t t-call="web.layout">
|
||||
<t t-set="head">
|
||||
<link rel="stylesheet" href="/web/static/lib/bootstrap/css/bootstrap.css"/>
|
||||
<link rel="stylesheet" href="/web/static/lib/fontawesome/css/font-awesome.css"/>
|
||||
<script src="/web/static/lib/jquery/jquery.js" type="text/javascript"/>
|
||||
</t>
|
||||
<t t-set="body_classname" t-value="'container'"/>
|
||||
<div class="row">
|
||||
<div class="col-md-6 col-md-offset-3 o_database_list">
|
||||
<div class="text-center">
|
||||
<img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}"/>
|
||||
</div>
|
||||
<t t-raw="0"/>
|
||||
<div class="text-center" t-if="not disable_footer">
|
||||
<t t-if="not disable_database_manager">
|
||||
<a class="" href="/web/database/manager">Manage Databases</a> |
|
||||
</t>
|
||||
<a href="https://www.odoo.com" target="_blank">Powered by <span>Odoo</span></a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.login" name="Login">
|
||||
<t t-call="web.login_layout">
|
||||
|
||||
<form class="oe_login_form" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post" onsubmit="this.action = this.action + location.hash">
|
||||
|
||||
<div class="form-group field-db" t-if="databases and len(databases) > 1">
|
||||
<label for="db" class="control-label">Database</label>
|
||||
<div class="input-group">
|
||||
<input type="text" name="db" t-att-value="request.db" id="db" class="form-control" required="required" readonly="readonly"/>
|
||||
<span class="input-group-btn">
|
||||
<a href="/web/database/selector" class="btn btn-default">Select <i class="fa fa-database"></i></a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group field-login">
|
||||
<label for="login" class="control-label">Email</label>
|
||||
<input type="text" name="login" t-att-value="login" id="login" class="form-control" required="required" autofocus="autofocus"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group field-password">
|
||||
<label for="password" class="control-label">Password</label>
|
||||
<input type="password" name="password" id="password" class="form-control" required="required" t-att-autofocus="'autofocus' if login else None"/>
|
||||
</div>
|
||||
|
||||
<p class="alert alert-danger" t-if="error">
|
||||
<t t-esc="error"/>
|
||||
</p>
|
||||
<p class="alert alert-success" t-if="message">
|
||||
<t t-esc="message"/>
|
||||
</p>
|
||||
|
||||
<input type="hidden" name="redirect" t-att-value="redirect"/>
|
||||
<div class="clearfix oe_login_buttons">
|
||||
<button type="submit" class="btn btn-primary">Log in</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.menu">
|
||||
<ul class="nav navbar-nav navbar-left oe_application_menu_placeholder" style="display: none;">
|
||||
<li t-foreach="menu_data['children']" t-as="menu">
|
||||
@@ -279,82 +335,6 @@
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.login_layout" name="Login Layout">
|
||||
<t t-call="web.layout">
|
||||
<t t-set="head">
|
||||
<link href="/web/static/src/css/base.css" rel="stylesheet"/>
|
||||
<link rel="stylesheet" href='/website/static/src/less/import_bootstrap.less'/>
|
||||
</t>
|
||||
<t t-set="body_classname" t-value="'oe_single_form'"/>
|
||||
<div class="oe_single_form_container modal-content">
|
||||
<div class="oe_single_form_logo">
|
||||
<img t-attf-src="/web/binary/company_logo{{ '?dbname='+db if db else '' }}"/>
|
||||
</div>
|
||||
<hr/>
|
||||
<t t-raw="0"/>
|
||||
|
||||
<div class="oe_single_form_footer" t-if="not disable_footer">
|
||||
<t t-if="not disable_database_manager">
|
||||
<a class="oe_login_manage_db" t-attf-href="/web/database/manager{{ '?debug' if debug else '' }}">Manage Databases</a>
|
||||
<span class="oe_footer_seperator"> | </span>
|
||||
</t>
|
||||
<a href="https://www.odoo.com" target="_blank">Powered by <span>Odoo</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.database_select" name="Database select widget">
|
||||
<script type="text/javascript">
|
||||
function dbchanged(db) {
|
||||
document.location = "/web/login?<t t-if="debug">debug&</t>db=" + db;
|
||||
}
|
||||
</script>
|
||||
<div class="form-group field-db" t-if="databases and len(databases) > 1">
|
||||
<label for="db" class="control-label">Database</label>
|
||||
<select name="db" id="db" class="form-control" required="required" t-att-autofocus="'autofocus' if request.db not in databases else None" onchange="dbchanged(this.value)">
|
||||
<option></option>
|
||||
<t t-foreach="databases" t-as="db">
|
||||
<option t-att-selected="'selected' if db == request.db else None">
|
||||
<t t-esc="db"/>
|
||||
</option>
|
||||
</t>
|
||||
</select>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template id="web.login" name="Login">
|
||||
<t t-call="web.login_layout">
|
||||
<form class="oe_login_form" role="form" t-attf-action="/web/login{{ '?debug' if debug else '' }}" method="post" onsubmit="this.action = this.action + location.hash">
|
||||
|
||||
<t t-call="web.database_select"/>
|
||||
|
||||
<div class="form-group field-login">
|
||||
<label for="login" class="control-label">Email</label>
|
||||
<input type="text" name="login" t-att-value="login" id="login" class="form-control" required="required" autofocus="autofocus"/>
|
||||
</div>
|
||||
|
||||
<div class="form-group field-password">
|
||||
<label for="password" class="control-label">Password</label>
|
||||
<input type="password" name="password" id="password" class="form-control" required="required" t-att-autofocus="'autofocus' if login else None"/>
|
||||
</div>
|
||||
|
||||
<p class="alert alert-danger" t-if="error">
|
||||
<t t-esc="error"/>
|
||||
</p>
|
||||
<p class="alert alert-success" t-if="message">
|
||||
<t t-esc="message"/>
|
||||
</p>
|
||||
|
||||
<input type="hidden" name="redirect" t-att-value="redirect"/>
|
||||
<div class="clearfix oe_login_buttons">
|
||||
<button type="submit" class="btn btn-primary">Log in</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</t>
|
||||
</template>
|
||||
|
||||
<template id="web.qunit_suite">
|
||||
<!DOCTYPE html>
|
||||
<html style="height: 100%">
|
||||
|
||||
@@ -63,25 +63,4 @@ odoo.define_section('basic section', [], function (test, mock) {
|
||||
});
|
||||
});
|
||||
|
||||
test('JSON-RPC', ['web.DatabaseManager'], function (assert, DatabaseManager) {
|
||||
assert.expect(3);
|
||||
var fetched_dbs = false, fetched_langs = false;
|
||||
mock.add('/web/database/get_list', function () {
|
||||
fetched_dbs = true;
|
||||
return ['foo', 'bar', 'baz'];
|
||||
});
|
||||
mock.add('/web/session/get_lang_list', function () {
|
||||
fetched_langs = true;
|
||||
return [['vo_IS', 'Hopelandic / Vonlenska']];
|
||||
});
|
||||
|
||||
var dbm = new DatabaseManager({});
|
||||
var $fix = $( "#qunit-fixture");
|
||||
|
||||
return dbm.appendTo($fix).then(function () {
|
||||
assert.ok(fetched_dbs, "should have fetched databases");
|
||||
assert.ok(fetched_langs, "should have fetched languages");
|
||||
assert.deepEqual(dbm.db_list, ['foo', 'bar', 'baz']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -677,13 +677,6 @@ class module(osv.osv):
|
||||
self._update_dependencies(cr, uid, mod, terp.get('depends', []))
|
||||
self._update_category(cr, uid, mod, terp.get('category', 'Uncategorized'))
|
||||
|
||||
# Trigger load_addons if new module have been discovered it exists on
|
||||
# wsgi handlers, so they can react accordingly
|
||||
if tuple(res) != (0, 0):
|
||||
for handler in openerp.service.wsgi_server.module_handlers:
|
||||
if hasattr(handler, 'load_addons'):
|
||||
handler.load_addons()
|
||||
|
||||
return res
|
||||
|
||||
def download(self, cr, uid, ids, download=True, context=None):
|
||||
|
||||
+12
-9
@@ -112,8 +112,6 @@ def dispatch_rpc(service_name, method, params):
|
||||
dispatch = openerp.service.model.dispatch
|
||||
elif service_name == 'report':
|
||||
dispatch = openerp.service.report.dispatch
|
||||
else:
|
||||
dispatch = openerp.service.wsgi_server.rpc_handlers.get(service_name)
|
||||
result = dispatch(method, params)
|
||||
|
||||
if rpc_request_flag or rpc_response_flag:
|
||||
@@ -1446,13 +1444,19 @@ class Root(object):
|
||||
try:
|
||||
with openerp.tools.mute_logger('openerp.sql_db'):
|
||||
ir_http = request.registry['ir.http']
|
||||
except (AttributeError, psycopg2.OperationalError):
|
||||
except (AttributeError, psycopg2.OperationalError, psycopg2.ProgrammingError):
|
||||
# psycopg2 error or attribute error while constructing
|
||||
# the registry. That means the database probably does
|
||||
# not exists anymore or the code doesnt match the db.
|
||||
# the registry. That means either
|
||||
# - the database probably does not exists anymore
|
||||
# - the database is corrupted
|
||||
# - the database version doesnt match the server version
|
||||
# Log the user out and fall back to nodb
|
||||
request.session.logout()
|
||||
result = _dispatch_nodb()
|
||||
# If requesting /web this will loop
|
||||
if request.httprequest.path == '/web':
|
||||
result = werkzeug.utils.redirect('/web/database/selector')
|
||||
else:
|
||||
result = _dispatch_nodb()
|
||||
else:
|
||||
result = ir_http._dispatch()
|
||||
openerp.modules.registry.RegistryManager.signal_caches_change(db)
|
||||
@@ -1471,7 +1475,7 @@ class Root(object):
|
||||
return request.registry['ir.http'].routing_map()
|
||||
|
||||
def db_list(force=False, httprequest=None):
|
||||
dbs = dispatch_rpc("db", "list", [force])
|
||||
dbs = openerp.service.db.list_dbs(force)
|
||||
return db_filter(dbs, httprequest=httprequest)
|
||||
|
||||
def db_filter(dbs, httprequest=None):
|
||||
@@ -1621,6 +1625,5 @@ class CommonController(Controller):
|
||||
nsession = root.session_store.new()
|
||||
return nsession.sid
|
||||
|
||||
# register main wsgi handler
|
||||
# main wsgi handler
|
||||
root = Root()
|
||||
openerp.service.wsgi_server.register_wsgi_handler(root)
|
||||
|
||||
@@ -17,14 +17,6 @@ RPC_VERSION_1 = {
|
||||
'protocol_version': 1,
|
||||
}
|
||||
|
||||
def dispatch(method, params):
|
||||
if method not in ['login', 'about', 'timezone_get',
|
||||
'version', 'authenticate', 'set_loglevel']:
|
||||
raise Exception("Method not found: %s" % method)
|
||||
|
||||
fn = globals()['exp_' + method]
|
||||
return fn(*params)
|
||||
|
||||
def exp_login(db, login, password):
|
||||
# TODO: legacy indirection through 'security', should use directly
|
||||
# the res.users model
|
||||
@@ -57,3 +49,11 @@ def exp_set_loglevel(loglevel, logger=None):
|
||||
# TODO Previously, the level was set on the now deprecated
|
||||
# `openerp.netsvc.Logger` class.
|
||||
return True
|
||||
|
||||
def dispatch(method, params):
|
||||
g = globals()
|
||||
exp_method_name = 'exp_' + method
|
||||
if exp_method_name in g:
|
||||
return g[exp_method_name](*params)
|
||||
else:
|
||||
raise Exception("Method not found: %s" % method)
|
||||
|
||||
+48
-31
@@ -21,13 +21,21 @@ import openerp.release
|
||||
import openerp.sql_db
|
||||
import openerp.tools
|
||||
|
||||
import security
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class DatabaseExists(Warning):
|
||||
pass
|
||||
|
||||
#----------------------------------------------------------
|
||||
# Master password required
|
||||
#----------------------------------------------------------
|
||||
|
||||
def check_super(passwd):
|
||||
if passwd == openerp.tools.config['admin_passwd']:
|
||||
return True
|
||||
else:
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
|
||||
# This should be moved to openerp.modules.db, along side initialize().
|
||||
def _initialize_db(id, db_name, demo, lang, user_password):
|
||||
try:
|
||||
@@ -56,22 +64,6 @@ def _initialize_db(id, db_name, demo, lang, user_password):
|
||||
except Exception, e:
|
||||
_logger.exception('CREATE DATABASE failed:')
|
||||
|
||||
def dispatch(method, params):
|
||||
if method in ['create', 'get_progress', 'drop', 'dump', 'restore', 'rename',
|
||||
'change_admin_password', 'migrate_databases',
|
||||
'create_database', 'duplicate_database']:
|
||||
passwd = params[0]
|
||||
params = params[1:]
|
||||
security.check_super(passwd)
|
||||
elif method in ['db_exist', 'list', 'list_lang', 'server_version']:
|
||||
# params = params
|
||||
# No security check for these methods
|
||||
pass
|
||||
else:
|
||||
raise KeyError("Method not found: %s" % method)
|
||||
fn = globals()['exp_' + method]
|
||||
return fn(*params)
|
||||
|
||||
def _create_empty_database(name):
|
||||
db = openerp.sql_db.db_connect('postgres')
|
||||
with closing(db.cursor()) as cr:
|
||||
@@ -122,9 +114,8 @@ def _drop_conn(cr, db_name):
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def exp_drop(db_name):
|
||||
if db_name not in exp_list(True):
|
||||
if db_name not in list_dbs(True):
|
||||
return False
|
||||
openerp.modules.registry.RegistryManager.delete(db_name)
|
||||
openerp.sql_db.close_db(db_name)
|
||||
@@ -287,12 +278,28 @@ def exp_rename(old_name, new_name):
|
||||
shutil.move(old_fs, new_fs)
|
||||
return True
|
||||
|
||||
def exp_change_admin_password(new_password):
|
||||
openerp.tools.config['admin_passwd'] = new_password
|
||||
openerp.tools.config.save()
|
||||
return True
|
||||
|
||||
def exp_migrate_databases(databases):
|
||||
for db in databases:
|
||||
_logger.info('migrate database %s', db)
|
||||
openerp.tools.config['update']['base'] = True
|
||||
openerp.modules.registry.RegistryManager.new(db, force_demo=False, update_module=True)
|
||||
return True
|
||||
|
||||
#----------------------------------------------------------
|
||||
# No master password required
|
||||
#----------------------------------------------------------
|
||||
|
||||
@openerp.tools.mute_logger('openerp.sql_db')
|
||||
def exp_db_exist(db_name):
|
||||
## Not True: in fact, check if connection to database is possible. The database may exists
|
||||
return bool(openerp.sql_db.db_connect(db_name))
|
||||
|
||||
def exp_list(document=False):
|
||||
def list_dbs(force=False):
|
||||
if not openerp.tools.config['list_db'] and not document:
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
chosen_template = openerp.tools.config['db_template']
|
||||
@@ -318,10 +325,10 @@ def exp_list(document=False):
|
||||
res.sort()
|
||||
return res
|
||||
|
||||
def exp_change_admin_password(new_password):
|
||||
openerp.tools.config['admin_passwd'] = new_password
|
||||
openerp.tools.config.save()
|
||||
return True
|
||||
def exp_list(document=False):
|
||||
if not openerp.tools.config['list_db']:
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
return list_dbs()
|
||||
|
||||
def exp_list_lang():
|
||||
return openerp.tools.scan_languages()
|
||||
@@ -332,9 +339,19 @@ def exp_server_version():
|
||||
"""
|
||||
return openerp.release.version
|
||||
|
||||
def exp_migrate_databases(databases):
|
||||
for db in databases:
|
||||
_logger.info('migrate database %s', db)
|
||||
openerp.tools.config['update']['base'] = True
|
||||
openerp.modules.registry.RegistryManager.new(db, force_demo=False, update_module=True)
|
||||
return True
|
||||
#----------------------------------------------------------
|
||||
# db service dispatch
|
||||
#----------------------------------------------------------
|
||||
|
||||
def dispatch(method, params):
|
||||
g = globals()
|
||||
exp_method_name = 'exp_' + method
|
||||
if method in ['db_exist', 'list', 'list_lang', 'server_version']:
|
||||
return g[exp_method_name](*params)
|
||||
elif exp_method_name in g:
|
||||
passwd = params[0]
|
||||
params = params[1:]
|
||||
check_super(passwd)
|
||||
return g[exp_method_name](*params)
|
||||
else:
|
||||
raise KeyError("Method not found: %s" % method)
|
||||
|
||||
@@ -8,12 +8,6 @@ def login(db, login, password):
|
||||
res_users = openerp.registry(db)['res.users']
|
||||
return res_users._login(db, login, password)
|
||||
|
||||
def check_super(passwd):
|
||||
if passwd == openerp.tools.config['admin_passwd']:
|
||||
return True
|
||||
else:
|
||||
raise openerp.exceptions.AccessDenied()
|
||||
|
||||
def check(db, uid, passwd):
|
||||
res_users = openerp.registry(db)['res.users']
|
||||
return res_users.check(db, uid, passwd)
|
||||
|
||||
@@ -769,7 +769,7 @@ class WorkerCron(Worker):
|
||||
if config['db_name']:
|
||||
db_names = config['db_name'].split(',')
|
||||
else:
|
||||
db_names = openerp.service.db.exp_list(True)
|
||||
db_names = openerp.service.db.list_dbs(True)
|
||||
return db_names
|
||||
|
||||
def process_work(self):
|
||||
|
||||
@@ -152,24 +152,6 @@ def wsgi_xmlrpc(environ, start_response):
|
||||
params, method = xmlrpclib.loads(data)
|
||||
return xmlrpc_return(start_response, service, method, params, string_faultcode)
|
||||
|
||||
# WSGI handlers registered through the register_wsgi_handler() function below.
|
||||
module_handlers = []
|
||||
# RPC endpoints registered through the register_rpc_endpoint() function below.
|
||||
rpc_handlers = {}
|
||||
|
||||
def register_wsgi_handler(handler):
|
||||
""" Register a WSGI handler.
|
||||
|
||||
Handlers are tried in the order they are added. We might provide a way to
|
||||
register a handler for specific routes later.
|
||||
"""
|
||||
module_handlers.append(handler)
|
||||
|
||||
def register_rpc_endpoint(endpoint, handler):
|
||||
""" Register a handler for a given RPC enpoint.
|
||||
"""
|
||||
rpc_handlers[endpoint] = handler
|
||||
|
||||
def application_unproxied(environ, start_response):
|
||||
""" WSGI entry point."""
|
||||
# cleanup db/uid trackers - they're set at HTTP dispatch in
|
||||
@@ -184,9 +166,7 @@ def application_unproxied(environ, start_response):
|
||||
|
||||
with openerp.api.Environment.manage():
|
||||
# Try all handlers until one returns some result (i.e. not None).
|
||||
wsgi_handlers = [wsgi_xmlrpc]
|
||||
wsgi_handlers += module_handlers
|
||||
for handler in wsgi_handlers:
|
||||
for handler in [wsgi_xmlrpc, openerp.http.root]:
|
||||
result = handler(environ, start_response)
|
||||
if result is None:
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user