[FIX] Merged with main branch and created separate class for database operations.
authornoz (OpenERP) <noz@tinyerp.com>
Wed, 13 Jul 2011 10:50:58 +0000 (16:20 +0530)
committernoz (OpenERP) <noz@tinyerp.com>
Wed, 13 Jul 2011 10:50:58 +0000 (16:20 +0530)
bzr revid: noz@tinyerp.com-20110713105058-ptb2ejnlml8ccugj

1  2 
addons/base/controllers/main.py
addons/base/static/src/js/chrome.js
addons/base/static/src/xml/base.xml

@@@ -1,6 -1,5 +1,6 @@@
  # -*- coding: utf-8 -*-
- import base64
- import glob, os, re
++
+ import base64, glob, os, re
  from xml.etree import ElementTree
  from cStringIO import StringIO
  
@@@ -56,168 -54,69 +56,175 @@@ class Xml2Json
  # 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()
@@@ -909,257 -909,6 +909,257 @@@ openerp.base.Loading =  openerp.base.Co
  });
  
  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({
Simple merge