[REF] services: somewhat clean use of openerp exceptions.

bzr revid: vmt@openerp.com-20130130134451-yft2y56hkpnoxgwa
This commit is contained in:
Vo Minh Thu 2013-01-30 14:44:51 +01:00
parent 19b0315f68
commit 674056c4a5
6 changed files with 29 additions and 45 deletions

View File

@ -67,10 +67,6 @@ def close_socket(sock):
raise raise
sock.close() sock.close()
def abort_response(dummy_1, description, dummy_2, details):
# TODO Replace except_{osv,orm} with these directly.
raise openerp.osv.osv.except_osv(description, details)
class Service(object): class Service(object):
""" Base class for Local services """ Base class for Local services
Functionality here is trusted, no authentication. Functionality here is trusted, no authentication.

View File

@ -21,18 +21,21 @@
#.apidoc title: Objects Services (OSV) #.apidoc title: Objects Services (OSV)
from openerp.osv.orm import Model, TransientModel, AbstractModel from openerp.osv.orm import except_orm, Model, TransientModel, AbstractModel
# Deprecated. # Deprecated, kept for backward compatibility.
class except_osv(Exception): # openerp.exceptions.Warning should be used instead.
def __init__(self, name, value): except_osv = except_orm
self.name = name
self.value = value
self.args = (name, value)
# deprecated - for backward compatibility. # Deprecated, kept for backward compatibility.
osv = Model osv = Model
osv_memory = TransientModel osv_memory = TransientModel
osv_abstract = AbstractModel # ;-) osv_abstract = AbstractModel # ;-)
# Deprecated, kept for backward compatibility, in particular for audittrail.
class object_service(object):
def __init__(self):
import openerp.service.model
# TODO monkeypatch openerp.service.model to call the new object_service instance methods.
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

View File

