From b159aab4464fc7d73ca18fab6047216b0c560fec Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 1 Aug 2011 11:11:07 +0200 Subject: [PATCH] [IMP] simplify unpacking of parameters in db operations, cleanup error handling as well bzr revid: xmo@openerp.com-20110801091107-cw5rx59s2kgbgo51 --- addons/base/controllers/main.py | 88 ++++++++++++--------------------- 1 file changed, 31 insertions(+), 57 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 8fe79a19a9a..14a0a352079 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -4,6 +4,7 @@ import base64, glob, os, re from xml.etree import ElementTree from cStringIO import StringIO +import operator import simplejson import openerpweb @@ -164,54 +165,37 @@ class Database(openerpweb.Controller): @openerpweb.jsonrequest def create_db(self, req, fields): - - for field in fields: - if field['name'] == 'super_admin_pwd': - super_admin_pwd = field['value'] - elif field['name'] == 'db_name': - dbname = field['value'] - elif field['name'] == 'demo_data': - demo_data = field['value'] - elif field['name'] == 'db_lang': - db_lang = field['value'] - elif field['name'] == 'create_admin_pwd': - admin_pwd = field['value'] - - if dbname and 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 + + params = dict(map(operator.itemgetter('name', 'value'), fields)) + create_attrs = operator.itemgetter( + 'super_admin_pwd', 'db_name', 'demo_data', 'db_lang', 'create_admin_pwd')( + params) + try: - return req.session.proxy("db").create(super_admin_pwd, dbname, demo_data, db_lang, admin_pwd) - except Exception, e: + return req.session.proxy("db").create(*create_attrs) + except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return {'error': e.faultCode, 'title': 'Create Database'} - else: - return {'error': 'Could not create database !', 'title': 'Create Database'} + return {'error': 'Could not create database !', 'title': 'Create Database'} @openerpweb.jsonrequest def drop_db(self, req, fields): - for field in fields: - if field['name'] == 'drop_db': - db = field['value'] - elif field['name'] == 'drop_pwd': - password = field['value'] + password, db = operator.itemgetter( + 'drop_pwd', 'drop_db')( + dict(map(operator.itemgetter('name', 'value'), fields))) try: return req.session.proxy("db").drop(password, db) - except Exception, e: + except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return {'error': e.faultCode, 'title': 'Drop Database'} - else: - return {'error': 'Could not drop database !', 'title': 'Drop Database'} + return {'error': 'Could not drop database !', 'title': 'Drop Database'} @openerpweb.jsonrequest def backup_db(self, req, fields): - for field in fields: - if field['name'] == 'backup_db': - db = field['value'] - elif field['name'] == 'backup_pwd': - password = field['value'] + password, db = operator.itemgetter( + 'backup_pwd', 'backup_db')( + dict(map(operator.itemgetter('name', 'value'), fields))) try: res = req.session.proxy("db").dump(password, db) @@ -219,46 +203,36 @@ class Database(openerpweb.Controller): cherrypy.response.headers['Content-Type'] = "application/data" cherrypy.response.headers['Content-Disposition'] = 'filename="' + db + '.dump"' return base64.decodestring(res) - except Exception, e: + except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return {'error': e.faultCode, 'title': 'Backup Database'} - else: - return {'error': 'Could not drop database !', 'title': 'Backup Database'} + return {'error': 'Could not drop database !', 'title': 'Backup Database'} @openerpweb.jsonrequest def restore_db(self, req, fields): - for field in fields: - if field['name'] == 'restore_db': - filename = field['value'] - elif field['name'] == 'new_db': - db = field['value'] - elif field['name'] == 'restore_pwd': - password = field['value'] - + password, db, filename = operator.itemgetter( + 'restore_pwd', 'new_db', 'value')( + dict(map(operator.itemgetter('name', 'value'), fields))) + try: data = base64.encodestring(filename.file.read()) return req.session.proxy("db").restore(password, db, data) - except Exception, e: + except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return {'error': e.faultCode, 'title': 'Restore Database'} - else: - return {'error': 'Could not restore database !', 'title': 'Restore Database'} + return {'error': 'Could not restore database !', 'title': 'Restore Database'} @openerpweb.jsonrequest def change_password_db(self, req, fields): - for field in fields: - if field['name'] == 'old_pwd': - old_password = field['value'] - elif field['name'] == 'new_pwd': - new_password = field['value'] - + old_password, new_password = operator.itemgetter( + 'old_pwd', 'value')( + dict(map(operator.itemgetter('name', 'value'), fields))) try: return req.session.proxy("db").change_admin_password(old_password, new_password) - except Exception, e: + except xmlrpclib.Fault, e: if e.faultCode and e.faultCode.split(':')[0] == 'AccessDenied': return {'error': e.faultCode, 'title': 'Change Password'} - else: - return {'error': 'Error, password not changed !', 'title': 'Change Password'} + return {'error': 'Error, password not changed !', 'title': 'Change Password'} class Session(openerpweb.Controller): _cp_path = "/base/session"