diff --git a/openerp/exceptions.py b/openerp/exceptions.py index fbf52c7f3a9..387e126b8c4 100644 --- a/openerp/exceptions.py +++ b/openerp/exceptions.py @@ -27,9 +27,17 @@ treated as a 'Server error'. """ +import re + class Warning(Exception): pass +class WarningConfig(Exception): + """ Warning bound to a misconfiguration. """ + def __init__(self, msg): + # todo: treat the msg (regex) + super(WarningConfig, self).__init__(msg) + class AccessDenied(Exception): """ Login/password error. No message, no traceback. """ def __init__(self): diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 533b1659191..3362b86fac7 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -107,7 +107,7 @@ class ExportService(object): """ _services = {} - + def __init__(self, name): ExportService._services[name] = self self.__name = name @@ -306,6 +306,8 @@ def dispatch_rpc(service_name, method, params): raise except openerp.exceptions.Warning: raise + except openerp.exceptions.WarningConfig: + raise except openerp.exceptions.DeferredException, e: _logger.exception(tools.exception_to_unicode(e)) post_mortem(e.traceback) diff --git a/openerp/service/netrpc_server.py b/openerp/service/netrpc_server.py index af89a734f28..f87274ef6e6 100644 --- a/openerp/service/netrpc_server.py +++ b/openerp/service/netrpc_server.py @@ -15,7 +15,7 @@ # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . +# along with this program. If not, see . # ############################################################################## @@ -145,7 +145,7 @@ class TinySocketClientThread(threading.Thread): break except Exception, e: try: - valid_exception = Exception(netrpc_handle_exception_legacy(e)) + valid_exception = Exception(netrpc_handle_exception_legacy(e)) valid_traceback = getattr(e, 'traceback', sys.exc_info()) formatted_traceback = "".join(traceback.format_exception(*valid_traceback)) _logger.debug("netrpc: communication-level exception", exc_info=True) @@ -164,12 +164,14 @@ class TinySocketClientThread(threading.Thread): def stop(self): self.running = False - + def netrpc_handle_exception_legacy(e): if isinstance(e, openerp.osv.osv.except_osv): return 'warning -- ' + e.name + '\n\n' + e.value if isinstance(e, openerp.exceptions.Warning): return 'warning -- Warning\n\n' + str(e) + if isinstance(e, openerp.exceptions.WarningConfig): + return 'warning -- Warning\n\n' + str(e) if isinstance(e, openerp.exceptions.AccessError): return 'warning -- AccessError\n\n' + str(e) if isinstance(e, openerp.exceptions.AccessDenied): diff --git a/openerp/service/wsgi_server.py b/openerp/service/wsgi_server.py index 67436a1c0bf..e83f06cc264 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -95,6 +95,8 @@ def xmlrpc_handle_exception(e): response = xmlrpclib.dumps(fault, allow_none=False, encoding=None) elif isinstance(e, openerp.exceptions.Warning): fault = xmlrpclib.Fault(RPC_FAULT_CODE_WARNING, str(e)) + elif isinstance(e, openerp.exceptions.WarningConfig): + fault = xmlrpclib.Fault(RPC_FAULT_CODE_WARNING, str(e)) response = xmlrpclib.dumps(fault, allow_none=False, encoding=None) elif isinstance (e, openerp.exceptions.AccessError): fault = xmlrpclib.Fault(RPC_FAULT_CODE_ACCESS_ERROR, str(e)) @@ -311,7 +313,7 @@ def http_to_wsgi(http_dir): handler.auth_provider.checkRequest(handler, path) except websrv_lib.AuthRequiredExc, ae: # Darwin 9.x.x webdav clients will report "HTTP/1.0" to us, while they support (and need) the - # authorisation features of HTTP/1.1 + # authorisation features of HTTP/1.1 if request_version != 'HTTP/1.1' and ('Darwin/9.' not in handler.headers.get('User-Agent', '')): start_response("403 Forbidden", []) return []