From 402740f73eaf8512b3eb96335b8079f3f35a64da Mon Sep 17 00:00:00 2001 From: "Francois (fge)" Date: Fri, 12 Feb 2021 14:00:49 +0100 Subject: [PATCH] [ADD] web: add /web/assets for assets bundle Part of PR 63177 --- addons/web/controllers/main.py | 20 +++++++++++++++++--- addons/website/models/website.py | 1 + addons/website/tests/test_performance.py | 6 +++--- addons/website/tests/test_qweb.py | 2 +- odoo/addons/base/models/ir_qweb.py | 2 +- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 014b4a66d07..05d35a66575 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1434,15 +1434,16 @@ class Binary(http.Controller): '/web/content//', '/web/content/', '/web/content//', - '/web/content/-', - '/web/content/-/', - '/web/content/-//', '/web/content///', '/web/content////'], type='http', auth="public") def content_common(self, xmlid=None, model='ir.attachment', id=None, field='datas', filename=None, filename_field='name', unique=None, mimetype=None, download=None, data=None, token=None, access_token=None, **kw): + return self._get_content_common(xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, + filename_field=filename_field, download=download, mimetype=mimetype, access_token=access_token, token=token) + + def _get_content_common(self, xmlid, model, id, field, unique, filename, filename_field, download, mimetype, access_token, token): status, headers, content = request.env['ir.http'].binary_content( xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, filename_field=filename_field, download=download, mimetype=mimetype, access_token=access_token) @@ -1457,6 +1458,19 @@ class Binary(http.Controller): response.set_cookie('fileToken', token) return response + @http.route(['/web/assets/debug/', + '/web/assets/debug//', + '/web/assets//', + '/web/assets/-/', + '/web/assets/-//'], type='http', auth="public") + def content_assets(self, id=None, filename=None, unique=None, extra=None, **kw): + id = id or request.env['ir.attachment'].sudo().search_read( + [('url', '=like', f'/web/assets/%/{extra}/{filename}' if extra else f'/web/assets/%/{filename}')], + fields=['id'], limit=1)[0]['id'] + + return self._get_content_common(xmlid=None, model='ir.attachment', id=id, field='datas', unique=unique, filename=filename, + filename_field='name', download=None, mimetype=None, access_token=None, token=None) + @http.route(['/web/partner_image', '/web/partner_image/', '/web/partner_image//', diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 43a423db22c..7f7d79aad33 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -30,6 +30,7 @@ DEFAULT_CDN_FILTERS = [ "^/web/(css|js)/", "^/web/image", "^/web/content", + "^/web/assets", # retrocompatibility "^/website/image/", ] diff --git a/addons/website/tests/test_performance.py b/addons/website/tests/test_performance.py index ad29f647c48..5c241f654af 100644 --- a/addons/website/tests/test_performance.py +++ b/addons/website/tests/test_performance.py @@ -115,8 +115,8 @@ class TestWebsitePerformance(UtilPerf): self.assertEqual(self._get_url_hot_query(self.page.url), 11) - def test_50_perf_sql_web_content(self): - # assets route /web/content/.. + def test_50_perf_sql_web_assets(self): + # assets route /web/assets/.. self.url_open('/') # create assets attachments - assets_url = self.env['ir.attachment'].search([('url', '=like', '/web/content/%/web.assets_common%.js')], limit=1).url + assets_url = self.env['ir.attachment'].search([('url', '=like', '/web/assets/%/web.assets_common%.js')], limit=1).url self.assertEqual(self._get_url_hot_query(assets_url), 2) diff --git a/addons/website/tests/test_qweb.py b/addons/website/tests/test_qweb.py index 6233ab35bdb..9c66160ba46 100644 --- a/addons/website/tests/test_qweb.py +++ b/addons/website/tests/test_qweb.py @@ -41,7 +41,7 @@ class TestQweb(TransactionCaseWithUserDemo): html = html.strip().decode('utf8') html = re.sub(r'\?unique=[^"]+', '', html).encode('utf8') - attachments = demo_env['ir.attachment'].search([('url', '=like', '/web/content/%-%/website.test_bundle.%')]) + attachments = demo_env['ir.attachment'].search([('url', '=like', '/web/assets/%-%/website.test_bundle.%')]) self.assertEqual(len(attachments), 2) format_data = { diff --git a/odoo/addons/base/models/ir_qweb.py b/odoo/addons/base/models/ir_qweb.py index c69be53cc39..9b63f02a50b 100644 --- a/odoo/addons/base/models/ir_qweb.py +++ b/odoo/addons/base/models/ir_qweb.py @@ -311,7 +311,7 @@ class IrQWeb(models.AbstractModel, QWeb): IrQweb = self.env['ir.qweb'].with_context(options) def can_aggregate(url): - return not urls.url_parse(url).scheme and not urls.url_parse(url).netloc and not url.startswith('/web/content') + return not urls.url_parse(url).scheme and not urls.url_parse(url).netloc and not url.startswith('/web/assets') # TODO: This helper can be used by any template that wants to embedd the backend. # It is currently necessary because the ir.ui.view bundle inheritance does not