@ -8,7 +8,6 @@ import threading
import openerp import openerp
from openerp.tools.translate import translate from openerp.tools.translate import translate
from openerp.osv.orm import except_orm from openerp.osv.orm import except_orm
from openerp.osv.osv import except_osv
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -80,18 +79,15 @@ def check(f):
try: try:
if openerp.pooler.get_pool(dbname)._init: if openerp.pooler.get_pool(dbname)._init:
raise except_osv('Database not ready', 'Currently, this database is not fully loaded and can not be used.') raise openerp.exceptions.Warning('Currently, this database is not fully loaded and can not be used.')
return f(dbname, *args, **kwargs) return f(dbname, *args, **kwargs)
except except_orm, inst: except except_orm:
raise except_osv(inst.name, inst.value)
except except_osv:
raise raise
except IntegrityError, inst: except IntegrityError, inst:
osv_pool = openerp.pooler.get_pool(dbname) osv_pool = openerp.pooler.get_pool(dbname)
for key in osv_pool._sql_error.keys(): for key in osv_pool._sql_error.keys():
if key in inst[0]: if key in inst[0]:
openerp.netsvc.abort_response(1, _('Constraint Error'), 'warning', raise openerp.osv.orm.except_orm(_('Constraint Error'), tr(osv_pool._sql_error[key], 'sql_constraint') or inst[0])
tr(osv_pool._sql_error[key], 'sql_constraint') or inst[0])
if inst.pgcode in (errorcodes.NOT_NULL_VIOLATION, errorcodes.FOREIGN_KEY_VIOLATION, errorcodes.RESTRICT_VIOLATION): if inst.pgcode in (errorcodes.NOT_NULL_VIOLATION, errorcodes.FOREIGN_KEY_VIOLATION, errorcodes.RESTRICT_VIOLATION):
msg = _('The operation cannot be completed, probably due to the following:\n- deletion: you may be trying to delete a record while other records still reference it\n- creation/update: a mandatory field is not correctly set') msg = _('The operation cannot be completed, probably due to the following:\n- deletion: you may be trying to delete a record while other records still reference it\n- creation/update: a mandatory field is not correctly set')
_logger.debug("IntegrityError", exc_info=True) _logger.debug("IntegrityError", exc_info=True)
@ -111,9 +107,9 @@ def check(f):
msg += _('\n\n[object with reference: %s - %s]') % (model_name, model) msg += _('\n\n[object with reference: %s - %s]') % (model_name, model)
except Exception: except Exception:
pass pass
openerp.netsvc.abort_response(1, _('Integrity Error'), 'warning', msg) raise openerp.osv.orm.except_orm(_('Integrity Error'), msg)
else: else:
openerp.netsvc.abort_response(1, _('Integrity Error'), 'warning', inst[0]) raise openerp.osv.orm.except_orm(_('Integrity Error'), inst[0])
except Exception: except Exception:
_logger.exception("Uncaught exception") _logger.exception("Uncaught exception")
raise raise
@ -123,7 +119,7 @@ def check(f):
def execute_cr(cr, uid, obj, method, *args, **kw): def execute_cr(cr, uid, obj, method, *args, **kw):
object = openerp.pooler.get_pool(cr.dbname).get(obj) object = openerp.pooler.get_pool(cr.dbname).get(obj)
if not object: if not object:
raise except_osv('Object Error', 'Object %s doesn\'t exist' % str(obj)) raise except_orm('Object Error', 'Object %s doesn\'t exist' % str(obj))
return getattr(object, method)(cr, uid, *args, **kw) return getattr(object, method)(cr, uid, *args, **kw)
def execute_kw(db, uid, obj, method, args, kw=None): def execute_kw(db, uid, obj, method, args, kw=None):
@ -136,7 +132,7 @@ def execute(db, uid, obj, method, *args, **kw):
try: try:
try: try:
if method.startswith('_'): if method.startswith('_'):
raise except_osv('Access Denied', 'Private methods (such as %s) cannot be called remotely.' % (method,)) raise except_orm('Access Denied', 'Private methods (such as %s) cannot be called remotely.' % (method,))
res = execute_cr(cr, uid, obj, method, *args, **kw) res = execute_cr(cr, uid, obj, method, *args, **kw)
if res is None: if res is None:
_logger.warning('The method %s of the object %s can not return `None` !', method, obj) _logger.warning('The method %s of the object %s can not return `None` !', method, obj)
@ -151,7 +147,7 @@ def execute(db, uid, obj, method, *args, **kw):
def exec_workflow_cr(cr, uid, obj, signal, *args): def exec_workflow_cr(cr, uid, obj, signal, *args):
object = openerp.pooler.get_pool(cr.dbname).get(obj) object = openerp.pooler.get_pool(cr.dbname).get(obj)
if not object: if not object:
raise except_osv('Object Error', 'Object %s doesn\'t exist' % str(obj)) raise except_orm('Object Error', 'Object %s doesn\'t exist' % str(obj))
res_id = args[0] res_id = args[0]
return object._workflow_signal(cr, uid, [res_id], signal)[res_id] return object._workflow_signal(cr, uid, [res_id], signal)[res_id]

View File

@ -166,7 +166,7 @@ class TinySocketClientThread(threading.Thread):
self.running = False self.running = False
def netrpc_handle_exception_legacy(e): def netrpc_handle_exception_legacy(e):
if isinstance(e, openerp.osv.osv.except_osv): if isinstance(e, openerp.osv.orm.except_orm):
return 'warning -- ' + e.name + '\n\n' + e.value return 'warning -- ' + e.name + '\n\n' + e.value
if isinstance(e, openerp.exceptions.Warning): if isinstance(e, openerp.exceptions.Warning):
return 'warning -- Warning\n\n' + str(e) return 'warning -- Warning\n\n' + str(e)

View File

