[FIX] website: 308 wrongly set on all routes
Users sometime want to rename existing controllers URL, e.g. /shop as french /magasin. The feature is possible within Odoo thanks to 308 type redirections that can be configured via a hidden ?debug=1-only website menu. Upon generating the routing-map (the structure that links URLs to controllers), when a URL is found inside of the `website.rewrite` model, two links (called Rules in werkzeug jargon) are registered: the new, translated, URL is linked to the controller and the original URL is linked to a redirection to the new URL. For the context of this PR, it is important to note that the redirection only applies to the very URL saved inside the `website.rewrite` model: if a controller has multiple routes, e.g. `/shop` and `/shop/shop`, only `/shop` is redirected to `/magasin`, `/shop/shop` is left as-is. Without 308 redirection: /shop -> def shop() /shop/shop -> def shop() With 308 redirection: website.rewrite(from_url='/shop', to_url='/magasin') /shop -> /magasin /shop/shop -> def shop() /magasin -> def shop() The redirection is set on the routing dictionnary of the endpoint, this is the dictionnary that collect the informations set via the `@route` decorator (auth=, method=, type=, ...). Prior to [HTTPocalypse], that dictionnary was duplicated so that the redirection was applied on the single route endpoint that matched the `website.rewrite` record. With [HTTPocalypse] that duplication has been wrongly removed: all original routes redirected to the new translated one. Bug introduced in [HTTPocalypse]: website.rewrite(from_url='/shop', to_url='/magasin') /shop -> /magasin /shop/shop -> /magasin <-- wrong /magasin -> def shop() This PR fixes the problem, it makes sure that the redirection is saved *only* on the route that matched the website.rewrite record, not the other routes. [HTTPocalypse]: https://github.com/odoo/odoo/pull/78857 closes odoo/odoo#133371 Signed-off-by:Romain Derie (rde) <rde@odoo.com>
Please register or sign in to comment