From 042c95b0219bb0aa13e73385e092fa76ff1a1b0a Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Fri, 21 May 2021 14:59:31 +0000 Subject: [PATCH] [IMP] website: autocorrect website domain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before, get_http_domain make the job, now we force website.domain to be valid closes odoo/odoo#71161 Signed-off-by: Jérémy Kersten (jke) --- addons/website/models/website.py | 21 +++++++++--- addons/website/tests/test_base_url.py | 33 ++++++++++++++++--- .../tests/tours/website_sale_shop_mail.js | 2 +- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 3c51e5f0403..bcf0fa2fa93 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -61,8 +61,7 @@ class Website(models.Model): name = fields.Char('Website Name', required=True) sequence = fields.Integer(default=10) - domain = fields.Char('Website Domain', - help='Will be prefixed by http in canonical URLs if no scheme is specified') + domain = fields.Char('Website Domain', help='E.g. https://www.mydomain.com') country_group_ids = fields.Many2many('res.country.group', 'website_country_group_rel', 'website_id', 'country_group_id', string='Country Groups', help='Used when multiple websites have the same domain.') company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.company, required=True) @@ -171,7 +170,7 @@ class Website(models.Model): @api.model def create(self, vals): - self._handle_favicon(vals) + self._handle_create_write(vals) if 'user_id' not in vals: company = self.env['res.company'].browse(vals.get('company_id')) @@ -191,7 +190,7 @@ class Website(models.Model): def write(self, values): public_user_to_change_websites = self.env['website'] original_company = self.company_id - self._handle_favicon(values) + self._handle_create_write(values) self.clear_caches() @@ -233,11 +232,23 @@ class Website(models.Model): return result + @api.model + def _handle_create_write(self, vals): + self._handle_favicon(vals) + self._handle_domain(vals) + @api.model def _handle_favicon(self, vals): if 'favicon' in vals: vals['favicon'] = tools.image_process(vals['favicon'], size=(256, 256), crop='center', output_format='ICO') + @api.model + def _handle_domain(self, vals): + if 'domain' in vals and vals['domain']: + if not vals['domain'].startswith('http'): + vals['domain'] = 'https://%s' % vals['domain'] + vals['domain'] = vals['domain'].rstrip('/') + @api.ondelete(at_uninstall=False) def _unlink_except_last_remaining_website(self): website = self.search([('id', 'not in', self.ids)], limit=1) @@ -922,7 +933,7 @@ class Website(models.Model): endpoint.routing['auth'] in ('none', 'public') and endpoint.routing.get('website', False) and all(hasattr(converter, 'generate') for converter in converters)): - return False + return False # dont't list routes without argument having no default value or converter sign = inspect.signature(endpoint.method.original_func) diff --git a/addons/website/tests/test_base_url.py b/addons/website/tests/test_base_url.py index 9b5d232a23e..171dfc35c1d 100644 --- a/addons/website/tests/test_base_url.py +++ b/addons/website/tests/test_base_url.py @@ -57,12 +57,35 @@ class TestBaseUrl(TestUrlCommon): # Test URL is correct for the website itself when no domain is set self.assertEqual(self.website.get_base_url(), icp_base_url) + # Test URL is correctly auto fixed + domains = [ + # trailing / + ("https://www.monsite.com/", "https://www.monsite.com"), + # no scheme + ("www.monsite.com", "https://www.monsite.com"), + ("monsite.com", "https://monsite.com"), + # respect scheme + ("https://www.monsite.com", "https://www.monsite.com"), + ("http://www.monsite.com", "http://www.monsite.com"), + # respect port + ("www.monsite.com:8069", "https://www.monsite.com:8069"), + ("www.monsite.com:8069/", "https://www.monsite.com:8069"), + # no guess wwww + ("monsite.com", "https://monsite.com"), + # mix + ("www.monsite.com/", "https://www.monsite.com"), + ] + for (domain, expected) in domains: + self.website.domain = domain + self.assertEqual(self.website.get_base_url(), expected) + def test_02_canonical_url(self): - self._assertCanonical('/', self.domain + '/') - self._assertCanonical('/?debug=1', self.domain + '/') - self._assertCanonical('/a-page', self.domain + '/a-page') - self._assertCanonical('/en_US', self.domain + '/') - self._assertCanonical('/fr_FR', self.domain + '/fr/') + # test does not work in local due to port + self._assertCanonical('/', self.website.get_base_url() + '/') + self._assertCanonical('/?debug=1', self.website.get_base_url() + '/') + self._assertCanonical('/a-page', self.website.get_base_url() + '/a-page') + self._assertCanonical('/en_US', self.website.get_base_url() + '/') + self._assertCanonical('/fr_FR', self.website.get_base_url() + '/fr/') @odoo.tests.tagged('-at_install', 'post_install') diff --git a/addons/website_sale/static/tests/tours/website_sale_shop_mail.js b/addons/website_sale/static/tests/tours/website_sale_shop_mail.js index 7f362b02515..3a396742624 100644 --- a/addons/website_sale/static/tests/tours/website_sale_shop_mail.js +++ b/addons/website_sale/static/tests/tours/website_sale_shop_mail.js @@ -95,7 +95,7 @@ tour.register('shop_mail', { { content: "check it's the correct email, and the URL is correct too", trigger: 'div.oe_form_field_html[name="body_html"] p:contains("Your"):contains("order")', - extra_trigger: 'div.oe_form_field_html[name="body_html"] a[href^="http://my-test-domain.com"]', + extra_trigger: 'div.oe_form_field_html[name="body_html"] a[href^="https://my-test-domain.com"]', }, ]); });