[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
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):
""" Base class for Local services
Functionality here is trusted, no authentication.

View File

@ -21,18 +21,21 @@
#.apidoc title: Objects Services (OSV)
from openerp.osv.orm import Model, TransientModel, AbstractModel
from openerp.osv.orm import except_orm, Model, TransientModel, AbstractModel
# Deprecated.
class except_osv(Exception):
def __init__(self, name, value):
self.name = name
self.value = value
self.args = (name, value)
# Deprecated, kept for backward compatibility.
# openerp.exceptions.Warning should be used instead.
except_osv = except_orm
# deprecated - for backward compatibility.
# Deprecated, kept for backward compatibility.
osv = Model
osv_memory = TransientModel
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:

View File

@ -8,7 +8,6 @@ import threading
import openerp
from openerp.tools.translate import translate
from openerp.osv.orm import except_orm
from openerp.osv.osv import except_osv
_logger = logging.getLogger(__name__)
@ -80,18 +79,15 @@ def check(f):
try:
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)
except except_orm, inst:
raise except_osv(inst.name, inst.value)
except except_osv:
except except_orm:
raise
except IntegrityError, inst:
osv_pool = openerp.pooler.get_pool(dbname)
for key in osv_pool._sql_error.keys():
if key in inst[0]:
openerp.netsvc.abort_response(1, _('Constraint Error'), 'warning',
tr(osv_pool._sql_error[key], 'sql_constraint') or inst[0])
raise openerp.osv.orm.except_orm(_('Constraint Error'), 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):
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)
@ -111,9 +107,9 @@ def check(f):
msg += _('\n\n[object with reference: %s - %s]') % (model_name, model)
except Exception:
pass
openerp.netsvc.abort_response(1, _('Integrity Error'), 'warning', msg)
raise openerp.osv.orm.except_orm(_('Integrity Error'), msg)
else:
openerp.netsvc.abort_response(1, _('Integrity Error'), 'warning', inst[0])
raise openerp.osv.orm.except_orm(_('Integrity Error'), inst[0])
except Exception:
_logger.exception("Uncaught exception")
raise
@ -123,7 +119,7 @@ def check(f):
def execute_cr(cr, uid, obj, method, *args, **kw):
object = openerp.pooler.get_pool(cr.dbname).get(obj)
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)
def execute_kw(db, uid, obj, method, args, kw=None):
@ -136,7 +132,7 @@ def execute(db, uid, obj, method, *args, **kw):
try:
try:
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)
if res is None:
_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):
object = openerp.pooler.get_pool(cr.dbname).get(obj)
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]
return object._workflow_signal(cr, uid, [res_id], signal)[res_id]

View File

@ -166,7 +166,7 @@ class TinySocketClientThread(threading.Thread):
self.running = False
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
if isinstance(e, openerp.exceptions.Warning):
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.modules
import openerp.exceptions
import openerp.osv.orm # TODO use openerp.exceptions
from openerp.service import http_server
from openerp import SUPERUSER_ID
@ -388,22 +389,10 @@ class db(netsvc.ExportService):
return release.version
def exp_migrate_databases(self,databases):
from openerp.osv.orm import except_orm
from openerp.osv.osv import except_osv
for db in databases:
try:
_logger.info('migrate database %s', db)
tools.config['update']['base'] = 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
_logger.info('migrate database %s', db)
tools.config['update']['base'] = True
pooler.restart_pool(db, force_demo=False, update_module=True)
return True
class common(netsvc.ExportService):
@ -474,7 +463,7 @@ GNU Public Licence.
return rc.get_available_updates(rc.id, openerp.modules.get_modules_with_version())
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):
@ -540,7 +529,7 @@ GNU Public Licence.
return True
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:
_logger.exception('Exception in get_migration_script:')
raise
@ -724,7 +713,7 @@ class report_spool(netsvc.ExportService):
result = self._reports[report_id]
exc = result['exception']
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']}
if res['state']:
if tools.config['reportgz']:

View File

@ -90,7 +90,7 @@ def xmlrpc_return(start_response, service, method, params, legacy_exceptions=Fal
return [response]
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))
response = xmlrpclib.dumps(fault, allow_none=False, encoding=None)
elif isinstance(e, openerp.exceptions.Warning):
@ -123,7 +123,7 @@ def xmlrpc_handle_exception(e):
return response
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, '')
response = xmlrpclib.dumps(fault, allow_none=False, encoding=None)
elif isinstance(e, openerp.exceptions.Warning):