diff --git a/openerp/addons/base/ir/ir_http.py b/openerp/addons/base/ir/ir_http.py index f5c5f846ec9..56c00743900 100644 --- a/openerp/addons/base/ir/ir_http.py +++ b/openerp/addons/base/ir/ir_http.py @@ -2,6 +2,7 @@ # ir_http modular http routing #---------------------------------------------------------- import logging +import re import werkzeug.exceptions import werkzeug.routing @@ -22,14 +23,12 @@ class ModelConverter(werkzeug.routing.BaseConverter): def __init__(self, url_map, model=False): super(ModelConverter, self).__init__(url_map) self.model = model - # TODO add support for slug in the form [A-Za-z0-9-] bla-bla-89 -> id 89 self.regex = '([0-9]+)' def to_python(self, value): - # TODO: - # - raise routing.ValidationError() if no browse record can be createdm - # - support slug - return request.registry[self.model].browse(request.cr, _uid, int(value), context=request.context) + m = re.match(self.regex, value) + return request.registry[self.model].browse( + request.cr, _uid, int(m.group(1)), context=request.context) def to_url(self, value): return value.id @@ -60,7 +59,7 @@ class ir_http(osv.AbstractModel): return {'model': ModelConverter, 'models': ModelsConverter} def _find_handler(self): - return self.routing_map.bind_to_environ(request.httprequest.environ).match() + return self.routing_map().bind_to_environ(request.httprequest.environ).match() def _auth_method_user(self): request.uid = request.session.uid @@ -113,7 +112,7 @@ class ir_http(osv.AbstractModel): return self._handle_403(e) # post process arg to set uid on browse records - for arg in arguments: + for arg in arguments.itervalues(): if isinstance(arg, orm.browse_record) and arg._uid is _uid: arg._uid = request.uid @@ -130,7 +129,6 @@ class ir_http(osv.AbstractModel): return result - @property def routing_map(self): if not hasattr(self, '_routing_map'): _logger.info("Generating routing map") diff --git a/openerp/http.py b/openerp/http.py index 126360e8adc..e22cf04b04d 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -100,6 +100,7 @@ class WebRequest(object): self.disable_db = False self.uid = None self.func = None + self.func_arguments = {} self.auth_method = None self._cr_cm = None self._cr = None @@ -143,7 +144,8 @@ class WebRequest(object): def set_handler(self, func, arguments, auth): # is this needed ? - arguments = dict([(k, v) for k, v in arguments.items() if not k.startswith("_ignored_")]) + arguments = dict((k, v) for k, v in arguments.iteritems() + if not k.startswith("_ignored_")) self.func = func self.func_request_type = func.exposed @@ -167,6 +169,9 @@ class WebRequest(object): if self.func_request_type != self._request_type: raise Exception("%s, %s: Function declared as capable of handling request of type '%s' but called with a request of type '%s'" \ % (self.func, self.httprequest.path, self.func_request_type, self._request_type)) + + kwargs.update(self.func_arguments) + # Backward for 7.0 if getattr(self.func, '_first_arg_is_req', False): args = (request,) + args @@ -987,6 +992,11 @@ class Root(object): except werkzeug.exceptions.HTTPException, e: return e(environ, start_response) + def get_db_router(self, db): + if not db: + return self.nodb_routing_map + return request.registry['ir.http'].routing_map() + def db_list(force=False, httprequest=None): httprequest = httprequest or request.httprequest dbs = openerp.netsvc.dispatch_rpc("db", "list", [force])