@ -42,6 +42,7 @@ import openerp.sql_db as sql_db
import openerp.tools as tools import openerp.tools as tools
import openerp.modules import openerp.modules
import openerp.exceptions import openerp.exceptions
import openerp.osv.orm # TODO use openerp.exceptions
from openerp.service import http_server from openerp.service import http_server
from openerp import SUPERUSER_ID from openerp import SUPERUSER_ID
@ -388,22 +389,10 @@ class db(netsvc.ExportService):
return release.version return release.version
def exp_migrate_databases(self,databases): def exp_migrate_databases(self,databases):
from openerp.osv.orm import except_orm
from openerp.osv.osv import except_osv
for db in databases: for db in databases:
try: _logger.info('migrate database %s', db)
_logger.info('migrate database %s', db) tools.config['update']['base'] = True
tools.config['update']['base'] = True pooler.restart_pool(db, force_demo=False, update_module=True)
pooler.restart_pool(db, force_demo=False, update_module=True)
except except_orm, inst:
netsvc.abort_response(1, inst.name, 'warning', inst.value)
except except_osv, inst:
netsvc.abort_response(1, inst.name, 'warning', inst.value)
except Exception:
_logger.exception('Exception in migrate_databases:')
raise
return True return True
class common(netsvc.ExportService): class common(netsvc.ExportService):
@ -474,7 +463,7 @@ GNU Public Licence.
return rc.get_available_updates(rc.id, openerp.modules.get_modules_with_version()) return rc.get_available_updates(rc.id, openerp.modules.get_modules_with_version())
except tm.RemoteContractException, e: except tm.RemoteContractException, e:
netsvc.abort_response(1, 'Migration Error', 'warning', str(e)) raise openerp.osv.orm.except_orm('Migration Error', str(e))
def exp_get_migration_scripts(self, contract_id, contract_password): def exp_get_migration_scripts(self, contract_id, contract_password):
@ -540,7 +529,7 @@ GNU Public Licence.
return True return True
except tm.RemoteContractException, e: except tm.RemoteContractException, e:
netsvc.abort_response(1, 'Migration Error', 'warning', str(e)) raise openerp.osv.orm.except_orm('Migration Error', str(e))
except Exception, e: except Exception, e:
_logger.exception('Exception in get_migration_script:') _logger.exception('Exception in get_migration_script:')
raise raise
@ -724,7 +713,7 @@ class report_spool(netsvc.ExportService):
result = self._reports[report_id] result = self._reports[report_id]
exc = result['exception'] exc = result['exception']
if exc: if exc:
netsvc.abort_response(exc, exc.message, 'warning', exc.traceback) raise openerp.osv.orm.except_orm(exc.message, exc.traceback)
res = {'state': result['state']} res = {'state': result['state']}
if res['state']: if res['state']:
if tools.config['reportgz']: if tools.config['reportgz']:

View File

@ -90,7 +90,7 @@ def xmlrpc_return(start_response, service, method, params, legacy_exceptions=Fal
return [response] return [response]
def xmlrpc_handle_exception(e): def xmlrpc_handle_exception(e):
if isinstance(e, openerp.osv.osv.except_osv): # legacy if isinstance(e, openerp.osv.orm.except_orm): # legacy
fault = xmlrpclib.Fault(RPC_FAULT_CODE_WARNING, openerp.tools.ustr(e.value)) fault = xmlrpclib.Fault(RPC_FAULT_CODE_WARNING, openerp.tools.ustr(e.value))
response = xmlrpclib.dumps(fault, allow_none=False, encoding=None) response = xmlrpclib.dumps(fault, allow_none=False, encoding=None)
elif isinstance(e, openerp.exceptions.Warning): elif isinstance(e, openerp.exceptions.Warning):
@ -123,7 +123,7 @@ def xmlrpc_handle_exception(e):
return response return response
def xmlrpc_handle_exception_legacy(e): def xmlrpc_handle_exception_legacy(e):
if isinstance(e, openerp.osv.osv.except_osv): if isinstance(e, openerp.osv.orm.except_orm):
fault = xmlrpclib.Fault('warning -- ' + e.name + '\n\n' + e.value, '') fault = xmlrpclib.Fault('warning -- ' + e.name + '\n\n' + e.value, '')
response = xmlrpclib.dumps(fault, allow_none=False, encoding=None) response = xmlrpclib.dumps(fault, allow_none=False, encoding=None)
elif isinstance(e, openerp.exceptions.Warning): elif isinstance(e, openerp.exceptions.Warning):