# -*- coding: utf-8 -*-
- import base64
- import glob, os, re
++
+ import base64, glob, os, re
from xml.etree import ElementTree
from cStringIO import StringIO
# OpenERP Web base Controllers
#----------------------------------------------------------
+class DatabaseCreationError(Exception): pass
+class DatabaseCreationCrash(DatabaseCreationError): pass
+
- class Session(openerpweb.Controller):
- _cp_path = "/base/session"
-
- def manifest_glob(self, addons, key):
- files = []
- for addon in addons:
- globlist = openerpweb.addons_manifest.get(addon, {}).get(key, [])
-
- files.extend([
- resource_path[len(openerpweb.path_addons):]
- for pattern in globlist
- for resource_path in glob.glob(os.path.join(
- openerpweb.path_addons, addon, pattern))
- ])
- return files
-
- def concat_files(self, file_list):
- """ Concatenate file content
- return (concat,timestamp)
- concat: concatenation of file content
- timestamp: max(os.path.getmtime of file_list)
- """
- root = openerpweb.path_root
- files_content = []
- files_timestamp = 0
- for i in file_list:
- fname = os.path.join(root, i)
- ftime = os.path.getmtime(fname)
- if ftime > files_timestamp:
- files_timestamp = ftime
- files_content = open(fname).read()
- files_concat = "".join(files_content)
- return files_concat
-
- @openerpweb.jsonrequest
- def login(self, req, db, login, password):
- req.session.login(db, login, password)
-
- return {
- "session_id": req.session_id,
- "uid": req.session._uid,
- }
-
- @openerpweb.jsonrequest
- def sc_list(self, req):
- return req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu",
- req.session.eval_context(req.context))
+ class Database(openerpweb.Controller):
+ _cp_path = "/base/database"
@openerpweb.jsonrequest
def get_databases_list(self, req):
proxy = req.session.proxy("db")
dbs = proxy.list()
-
+ h = req.httprequest.headers['Host'].split(':')[0]
+ d = h.split(':')[0]
+ r = cherrypy.config['openerp.dbfilter'].replace('%h',h).replace('%d',d)
+ print "h,d",h,d,r
+ dbs = [i for i in dbs if re.match(r,i)]
return {"db_list": dbs}
+
+ @openerpweb.jsonrequest
- def get_lang_list(self, req):
- lang_list = [('en_US', 'English (US)')]
- try:
- lang_list = lang_list + (req.session.proxy("db").list_lang() or [])
- except Exception, e:
- pass
- return {"lang_list": lang_list}
-
- @openerpweb.jsonrequest
+ def db_operation(self, req, flag, **kw):
+
+ if flag == 'create':
+
+ super_admin_pwd = kw.get('super_admin_pwd')
+ dbname = kw.get('db')
+ demo_data = kw.get('demo_data')
+ db_lang = kw.get('db_lang')
+ admin_pwd = kw.get('admin_pwd')
+ confirm_pwd = kw.get('confirm_pwd')
+
+ if not re.match('^[a-zA-Z][a-zA-Z0-9_]+$', dbname):
+ return {'error': "You must avoid all accents, space or special characters.", 'title': 'Bad database name'}
+
+ ok = False
+ try:
+ return req.session.proxy("db").create(super_admin_pwd, dbname, demo_data, db_lang, admin_pwd)
+# while True:
+# try:
+# progress, users = req.session.proxy('db').get_progress(super_admin_pwd, res)
+# if progress == 1.0:
+# for x in users:
+# if x['login'] == 'admin':
+# req.session.login(dbname, 'admin', x['password'])
+# ok = True
+# break
+# else:
+# time.sleep(1)
+# except:
+# raise DatabaseCreationCrash()
+# except DatabaseCreationCrash:
+# return {'error': "The server crashed during installation.\nWe suggest you to drop this database.",
+# 'title': 'Error during database creation'}
+ except Exception, e:
+ if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
+ return {'error': 'Bad super admin password !', 'title': 'Create Database'}
+ else:
+ return {'error': 'Could not create database !', 'title': 'Create Database'}
+
+ elif flag == 'drop':
+ db = kw.get('db')
+ password = kw.get('password')
+
+ try:
+ return req.session.proxy("db").drop(password, db)
+ except Exception, e:
+ if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
+ return {'error': 'Bad super admin password !', 'title': 'Drop Database'}
+ else:
+ return {'error': 'Could not drop database !', 'title': 'Drop Database'}
+
+ elif flag == 'backup':
+ db = kw.get('db')
+ password = kw.get('password')
+ try:
+ res = req.session.proxy("db").dump(password, db)
+ if res:
+ cherrypy.response.headers['Content-Type'] = "application/data"
+ cherrypy.response.headers['Content-Disposition'] = 'filename="' + db + '.dump"'
+ return base64.decodestring(res)
+ except Exception, e:
+ if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
+ return {'error': 'Bad super admin password !', 'title': 'Backup Database'}
+ else:
+ return {'error': 'Could not drop database !', 'title': 'Backup Database'}
+
+ elif flag == 'restore':
+ filename = kw.get('filename')
+ db = kw.get('db')
+ password = kw.get('password')
+
+ try:
+ data = base64.encodestring(filename.file.read())
+ return req.session.proxy("db").restore(password, db, data)
+ except Exception, e:
+ if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
+ return {'error': 'Bad super admin password !', 'title': 'Restore Database'}
+ else:
+ return {'error': 'Could not restore database !', 'title': 'Restore Database'}
+
+ elif flag == 'change_password':
+ old_password = kw.get('old_password')
+ new_password = kw.get('new_password')
+ confirm_password = kw.get('confirm_password')
+
+ try:
+ return req.session.proxy("db").change_admin_password(old_password, new_password)
+ except Exception, e:
+ if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied':
+ return {'error': 'Bad super admin password !', 'title': 'Change Password'}
+ else:
+ return {'error': 'Error, password not changed !', 'title': 'Change Password'}
+
+ class Session(openerpweb.Controller):
+ _cp_path = "/base/session"
+
+ def manifest_glob(self, addons, key):
+ files = []
+ for addon in addons:
+ globlist = openerpweb.addons_manifest.get(addon, {}).get(key, [])
+
+ files.extend([
+ resource_path[len(openerpweb.path_addons):]
+ for pattern in globlist
+ for resource_path in glob.glob(os.path.join(
+ openerpweb.path_addons, addon, pattern))
+ ])
+ return files
+
+ def concat_files(self, file_list):
+ """ Concatenate file content
+ return (concat,timestamp)
+ concat: concatenation of file content
+ timestamp: max(os.path.getmtime of file_list)
+ """
+ root = openerpweb.path_root
+ files_content = []
+ files_timestamp = 0
+ for i in file_list:
+ fname = os.path.join(root, i)
+ ftime = os.path.getmtime(fname)
+ if ftime > files_timestamp:
+ files_timestamp = ftime
+ files_content = open(fname).read()
+ files_concat = "".join(files_content)
+ return files_concat
+
+ @openerpweb.jsonrequest
+ def login(self, req, db, login, password):
+ req.session.login(db, login, password)
+
+ return {
+ "session_id": req.session_id,
+ "uid": req.session._uid,
+ }
+
+ @openerpweb.jsonrequest
+ def sc_list(self, req):
+ return req.session.model('ir.ui.view_sc').get_sc(req.session._uid, "ir.ui.menu",
+ req.session.eval_context(req.context))
+
+ @openerpweb.jsonrequest
++ def get_lang_list(self, req):
++ lang_list = [('en_US', 'English (US)')]
++ try:
++ lang_list = lang_list + (req.session.proxy("db").list_lang() or [])
++ except Exception, e:
++ pass
++ return {"lang_list": lang_list}
+
+ @openerpweb.jsonrequest
def modules(self, req):
return {"modules": [name
for name, manifest in openerpweb.addons_manifest.iteritems()
});
openerp.base.Database = openerp.base.Controller.extend({
+ init: function(session, element_id, option_id) {
+ this._super(session, element_id);
+ this.option_id = option_id;
+ this.$option_id = $('#' + option_id);
+ this.$option_id.html('');
+ },
+ start: function() {
+ this.$element.html(QWeb.render("Database", this));
+
+ this.$element.closest(".openerp").removeClass("login-mode");
+ this.$element.closest(".openerp").addClass("database_block");
+
+ var self = this;
+
- this.rpc("/base/session/get_databases_list", {}, function(result) {
++ this.rpc("/base/database/get_databases_list", {}, function(result) {
+ self.db_list = result.db_list;
+ });
+
+ this.rpc("/base/session/get_lang_list", {}, function(result) {
+ self.lang_list = result.lang_list;
+ self.do_db_create();
+ });
+
+ this.$element.find('#db-create').click(this.do_db_create);
+ this.$element.find('#db-drop').click(this.do_db_drop);
+ this.$element.find('#db-backup').click(this.do_db_backup);
+ this.$element.find('#db-restore').click(this.do_db_restore);
+ this.$element.find('#db-change-password').click(this.do_change_password);
+ this.$element.find('#back-to-login').click(function() {
+ self.header = new openerp.base.Header(self.session, "oe_header");
+ self.header.on_logout();
+ });
+ },
+
+ do_db_create: function() {
+ var self = this;
+ self.db_string = "CREATE DATABASE";
+ self.$option_id.html(QWeb.render("CreateDB", self));
+
+ $("form[name=create_db_form]").validate();
+
+ $("input[name=create_confirm_pwd]").rules("add", {
+ equalTo: 'input[name=create_admin_pwd]',
+ messages: {
+ required: "Password did not match !"
+ }
+ });
+
+ $("input[name=super_admin_pwd]").focus();
+
+ self.$option_id.find('form[name=create_db_form]').submit(function(ev) {
+ ev.preventDefault();
+
+ var super_admin_pwd = self.$option_id.find("input[name=super_admin_pwd]").val();
+ var db = self.$option_id.find("input[name=db_name]").val();
+ var demo_data = self.$option_id.find("input[name=demo_data]:checked");
+ var db_lang = self.$option_id.find("select[name=db_lang]").val();
+ var admin_pwd = self.$option_id.find("input[name=create_admin_pwd]").val();
+ var confirm_pwd = self.$option_id.find("input[name=create_confirm_pwd]").val();
+
+ if (demo_data.length)
+ demo_data = 'True';
+ else
+ demo_data = 'False';
+
- self.rpc("/base/session/db_operation", {
++ self.rpc("/base/database/db_operation", {
+ 'flag': 'create',
+ 'super_admin_pwd': super_admin_pwd,
+ 'db': db,
+ 'demo_data': demo_data,
+ 'db_lang': db_lang,
+ 'admin_pwd': admin_pwd,
+ 'confirm_pwd': confirm_pwd
+ },
+ function(result) {
+ if (result && !result.error) {
+
+ } else if(result.error) {
+ var db_error_dialog = _.uniqueId("db_error_dialog");
+ $('<div>', {id: db_error_dialog}).dialog({
+ modal: true,
+ title: result.title,
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ }
+ }
+ }).html("<center style='padding-top: 15px; font-size: 15px'>" + result.error + "</center>");
+ }
+ });
+ });
+ },
+
+ do_db_drop: function() {
+ var self = this;
+ self.db_string = "DROP DATABASE";
+ self.$option_id.html(QWeb.render("DropDB", self));
+
+ $("form[name=drop_db_form]").validate();
+
+ self.$option_id.find('form[name=drop_db_form]').submit(function(ev) {
+ ev.preventDefault();
+
+ var db = self.$option_id.find("select[name=drop_db]").val();
+ var password = self.$option_id.find("input[name=drop_pwd]").val();
+
+ if (confirm("Do you really want to delete the database: " + db + " ?")) {
- self.rpc("/base/session/db_operation", {'flag': 'drop', 'db': db, 'password': password},
++ self.rpc("/base/database/db_operation", {'flag': 'drop', 'db': db, 'password': password},
+ function(result) {
+ if (result && ! result.error) {
+ self.$option_id.find("select[name=drop_db] :selected").remove();
+ self.notification.notify("Dropping database", "The database '" + db + "' has been dropped");
+ } else if(result.error) {
+ var db_error_dialog = _.uniqueId("db_error_dialog");
+ $('<div>', {id: db_error_dialog}).dialog({
+ modal: true,
+ title: result.title,
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ }
+ }
+ }).html("<center style='padding-top: 15px; font-size: 15px'>" + result.error + "</center>");
+ }
+ });
+ }
+ });
+ },
+
+ do_db_backup: function() {
+ var self = this;
+ self.db_string = "BACKUP DATABASE";
+ self.$option_id.html(QWeb.render("BackupDB", self));
+
+ $("form[name=backup_db_form]").validate();
+
+ self.$option_id.find('form[name=backup_db_form]').submit(function(ev) {
+ ev.preventDefault();
+
+ var db = self.$option_id.find("select[name=backup_db]").val();
+ var password = self.$option_id.find("input[name=backup_pwd]").val();
+
- self.rpc("/base/session/db_operation", {'flag': 'backup', 'db': db, 'password': password},
++ self.rpc("/base/database/db_operation", {'flag': 'backup', 'db': db, 'password': password},
+ function(result) {
+ if (result && !result.error) {
+ self.notification.notify("Backup Database", "Backup has been created for the database: '" + db + "'");
+ } else if(result.error) {
+ var db_error_dialog = _.uniqueId("db_error_dialog");
+ $('<div>', {id: db_error_dialog}).dialog({
+ modal: true,
+ title: result.title,
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ }
+ }
+ }).html("<center style='padding-top: 15px; font-size: 15px'>" + result.error + "</center>");
+ }
+ });
+ });
+ },
+
+ do_db_restore: function() {
+ var self = this;
+ self.db_string = "RESTORE DATABASE";
+ self.$option_id.html(QWeb.render("RestoreDB", self));
+
+ $("form[name=restore_db_form]").validate();
+
+ self.$option_id.find('form[name=restore_db_form]').submit(function(ev) {
+ ev.preventDefault();
+
+ var db = self.$option_id.find("input[name=restore_db]").val();
+ var password = self.$option_id.find("input[name=restore_pwd]").val();
+ var new_db = self.$option_id.find("input[name=new_db]").val();
+
- self.rpc("/base/session/db_operation", {'flag': 'restore', 'db': db, 'password': password, 'new_db': new_db},
++ self.rpc("/base/database/db_operation", {'flag': 'restore', 'db': db, 'password': password, 'new_db': new_db},
+ function(result) {
+ if (result && !result.error) {
+ self.notification.notify("Restore Database", "You restored your database as: '" + new_db + "'");
+ } else if(result.error) {
+ var db_error_dialog = _.uniqueId("db_error_dialog");
+ $('<div>', {id: db_error_dialog}).dialog({
+ modal: true,
+ title: result.title,
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ }
+ }
+ }).html("<center style='padding-top: 15px; font-size: 15px'>" + result.error + "</center>");
+ }
+ });
+ });
+ },
+
+ do_change_password: function() {
+ var self = this;
+ self.db_string = "CHANGE DATABASE PASSWORD";
+ self.$option_id.html(QWeb.render("Change_DB_Pwd", self));
+
+ $("form[name=change_pwd_form]").validate();
+
+ $("input[name=old_pwd]").rules("add", {
+ minlength: 1,
+ messages: {
+ required: "Please enter password !"
+ }
+ });
+ $("input[name=new_pwd]").rules("add", {
+ minlength: 1,
+ messages: {
+ required: "Please enter password !"
+ }
+ });
+ $("input[name=confirm_pwd]").rules("add", {
+ equalTo: 'input[name=new_pwd]',
+ messages: {
+ required: "Password did not match !"
+ }
+ });
+
+ $("input[name=old_pwd]").focus();
+
+ self.$option_id.find('form[name=change_pwd_form]').submit(function(ev) {
+ ev.preventDefault();
+
+ var old_pwd = self.$option_id.find("input[name=old_pwd]").val();
+ var new_pwd = self.$option_id.find("input[name=new_pwd]").val();
+ var confirm_pwd = self.$option_id.find("input[name=confirm_pwd]").val();
+
- self.rpc("/base/session/db_operation", {'flag': 'change_password', 'old_password': old_pwd, 'new_password': new_pwd, 'confirm_password': confirm_pwd},
++ self.rpc("/base/database/db_operation", {'flag': 'change_password', 'old_password': old_pwd, 'new_password': new_pwd, 'confirm_password': confirm_pwd},
+ function(result) {
+ if (result && !result.error) {
+ self.notification.notify("Changed Password", "Password has been changed successfully");
+ } else if(result.error) {
+ var db_error_dialog = _.uniqueId("db_error_dialog");
+ $('<div>', {id: db_error_dialog}).dialog({
+ modal: true,
+ title: result.title,
+ buttons: {
+ Ok: function() {
+ $(this).dialog("close");
+ }
+ }
+ }).html("<center style='padding-top: 15px; font-size: 15px'>" + result.error + "</center>");
+ }
+ });
+ });
+ }
+
});
openerp.base.Login = openerp.base.Controller.extend({