From f727cd2645deeb43bcfe1e5643dd3477a6076ab9 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten <jke@odoo.com> Date: Thu, 13 Jun 2019 09:26:39 +0000 Subject: [PATCH] [IMP] base, model, website[*]: add get_base_url helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this commit, when we want to make an external url, we need to know if the record is related to a specific website or not, and choose base_url or website domain. Now each model have a fonction get_base_url (public to be callable from email template, ...) and website override this function to add the website domain if the record is website specific. closes odoo/odoo#34089 Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com> --- addons/portal/models/portal_mixin.py | 10 ------ addons/website/models/res_partner.py | 7 ---- addons/website/models/website.py | 21 ++++++++++++ addons/website/tests/__init__.py | 1 + addons/website/tests/test_base_url.py | 33 +++++++++++++++++++ addons/website_sale/models/account_invoice.py | 7 ---- addons/website_sale/models/sale_order.py | 7 ---- odoo/addons/base/models/res_partner.py | 6 ---- odoo/models.py | 15 +++++++++ 9 files changed, 70 insertions(+), 37 deletions(-) create mode 100644 addons/website/tests/test_base_url.py diff --git a/addons/portal/models/portal_mixin.py b/addons/portal/models/portal_mixin.py index 9d085a14efc8..d29c4c53f404 100644 --- a/addons/portal/models/portal_mixin.py +++ b/addons/portal/models/portal_mixin.py @@ -33,16 +33,6 @@ class PortalMixin(models.AbstractModel): self.sudo().write({'access_token': str(uuid.uuid4())}) return self.access_token - @api.multi - def get_base_url(self): - """Get the base URL for the current model. - - Defined here to be overriden by website specific models. - The method has to be public because it is called from mail templates. - """ - self.ensure_one() - return self.env['ir.config_parameter'].sudo().get_param('web.base.url') - def _get_share_url(self, redirect=False, signup_partner=False, pid=None): """ Build the url of the record that will be sent by mail and adds additional parameters such as diff --git a/addons/website/models/res_partner.py b/addons/website/models/res_partner.py index d62ee6376755..9256f80293d4 100644 --- a/addons/website/models/res_partner.py +++ b/addons/website/models/res_partner.py @@ -51,10 +51,3 @@ class Partner(models.Model): # onchange uses the cache to retrieve value, we need to copy computed_value into the initial env for record, record2 in zip(self, self2): record.display_name = record2.display_name - - @api.multi - def get_base_url(self): - """When using multi-website, we want the user to be redirected to the - most appropriate website if possible.""" - res = super(Partner, self).get_base_url() - return self.website_id and self.website_id._get_http_domain() or res diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 5202798fb975..f8dd6cc2cf7f 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -820,3 +820,24 @@ class Website(models.Model): return '' res = urls.url_parse(self.domain) return 'http://' + self.domain if not res.scheme else self.domain + + +class BaseModel(models.AbstractModel): + _inherit = 'base' + + @api.multi + def get_base_url(self): + """ + Returns baseurl about one given record. + If a website_id field exists in the current record we use the url + from this website as base url. + + :return: the base url for this record + :rtype: string + + """ + self.ensure_one() + if 'website_id' in self and self.website_id.domain: + return self.website_id._get_http_domain() + else: + return super(BaseModel, self).get_base_url() diff --git a/addons/website/tests/__init__.py b/addons/website/tests/__init__.py index f1f4a459ceed..bfc1659e9b09 100644 --- a/addons/website/tests/__init__.py +++ b/addons/website/tests/__init__.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import test_converter +from . import test_base_url from . import test_get_current_website from . import test_qweb from . import test_crawl diff --git a/addons/website/tests/test_base_url.py b/addons/website/tests/test_base_url.py new file mode 100644 index 000000000000..8b98ea4e2d9c --- /dev/null +++ b/addons/website/tests/test_base_url.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import odoo +import odoo.tests + + +@odoo.tests.tagged('-at_install', 'post_install') +class TestBaseUrl(odoo.tests.HttpCase): + def test_base_url(self): + ICP = self.env['ir.config_parameter'] + Website = self.env['website'] + + icp_base_url = ICP.sudo().get_param('web.base.url') + domain ='https://www.domain.jke' + + website = Website.create({'name': 'test base url', 'domain': domain}) + without_website_id = website # a model that don't have website_id as field + with_website_id = self.env['res.partner'].create({'name': 'test base url'}) + + self.assertEqual(without_website_id.get_base_url(), icp_base_url) + + with_website_id.website_id = False + self.assertEqual(with_website_id.get_base_url(), icp_base_url) + + with_website_id.website_id = website + self.assertEqual(with_website_id.get_base_url(), domain) + + website.domain = False + self.assertEqual(with_website_id.get_base_url(), icp_base_url) + + + diff --git a/addons/website_sale/models/account_invoice.py b/addons/website_sale/models/account_invoice.py index db5e98228897..7f5c6f7d81f9 100644 --- a/addons/website_sale/models/account_invoice.py +++ b/addons/website_sale/models/account_invoice.py @@ -10,10 +10,3 @@ class AccountInvoice(models.Model): website_id = fields.Many2one('website', related='partner_id.website_id', string='Website', help='Website through which this invoice was created.', store=True, readonly=True) - - @api.multi - def get_base_url(self): - """When using multi-website, we want the user to be redirected to the - most appropriate website if possible.""" - res = super(AccountInvoice, self).get_base_url() - return self.website_id and self.website_id._get_http_domain() or res diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index 95b3e3bfd742..3efb98429ec2 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -359,13 +359,6 @@ class SaleOrder(models.Model): sent_orders |= order sent_orders.write({'cart_recovery_email_sent': True}) - @api.multi - def get_base_url(self): - """When using multi-website, we want the user to be redirected to the - most appropriate website if possible.""" - res = super(SaleOrder, self).get_base_url() - return self.website_id and self.website_id._get_http_domain() or res - class SaleOrderLine(models.Model): _inherit = "sale.order.line" diff --git a/odoo/addons/base/models/res_partner.py b/odoo/addons/base/models/res_partner.py index f9309a53c166..e14174d65c84 100644 --- a/odoo/addons/base/models/res_partner.py +++ b/odoo/addons/base/models/res_partner.py @@ -983,12 +983,6 @@ class Partner(models.Model): def _get_country_name(self): return self.country_id.name or '' - @api.multi - def get_base_url(self): - """Get the base URL for the current partner.""" - self.ensure_one() - return self.env['ir.config_parameter'].sudo().get_param('web.base.url') - class ResPartnerIndustry(models.Model): _description = 'Industry' diff --git a/odoo/models.py b/odoo/models.py index cf3b12278ed0..3f88abfedc0e 100644 --- a/odoo/models.py +++ b/odoo/models.py @@ -3047,6 +3047,21 @@ Fields: r['noupdate'] = value.get('noupdate', False) return res + @api.multi + def get_base_url(self): + """ + Returns rooturl for a specific given record. + + By default, it return the ir.config.parameter of base_url + but it can be overidden by model. + + :return: the base url for this record + :rtype: string + + """ + self.ensure_one() + return self.env['ir.config_parameter'].sudo().get_param('web.base.url') + @api.multi def _check_concurrency(self): if not (self._log_access and self._context.get(self.CONCURRENCY_CHECK_FIELD)): -- GitLab