From 5ced646b3f93d6da95d01ad8cf4a168d35fc879f Mon Sep 17 00:00:00 2001 From: Julien Castiaux Date: Tue, 29 Mar 2022 15:14:45 +0000 Subject: [PATCH] [FIX] auth_signup: impossible to login Install auth_signup, go to /web/login, 500 Internal Server Error. auth_signup extends the /web/login template and in this extension calls `keep_query()` which has been wrongly moved from base to http_routing in commit 880954ebfc1. Here, we restored `keep_query()` in the base module but moved in ir_qweb. closes odoo/odoo#87491 Related: odoo/enterprise#25754 Signed-off-by: Julien Castiaux --- addons/auth_signup/tests/__init__.py | 1 + addons/auth_signup/tests/test_login.py | 2 ++ addons/http_routing/models/ir_qweb.py | 28 --------------------- addons/survey/controllers/main.py | 2 +- addons/web/tests/__init__.py | 1 + addons/web/tests/test_login.py | 28 +++++++++++++++++++++ odoo/addons/base/models/ir_qweb.py | 35 ++++++++++++++++++++++---- odoo/addons/base/models/ir_ui_view.py | 12 ++++++--- 8 files changed, 72 insertions(+), 37 deletions(-) create mode 100644 addons/auth_signup/tests/__init__.py create mode 100644 addons/auth_signup/tests/test_login.py create mode 100644 addons/web/tests/test_login.py diff --git a/addons/auth_signup/tests/__init__.py b/addons/auth_signup/tests/__init__.py new file mode 100644 index 00000000000..3de6b038202 --- /dev/null +++ b/addons/auth_signup/tests/__init__.py @@ -0,0 +1 @@ +from . import test_login diff --git a/addons/auth_signup/tests/test_login.py b/addons/auth_signup/tests/test_login.py new file mode 100644 index 00000000000..033defbaf18 --- /dev/null +++ b/addons/auth_signup/tests/test_login.py @@ -0,0 +1,2 @@ +# rerun TestWebLogin tests with auth_signup installed +from odoo.addons.web.tests.test_login import TestWebLogin # pylint: disable=W0611 diff --git a/addons/http_routing/models/ir_qweb.py b/addons/http_routing/models/ir_qweb.py index d0b9fbee734..cef8e58efb0 100644 --- a/addons/http_routing/models/ir_qweb.py +++ b/addons/http_routing/models/ir_qweb.py @@ -1,37 +1,10 @@ -# -*- coding: ascii -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import fnmatch -import werkzeug - from odoo import models from odoo.http import request from odoo.addons.http_routing.models.ir_http import slug, unslug_url, url_for -def keep_query(*keep_params, **additional_params): - """ - Generate a query string keeping the current request querystring's parameters specified - in ``keep_params`` and also adds the parameters specified in ``additional_params``. - - Multiple values query string params will be merged into a single one with comma seperated - values. - - The ``keep_params`` arguments can use wildcards too, eg: - - keep_query('search', 'shop_*', page=4) - """ - if not keep_params and not additional_params: - keep_params = ('*',) - params = additional_params.copy() - qs_keys = list(request.httprequest.args) if request else [] - for keep_param in keep_params: - for param in fnmatch.filter(qs_keys, keep_param): - if param not in additional_params and param in qs_keys: - params[param] = request.httprequest.args.getlist(param) - return werkzeug.urls.url_encode(params) - - class IrQweb(models.AbstractModel): _inherit = "ir.qweb" @@ -39,7 +12,6 @@ class IrQweb(models.AbstractModel): irQweb = super()._prepare_environment(values) values['slug'] = slug values['unslug_url'] = unslug_url - values['keep_query'] = keep_query if (not irQweb.env.context.get('minimal_qcontext') and request and request.is_frontend): diff --git a/addons/survey/controllers/main.py b/addons/survey/controllers/main.py index fafe7f03ee5..fdb6cdc625f 100644 --- a/addons/survey/controllers/main.py +++ b/addons/survey/controllers/main.py @@ -9,11 +9,11 @@ from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from odoo import fields, http, SUPERUSER_ID, _ -from odoo.addons.http_routing.models.ir_qweb import keep_query from odoo.exceptions import UserError from odoo.http import request, content_disposition from odoo.osv import expression from odoo.tools import format_datetime, format_date, is_html_empty +from odoo.addons.base.models.ir_qweb import keep_query _logger = logging.getLogger(__name__) diff --git a/addons/web/tests/__init__.py b/addons/web/tests/__init__.py index 031e1b56852..d2330ddc32f 100644 --- a/addons/web/tests/__init__.py +++ b/addons/web/tests/__init__.py @@ -13,3 +13,4 @@ from . import test_profiler from . import test_session_info from . import test_read_progress_bar from . import test_assets +from . import test_login diff --git a/addons/web/tests/test_login.py b/addons/web/tests/test_login.py new file mode 100644 index 00000000000..387804575ab --- /dev/null +++ b/addons/web/tests/test_login.py @@ -0,0 +1,28 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests.common import HttpCase, new_test_user + +class TestWebLogin(HttpCase): + def test_web_login(self): + new_test_user(self.env, 'jackoneill', context={'lang': 'en_US'}) + + # get login form + res_get = self.url_open('/web/login') + res_get.raise_for_status() + csrf_anchor = '