From 92175d3341b576676a550c60db7c759f71cb17ea Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Wed, 17 Mar 2021 17:36:17 +0000 Subject: [PATCH] [IMP] *: replace web.base.url ICP by helper method Previous commit introduce an helper to get the most suited URL for a record instead of always using the ICP, which is not correct in a website context. This commit replaces calls to ICP by the helper method. Community: https://github.com/odoo/odoo/pull/68201 Enterprise: https://github.com/odoo/enterprise/pull/17538 Upgrade: https://github.com/odoo/upgrade/pull/2372 task-2476101 --- .../account/tests/test_portal_attachment.py | 2 +- .../adyen_platforms/models/adyen_account.py | 2 +- .../auth_signup/data/mail_template_data.xml | 2 +- .../crm/tests/test_crm_lead_convert_mass.py | 2 +- addons/digest/models/digest.py | 4 +--- .../im_livechat/models/im_livechat_channel.py | 7 +++---- addons/link_tracker/models/link_tracker.py | 8 +++---- addons/mass_mailing/controllers/main.py | 6 +++--- addons/mass_mailing/models/mail_mail.py | 9 ++++---- addons/mass_mailing/models/mailing.py | 10 ++++----- .../tests/test_mailing_controllers.py | 2 +- addons/mass_mailing_sms/models/sms_sms.py | 3 +-- .../mass_mailing_sms/wizard/sms_composer.py | 3 +-- addons/payment/models/payment_acquirer.py | 11 ---------- addons/payment_adyen/controllers/main.py | 6 +++--- .../models/payment_transaction.py | 2 +- .../models/payment_transaction.py | 2 +- .../models/payment_transaction.py | 4 ++-- .../models/payment_transaction.py | 2 +- .../models/payment_transaction.py | 2 +- .../models/payment_transaction.py | 2 +- addons/pos_adyen/models/pos_payment_method.py | 5 +++-- addons/rating/controllers/main.py | 2 +- addons/survey/tests/common.py | 6 ++---- addons/survey/wizard/survey_invite.py | 3 +-- addons/website/models/ir_actions.py | 2 +- addons/website/tests/test_views.py | 4 ++-- .../wizard/crm_forward_to_partner.py | 16 ++++++++------ .../models/hr_recruitment.py | 6 +++--- addons/website_livechat/tests/common.py | 2 +- .../models/mail_channel.py | 2 +- .../website_mail_channel/models/mail_mail.py | 2 +- .../models/payment_acquirer.py | 21 +++++-------------- addons/website_profile/models/res_users.py | 3 +-- addons/website_slides/controllers/main.py | 8 +++---- addons/website_slides/models/slide_slide.py | 14 ++++++------- odoo/addons/base/models/ir_actions_report.py | 2 +- 37 files changed, 79 insertions(+), 110 deletions(-) diff --git a/addons/account/tests/test_portal_attachment.py b/addons/account/tests/test_portal_attachment.py index 374ccdfe2da..bb3dd1b2cb4 100644 --- a/addons/account/tests/test_portal_attachment.py +++ b/addons/account/tests/test_portal_attachment.py @@ -26,7 +26,7 @@ class TestPortalAttachment(AccountTestInvoicingHttpCommon): ], }) - cls.base_url = cls.env['ir.config_parameter'].sudo().get_param('web.base.url') + cls.base_url = cls.out_invoice.get_base_url() @mute_logger('odoo.addons.http_routing.models.ir_http', 'odoo.http') def test_01_portal_attachment(self): diff --git a/addons/adyen_platforms/models/adyen_account.py b/addons/adyen_platforms/models/adyen_account.py index fa03a09d239..687d8a38de3 100644 --- a/addons/adyen_platforms/models/adyen_account.py +++ b/addons/adyen_platforms/models/adyen_account.py @@ -205,7 +205,7 @@ class AdyenAccount(models.Model): 'res_id': self.env.company.adyen_account_id.id, 'type': 'ir.actions.act_window', } - return_url = url_join(self.env['ir.config_parameter'].sudo().get_param('web.base.url'), 'adyen_platforms/create_account') + return_url = url_join(self.env.company.get_base_url(), 'adyen_platforms/create_account') onboarding_url = self.env['ir.config_parameter'].sudo().get_param('adyen_platforms.onboarding_url') return { 'type': 'ir.actions.act_url', diff --git a/addons/auth_signup/data/mail_template_data.xml b/addons/auth_signup/data/mail_template_data.xml index 79286e5bd50..6d81d4c40ef 100644 --- a/addons/auth_signup/data/mail_template_data.xml +++ b/addons/auth_signup/data/mail_template_data.xml @@ -140,7 +140,7 @@ Accept invitation - % set website_url = object.env['ir.config_parameter'].sudo().get_param('web.base.url') + % set website_url = object.get_base_url() Your Odoo domain is: ${website_url}
Your sign in email is: ${object.email}

Never heard of Odoo? It’s an all-in-one business software loved by 3+ million users. It will considerably improve your experience at work and increase your productivity. diff --git a/addons/crm/tests/test_crm_lead_convert_mass.py b/addons/crm/tests/test_crm_lead_convert_mass.py index ce9d1c29d1b..91f3dced4c5 100644 --- a/addons/crm/tests/test_crm_lead_convert_mass.py +++ b/addons/crm/tests/test_crm_lead_convert_mass.py @@ -166,7 +166,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon): test_leads = self._create_leads_batch(count=50, user_ids=[False]) user_ids = self.assign_users.ids - with self.assertQueryCount(user_sales_manager=1368): # still some randomness (1366 spotted) - crm only: ?? + with self.assertQueryCount(user_sales_manager=1369): # still some randomness (1366 spotted) - crm only: ?? mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({ 'active_model': 'crm.lead', 'active_ids': test_leads.ids, diff --git a/addons/digest/models/digest.py b/addons/digest/models/digest.py index d5a282adcf4..cfd7fbad346 100644 --- a/addons/digest/models/digest.py +++ b/addons/digest/models/digest.py @@ -115,8 +115,6 @@ class Digest(models.Model): digest.next_run_date = digest._get_next_run_date() def _action_send_to_user(self, user, tips_count=1, consum_tips=True): - web_base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - rendered_body = self.env['mail.render.mixin']._render_template( 'digest.digest_mail_main', 'digest.digest', @@ -125,7 +123,7 @@ class Digest(models.Model): add_context={ 'title': self.name, 'top_button_label': _('Connect'), - 'top_button_url': web_base_url, + 'top_button_url': self.get_base_url(), 'company': user.company_id, 'user': user, 'tips_count': tips_count, diff --git a/addons/im_livechat/models/im_livechat_channel.py b/addons/im_livechat/models/im_livechat_channel.py index dafc9040423..b898352aa41 100644 --- a/addons/im_livechat/models/im_livechat_channel.py +++ b/addons/im_livechat/models/im_livechat_channel.py @@ -60,17 +60,16 @@ class ImLivechatChannel(models.Model): def _compute_script_external(self): view = self.env.ref('im_livechat.external_loader') values = { - "url": self.env['ir.config_parameter'].sudo().get_param('web.base.url'), "dbname": self._cr.dbname, } for record in self: values["channel_id"] = record.id + values["url"] = record.get_base_url() record.script_external = view._render(values) if record.id else False def _compute_web_page_link(self): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for record in self: - record.web_page = "%s/im_livechat/support/%i" % (base_url, record.id) if record.id else False + record.web_page = "%s/im_livechat/support/%i" % (record.get_base_url(), record.id) if record.id else False @api.depends('channel_ids') def _compute_nbr_channel(self): @@ -228,7 +227,7 @@ class ImLivechatChannel(models.Model): username = _('Visitor') info = {} info['available'] = len(self._get_available_users()) > 0 - info['server_url'] = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + info['server_url'] = self.get_base_url() if info['available']: info['options'] = self._get_channel_infos() info['options']['current_partner_id'] = self.env.user.partner_id.id diff --git a/addons/link_tracker/models/link_tracker.py b/addons/link_tracker/models/link_tracker.py index ec5822f703a..3968f2e53f8 100644 --- a/addons/link_tracker/models/link_tracker.py +++ b/addons/link_tracker/models/link_tracker.py @@ -45,13 +45,12 @@ class LinkTracker(models.Model): @api.depends("url") def _compute_absolute_url(self): - web_base_url = urls.url_parse(self.env['ir.config_parameter'].sudo().get_param('web.base.url')) for tracker in self: url = urls.url_parse(tracker.url) if url.scheme: tracker.absolute_url = tracker.url else: - tracker.absolute_url = web_base_url.join(url).to_url() + tracker.absolute_url = tracker.get_base_url().join(url).to_url() @api.depends('link_click_ids.link_id') def _compute_count(self): @@ -70,12 +69,11 @@ class LinkTracker(models.Model): @api.depends('code') def _compute_short_url(self): for tracker in self: - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - tracker.short_url = urls.url_join(base_url, '/r/%(code)s' % {'code': tracker.code}) + tracker.short_url = urls.url_join(tracker.get_base_url(), '/r/%(code)s' % {'code': tracker.code}) def _compute_short_url_host(self): for tracker in self: - tracker.short_url_host = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + '/r/' + tracker.short_url_host = tracker.get_base_url() + '/r/' def _compute_code(self): for tracker in self: diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index bae258f9bf1..4bc51f82234 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -114,10 +114,10 @@ class MassMailController(http.Controller): raise exceptions.AccessDenied() res = mailing.convert_links() - base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url').rstrip('/') + base_url = mailing.get_base_url().rstrip('/') urls_to_replace = [ - (base_url + '/unsubscribe_from_list', mailing._get_unsubscribe_url(email, res_id)), - (base_url + '/view', mailing._get_view_url(email, res_id)) + (base_url + '/unsubscribe_from_list', mailing._get_unsubscribe_url(email, res_id)), + (base_url + '/view', mailing._get_view_url(email, res_id)) ] for url_to_replace, new_url in urls_to_replace: if url_to_replace in res[mailing_id]: diff --git a/addons/mass_mailing/models/mail_mail.py b/addons/mass_mailing/models/mail_mail.py index 4339dfdf6bc..bc619a4067a 100644 --- a/addons/mass_mailing/models/mail_mail.py +++ b/addons/mass_mailing/models/mail_mail.py @@ -25,9 +25,8 @@ class MailMail(models.Model): return mails def _get_tracking_url(self): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') token = tools.hmac(self.env(su=True), 'mass_mailing-mail_mail-open', self.id) - return werkzeug.urls.url_join(base_url, 'mail/track/%s/%s/blank.gif' % (self.id, token)) + return werkzeug.urls.url_join(self.get_base_url(), 'mail/track/%s/%s/blank.gif' % (self.id, token)) def _send_prepare_body(self): """ Override to add the tracking URL to the body and to add @@ -62,14 +61,14 @@ class MailMail(models.Model): def _send_prepare_values(self, partner=None): # TDE: temporary addition (mail was parameter) due to semi-new-API res = super(MailMail, self)._send_prepare_values(partner) - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url').rstrip('/') if self.mailing_id and res.get('body') and res.get('email_to'): + base_url = self.mailing_id.get_base_url() emails = tools.email_split(res.get('email_to')[0]) email_to = emails and emails[0] or False urls_to_replace = [ - (base_url + '/unsubscribe_from_list', self.mailing_id._get_unsubscribe_url(email_to, self.res_id)), - (base_url + '/view', self.mailing_id._get_view_url(email_to, self.res_id)) + (base_url + '/unsubscribe_from_list', self.mailing_id._get_unsubscribe_url(email_to, self.res_id)), + (base_url + '/view', self.mailing_id._get_view_url(email_to, self.res_id)) ] for url_to_replace, new_url in urls_to_replace: diff --git a/addons/mass_mailing/models/mailing.py b/addons/mass_mailing/models/mailing.py index 4552e2d4c89..07f3bcb5264 100644 --- a/addons/mass_mailing/models/mailing.py +++ b/addons/mass_mailing/models/mailing.py @@ -596,9 +596,8 @@ class MassMailing(models.Model): return [rid for rid in res_ids if rid not in done_res_ids] def _get_unsubscribe_url(self, email_to, res_id): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') url = werkzeug.urls.url_join( - base_url, 'mail/mailing/%(mailing_id)s/unsubscribe?%(params)s' % { + self.get_base_url(), 'mail/mailing/%(mailing_id)s/unsubscribe?%(params)s' % { 'mailing_id': self.id, 'params': werkzeug.urls.url_encode({ 'res_id': res_id, @@ -610,9 +609,8 @@ class MassMailing(models.Model): return url def _get_view_url(self, email_to, res_id): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') url = werkzeug.urls.url_join( - base_url, 'mailing/%(mailing_id)s/view?%(params)s' % { + self.get_base_url(), 'mailing/%(mailing_id)s/view?%(params)s' % { 'mailing_id': self.id, 'params': werkzeug.urls.url_encode({ 'res_id': res_id, @@ -799,10 +797,10 @@ class MassMailing(models.Model): random_tip = random.choice(random_tip).tip_description formatted_date = tools.format_datetime( - self.env, self.sent_date, self.user_id.tz, 'MMM dd, YYYY', self.user_id.lang + self.env, self.sent_date, self.user_id.tz, 'MMM dd, YYYY', self.user_id.lang ) if self.sent_date else False - web_base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + web_base_url = self.get_base_url() return { 'title': _('24H Stats of %(mailing_type)s "%(mailing_name)s"', diff --git a/addons/mass_mailing/tests/test_mailing_controllers.py b/addons/mass_mailing/tests/test_mailing_controllers.py index 310664c49c3..30b5f653482 100644 --- a/addons/mass_mailing/tests/test_mailing_controllers.py +++ b/addons/mass_mailing/tests/test_mailing_controllers.py @@ -15,7 +15,7 @@ class TestMassMailingControllers(MassMailCommon, HttpCase): response = self.url_open(mail_mail._get_tracking_url()) self.assertEqual(response.status_code, 200) - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = mail_mail.get_base_url() url = werkzeug.urls.url_join(base_url, 'mail/track/%s/fake_token/blank.gif' % mail_mail.id) response = self.url_open(url) diff --git a/addons/mass_mailing_sms/models/sms_sms.py b/addons/mass_mailing_sms/models/sms_sms.py index c9c14e144cd..840aa066824 100644 --- a/addons/mass_mailing_sms/models/sms_sms.py +++ b/addons/mass_mailing_sms/models/sms_sms.py @@ -15,7 +15,6 @@ class SmsSms(models.Model): def _update_body_short_links(self): """ Override to tweak shortened URLs by adding statistics ids, allowing to find customer back once clicked. """ - shortened_schema = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + '/r/' res = dict.fromkeys(self.ids, False) for sms in self: if not sms.mailing_id or not sms.body: @@ -24,7 +23,7 @@ class SmsSms(models.Model): body = sms.body for url in re.findall(tools.TEXT_URL_REGEX, body): - if url.startswith(shortened_schema): + if url.startswith(sms.get_base_url() + '/r/'): body = body.replace(url, url + '/s/%s' % sms.id) res[sms.id] = body return res diff --git a/addons/mass_mailing_sms/wizard/sms_composer.py b/addons/mass_mailing_sms/wizard/sms_composer.py index b8d13b7f056..9a4d8aae85b 100644 --- a/addons/mass_mailing_sms/wizard/sms_composer.py +++ b/addons/mass_mailing_sms/wizard/sms_composer.py @@ -19,9 +19,8 @@ class SMSComposer(models.TransientModel): # ------------------------------------------------------------ def _get_unsubscribe_url(self, res_id, trace_code, number): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') return werkzeug.urls.url_join( - base_url, + self.get_base_url(), '/sms/%s/%s' % (self.mailing_id.id, trace_code) ) diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index 06bcdbaeccd..3bf26313be1 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -420,17 +420,6 @@ class PaymentAcquirer(models.Model): """ return True - def _get_base_url(self): - """ Get the base url of the website on which the payment is made. - - Note: self.ensure_one() - - :return: The website base url - :rtype: str - """ - self.ensure_one() - return self.env['ir.config_parameter'].sudo().get_param('web.base.url') - def _compute_fees(self, amount, currency, country): """ Compute the transaction fees. diff --git a/addons/payment_adyen/controllers/main.py b/addons/payment_adyen/controllers/main.py index a2c44b2d5fd..99202d0e795 100644 --- a/addons/payment_adyen/controllers/main.py +++ b/addons/payment_adyen/controllers/main.py @@ -86,7 +86,7 @@ class AdyenController(http.Controller): :rtype: dict """ acquirer_sudo = request.env['payment.acquirer'].browse(acquirer_id).sudo() - domain = acquirer_sudo._get_base_url() + domain = acquirer_sudo.get_base_url() data = { 'originDomains': [domain], } @@ -144,10 +144,10 @@ class AdyenController(http.Controller): 'allow3DS2': True }, 'channel': 'web', # Required to support 3DS - 'origin': acquirer_sudo._get_base_url(), # Required to support 3DS + 'origin': acquirer_sudo.get_base_url(), # Required to support 3DS 'browserInfo': browser_info, # Required to support 3DS 'returnUrl': urls.url_join( - acquirer_sudo._get_base_url(), + acquirer_sudo.get_base_url(), # Include the reference in the return url to be able to match it after redirection. # The key 'merchantReference' is chosen on purpose to be the same than that returned # by the /payments endpoint of Adyen. diff --git a/addons/payment_alipay/models/payment_transaction.py b/addons/payment_alipay/models/payment_transaction.py index bd660bc62a7..77b72ec0c69 100644 --- a/addons/payment_alipay/models/payment_transaction.py +++ b/addons/payment_alipay/models/payment_transaction.py @@ -29,7 +29,7 @@ class PaymentTransaction(models.Model): if self.provider != 'alipay': return res - base_url = self.acquirer_id._get_base_url() + base_url = self.acquirer_id.get_base_url() if self.fees: # Similarly to what is done in `payment::payment.transaction.create`, we need to round # the sum of the amount and of the fees to avoid inconsistent string representations. diff --git a/addons/payment_buckaroo/models/payment_transaction.py b/addons/payment_buckaroo/models/payment_transaction.py index 2cc75cf0869..c0f5858912a 100644 --- a/addons/payment_buckaroo/models/payment_transaction.py +++ b/addons/payment_buckaroo/models/payment_transaction.py @@ -42,7 +42,7 @@ class PaymentTransaction(models.Model): if self.provider != 'buckaroo': return res - return_url = urls.url_join(self.acquirer_id._get_base_url(), BuckarooController._return_url) + return_url = urls.url_join(self.acquirer_id.get_base_url(), BuckarooController._return_url) rendering_values = { 'api_url': self.acquirer_id._buckaroo_get_api_url(), 'Brq_websitekey': self.acquirer_id.buckaroo_website_key, diff --git a/addons/payment_odoo/models/payment_transaction.py b/addons/payment_odoo/models/payment_transaction.py index 36ba4ed44df..8b56bed77af 100644 --- a/addons/payment_odoo/models/payment_transaction.py +++ b/addons/payment_odoo/models/payment_transaction.py @@ -41,7 +41,7 @@ class PaymentTransaction(models.Model): # match in https://docs.adyen.com/checkout/components-web/localization-components, we simply # provide the lang string as is (after adapting the format) and let Adyen find the best fit. lang_code = (self._context.get('lang') or 'en-US').replace('_', '-') - base_url = self.acquirer_id._get_base_url() + base_url = self.acquirer_id.get_base_url() signature = payment_utils.generate_access_token( converted_amount, self.currency_id.name, self.reference ) @@ -91,7 +91,7 @@ class PaymentTransaction(models.Model): converted_amount = payment_utils.to_minor_currency_units( self.amount, self.currency_id, CURRENCY_DECIMALS.get(self.currency_id.name) ) - base_url = self.acquirer_id._get_base_url() + base_url = self.acquirer_id.get_base_url() signature = payment_utils.generate_access_token( converted_amount, self.currency_id.name, self.reference ) diff --git a/addons/payment_ogone/models/payment_transaction.py b/addons/payment_ogone/models/payment_transaction.py index 53ea3973308..3f2b39102bb 100644 --- a/addons/payment_ogone/models/payment_transaction.py +++ b/addons/payment_ogone/models/payment_transaction.py @@ -53,7 +53,7 @@ class PaymentTransaction(models.Model): if self.acquirer_id.provider != 'ogone': return res - base_url = self.acquirer_id._get_base_url() + base_url = self.acquirer_id.get_base_url() return_url = urls.url_join(base_url, OgoneController._flexcheckout_return_url) rendering_values = { 'ACCOUNT_PSPID': self.acquirer_id.ogone_pspid, diff --git a/addons/payment_paypal/models/payment_transaction.py b/addons/payment_paypal/models/payment_transaction.py index e4eac0b61fb..8146e51ca56 100644 --- a/addons/payment_paypal/models/payment_transaction.py +++ b/addons/payment_paypal/models/payment_transaction.py @@ -34,7 +34,7 @@ class PaymentTransaction(models.Model): if self.provider != 'paypal': return res - base_url = self.acquirer_id._get_base_url() + base_url = self.acquirer_id.get_base_url() partner_first_name, partner_last_name = payment_utils.split_partner_name(self.partner_name) notify_url = self.acquirer_id.paypal_use_ipn \ and urls.url_join(base_url, PaypalController._notify_url) diff --git a/addons/payment_stripe/models/payment_transaction.py b/addons/payment_stripe/models/payment_transaction.py index c3a53e78076..f87fc2d7f1c 100644 --- a/addons/payment_stripe/models/payment_transaction.py +++ b/addons/payment_stripe/models/payment_transaction.py @@ -88,7 +88,7 @@ class PaymentTransaction(models.Model): # enter his email on the checkout page. 'customer': customer['id'], } - base_url = self.acquirer_id._get_base_url() + base_url = self.acquirer_id.get_base_url() if self.operation == 'online_redirect': return_url = f'{urls.url_join(base_url, StripeController._checkout_return_url)}' \ f'?reference={urls.url_quote_plus(self.reference)}' diff --git a/addons/pos_adyen/models/pos_payment_method.py b/addons/pos_adyen/models/pos_payment_method.py index 73c09287bb3..00320b25aee 100644 --- a/addons/pos_adyen/models/pos_payment_method.py +++ b/addons/pos_adyen/models/pos_payment_method.py @@ -135,10 +135,11 @@ class PosPaymentMethod(models.Model): def _proxy_adyen_request_odoo_proxy(self, data, operation): try: - return self.env.company.sudo().adyen_account_id._adyen_rpc(operation, { + company_sudo = self.env.company.sudo() + return company_sudo.adyen_account_id._adyen_rpc(operation, { 'request_data': data, 'account_code': self.sudo().adyen_payout_id.code, - 'notification_url': self.env['ir.config_parameter'].sudo().get_param('web.base.url'), + 'notification_url': company_sudo.get_base_url(), }) except Forbidden: return { diff --git a/addons/rating/controllers/main.py b/addons/rating/controllers/main.py index b4155faa2ee..cfad6cd0b6a 100644 --- a/addons/rating/controllers/main.py +++ b/addons/rating/controllers/main.py @@ -61,6 +61,6 @@ class Rating(http.Controller): record_sudo.rating_apply(rate, token=token, feedback=kwargs.get('feedback')) lang = rating.partner_id.lang or get_lang(request.env).code return request.env['ir.ui.view'].with_context(lang=lang)._render_template('rating.rating_external_page_view', { - 'web_base_url': request.env['ir.config_parameter'].sudo().get_param('web.base.url'), + 'web_base_url': rating.get_base_url(), 'rating': rating, }) diff --git a/addons/survey/tests/common.py b/addons/survey/tests/common.py index f30167113f4..5048fead72d 100644 --- a/addons/survey/tests/common.py +++ b/addons/survey/tests/common.py @@ -157,13 +157,11 @@ class SurveyCase(common.TransactionCase): return self.url_open('/survey/%s/%s' % (survey.access_token, token)) def _access_begin(self, survey, token): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - url = base_url + '/survey/begin/%s/%s' % (survey.access_token, token) + url = survey.get_base_url() + '/survey/begin/%s/%s' % (survey.access_token, token) return self.opener.post(url=url, json={}) def _access_submit(self, survey, token, post_data): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - url = base_url + '/survey/submit/%s/%s' % (survey.access_token, token) + url = survey.get_base_url() + '/survey/submit/%s/%s' % (survey.access_token, token) return self.opener.post(url=url, json={'params': post_data}) def _find_csrf_token(self, text): diff --git a/addons/survey/wizard/survey_invite.py b/addons/survey/wizard/survey_invite.py index 81a567d7066..a65708cb155 100644 --- a/addons/survey/wizard/survey_invite.py +++ b/addons/survey/wizard/survey_invite.py @@ -98,9 +98,8 @@ class SurveyInvite(models.TransientModel): @api.depends('survey_id.access_token') def _compute_survey_start_url(self): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for invite in self: - invite.survey_start_url = werkzeug.urls.url_join(base_url, invite.survey_id.get_start_url()) if invite.survey_id else False + invite.survey_start_url = werkzeug.urls.url_join(invite.survey_id.get_base_url(), invite.survey_id.get_start_url()) if invite.survey_id else False # Overrides of mail.composer.mixin @api.depends('survey_id') # fake trigger otherwise not computed in new mode diff --git a/addons/website/models/ir_actions.py b/addons/website/models/ir_actions.py index 24fbc937514..65962ee3fc0 100644 --- a/addons/website/models/ir_actions.py +++ b/addons/website/models/ir_actions.py @@ -28,7 +28,7 @@ class ServerAction(models.Model): action.xml_id = res.get(action.id) def _compute_website_url(self, website_path, xml_id): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = self.get_base_url() link = website_path or xml_id or (self.id and '%d' % self.id) or '' if base_url and link: path = '%s/%s' % ('/website/action', link) diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py index 266d2cb6c78..39ec6e2e910 100644 --- a/addons/website/tests/test_views.py +++ b/addons/website/tests/test_views.py @@ -1162,7 +1162,7 @@ class Crawler(HttpCase): # | Filter By Country self.authenticate("admin", "admin") - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = website_1.get_base_url() # Simulate website 2 (that use only generic views) self.url_open(base_url + '/website/force/%s' % website_2.id) @@ -1373,7 +1373,7 @@ class Crawler(HttpCase): # ######################################################## # Test the controller (which is calling get_related_views) self.authenticate("admin", "admin") - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = website_1.get_base_url() # Simulate website 2 self.url_open(base_url + '/website/force/%s' % website_2.id) diff --git a/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py b/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py index 2bcf16789ba..dcd023209fd 100644 --- a/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py +++ b/addons/website_crm_partner_assign/wizard/crm_forward_to_partner.py @@ -27,7 +27,7 @@ class CrmLeadForwardToPartner(models.TransientModel): 'lead_location': ", ".join(lead_location), 'partner_assigned_id': partner and partner.id or False, 'partner_location': ", ".join(partner_location), - 'lead_link': self.get_lead_portal_url(lead.id, lead.type), + 'lead_link': self.get_lead_portal_url(lead), } @api.model @@ -103,18 +103,22 @@ class CrmLeadForwardToPartner(models.TransientModel): self.env['crm.lead'].message_subscribe([partner_id]) return True - def get_lead_portal_url(self, lead_id, type): - action = type == 'opportunity' and 'action_portal_opportunities' or 'action_portal_leads' + def get_lead_portal_url(self, lead): + action = lead.type == 'opportunity' and 'action_portal_opportunities' or 'action_portal_leads' action_ref = self.env.ref('website_crm_partner_assign.%s' % (action,), False) portal_link = "%s/?db=%s#id=%s&action=%s&view_type=form" % ( - self.env['ir.config_parameter'].sudo().get_param('web.base.url'), + lead.get_base_url(), self.env.cr.dbname, - lead_id, + lead.id, action_ref and action_ref.id or False) return portal_link def get_portal_url(self): - portal_link = "%s/?db=%s" % (self.env['ir.config_parameter'].sudo().get_param('web.base.url'), self.env.cr.dbname) + if self: + portal_url = self[0].get_base_url() + else: + portal_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + portal_link = "%s/?db=%s" % (portal_url, self.env.cr.dbname) return portal_link forward_type = fields.Selection([ diff --git a/addons/website_hr_recruitment/models/hr_recruitment.py b/addons/website_hr_recruitment/models/hr_recruitment.py index 8f47ef3c870..49bac53abcf 100644 --- a/addons/website_hr_recruitment/models/hr_recruitment.py +++ b/addons/website_hr_recruitment/models/hr_recruitment.py @@ -12,11 +12,11 @@ class RecruitmentSource(models.Model): url = fields.Char(compute='_compute_url', string='Url Parameters') - @api.depends('source_id', 'source_id.name', 'job_id') + @api.depends('source_id', 'source_id.name', 'job_id', 'job_id.company_id') def _compute_url(self): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for source in self: - source.url = urls.url_join(base_url, "%s?%s" % (source.job_id.website_url, + source.url = urls.url_join(source.job_id.get_base_url(), "%s?%s" % ( + source.job_id.website_url, urls.url_encode({ 'utm_campaign': self.env.ref('hr_recruitment.utm_campaign_job').name, 'utm_medium': self.env.ref('utm.utm_medium_website').name, diff --git a/addons/website_livechat/tests/common.py b/addons/website_livechat/tests/common.py index 9cc162ff709..d1e4abdf36a 100644 --- a/addons/website_livechat/tests/common.py +++ b/addons/website_livechat/tests/common.py @@ -36,7 +36,7 @@ class TestLivechatCommon(tests.TransactionCase): }] + [visitor_vals]*self.max_sessions_per_operator) self.visitor_demo, self.visitor = self.visitors[0], self.visitors[1] - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = self.livechat_channel.get_base_url() self.open_chat_url = base_url + "/im_livechat/get_session" self.open_chat_params = {'params': { diff --git a/addons/website_mail_channel/models/mail_channel.py b/addons/website_mail_channel/models/mail_channel.py index c3510fc3139..3cae5bd50c8 100644 --- a/addons/website_mail_channel/models/mail_channel.py +++ b/addons/website_mail_channel/models/mail_channel.py @@ -12,7 +12,7 @@ class MailGroup(models.Model): def _notify_email_header_dict(self): headers = super(MailGroup, self)._notify_email_header_dict() - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = self.get_base_url() headers['List-Archive'] = '<%s/groups/%s>' % (base_url, slug(self)) headers['List-Subscribe'] = '<%s/groups>' % (base_url) headers['List-Unsubscribe'] = '<%s/groups?unsubscribe>' % (base_url,) diff --git a/addons/website_mail_channel/models/mail_mail.py b/addons/website_mail_channel/models/mail_mail.py index 271e245e6f8..b8a157a133a 100644 --- a/addons/website_mail_channel/models/mail_mail.py +++ b/addons/website_mail_channel/models/mail_mail.py @@ -14,7 +14,7 @@ class MailMail(models.Model): if self.model == 'mail.channel' and self.res_id: # no super() call on purpose, no private links that could be quoted! channel = self.env['mail.channel'].browse(self.res_id) - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') + base_url = channel.get_base_url() vals = { 'maillist': _('Mailing-List'), 'post_to': _('Post to'), diff --git a/addons/website_payment/models/payment_acquirer.py b/addons/website_payment/models/payment_acquirer.py index e4cd68cf34d..a341bdbc87b 100644 --- a/addons/website_payment/models/payment_acquirer.py +++ b/addons/website_payment/models/payment_acquirer.py @@ -13,20 +13,9 @@ class PaymentAcquirer(models.Model): ondelete="restrict", ) - def _get_base_url(self): - """ Override of payment to take multi-website feature into account. - - Note: self.ensure_one() - - :return: The website base url - :rtype: str - """ + def get_base_url(self): self.ensure_one() - url = '' - if request: # Give priority to url_root to handle multi-website cases - url = request.httprequest.url_root - if not url and self.website_id: # Secondly, use the website set on the acquirer - url = self.website_id._get_http_domain() - if not url: # Fallback to web.base.url - url = super()._get_base_url() - return url + # Give priority to url_root to handle multi-website cases + if request and request.httprequest.url_root: + return request.httprequest.url_root + return super().get_base_url() diff --git a/addons/website_profile/models/res_users.py b/addons/website_profile/models/res_users.py index f29972b4abe..29223653dd0 100644 --- a/addons/website_profile/models/res_users.py +++ b/addons/website_profile/models/res_users.py @@ -52,8 +52,7 @@ class Users(models.Model): 'email': self.email } params.update(kwargs) - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - token_url = base_url + '/profile/validate_email?%s' % urls.url_encode(params) + token_url = self.get_base_url() + '/profile/validate_email?%s' % urls.url_encode(params) with self._cr.savepoint(): activation_template.sudo().with_context(token_url=token_url).send_mail( self.id, force_send=True, raise_exception=True) diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 71d2002e05f..83bf0a4ebf4 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -1154,13 +1154,13 @@ class WebsiteSlides(WebsiteProfile): # slide, the error will be the website.403 page instead of the one of the website_slides.embed_slide. # Do not forget the rendering here will be displayed in the embedded iframe - # determine if it is embedded from external web page - referrer_url = request.httprequest.headers.get('Referer', '') - base_url = request.env['ir.config_parameter'].sudo().get_param('web.base.url') - is_embedded = referrer_url and not bool(base_url in referrer_url) or False # try accessing slide, and display to corresponding template try: slide = request.env['slide.slide'].browse(slide_id) + # determine if it is embedded from external web page + referrer_url = request.httprequest.headers.get('Referer', '') + base_url = slide.get_base_url() + is_embedded = referrer_url and not bool(base_url in referrer_url) or False if is_embedded: request.env['slide.embed'].sudo()._add_embed_url(slide.id, referrer_url) values = self._get_slide_detail(slide) diff --git a/addons/website_slides/models/slide_slide.py b/addons/website_slides/models/slide_slide.py index 13fbe4fadc5..e5f272036d4 100644 --- a/addons/website_slides/models/slide_slide.py +++ b/addons/website_slides/models/slide_slide.py @@ -334,10 +334,12 @@ class Slide(models.Model): @api.depends('document_id', 'slide_type', 'mime_type') def _compute_embed_code(self): - base_url = request and request.httprequest.url_root or self.env['ir.config_parameter'].sudo().get_param('web.base.url') - if base_url[-1] == '/': - base_url = base_url[:-1] + base_url = request and request.httprequest.url_root for record in self: + if not base_url: + base_url = record.get_base_url() + if base_url[-1] == '/': + base_url = base_url[:-1] if record.datas and (not record.document_id or record.slide_type in ['document', 'presentation']): slide_url = base_url + url_for('/slides/embed/%s?page=1' % record.id) record.embed_code = '' % (slide_url, 315, 420) @@ -515,10 +517,9 @@ class Slide(models.Model): # --------------------------------------------------------- def _post_publication(self): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for slide in self.filtered(lambda slide: slide.website_published and slide.channel_id.publish_template_id): publish_template = slide.channel_id.publish_template_id - html_body = publish_template.with_context(base_url=base_url)._render_field('body_html', slide.ids)[slide.id] + html_body = publish_template.with_context(base_url=slide.get_base_url())._render_field('body_html', slide.ids)[slide.id] subject = publish_template._render_field('subject', slide.ids)[slide.id] # We want to use the 'reply_to' of the template if set. However, `mail.message` will check # if the key 'reply_to' is in the kwargs before calling _get_reply_to. If the value is @@ -548,12 +549,11 @@ class Slide(models.Model): def _send_share_email(self, email, fullscreen): # TDE FIXME: template to check mail_ids = [] - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for record in self: template = record.channel_id.share_template_id.with_context( user=self.env.user, email=email, - base_url=base_url, + base_url=record.get_base_url(), fullscreen=fullscreen ) email_values = {'email_to': email} diff --git a/odoo/addons/base/models/ir_actions_report.py b/odoo/addons/base/models/ir_actions_report.py index 642f99ec315..9eaeb72bfb9 100644 --- a/odoo/addons/base/models/ir_actions_report.py +++ b/odoo/addons/base/models/ir_actions_report.py @@ -349,13 +349,13 @@ class IrActionsReport(models.Model): :return: bodies, header, footer, specific_paperformat_args ''' IrConfig = self.env['ir.config_parameter'].sudo() - base_url = IrConfig.get_param('report.url') or IrConfig.get_param('web.base.url') # Return empty dictionary if 'web.minimal_layout' not found. layout = self.env.ref('web.minimal_layout', False) if not layout: return {} layout = self.env['ir.ui.view'].browse(self.env['ir.ui.view'].get_view_id('web.minimal_layout')) + base_url = IrConfig.get_param('report.url') or layout.get_base_url() root = lxml.html.fromstring(html) match_klass = "//div[contains(concat(' ', normalize-space(@class), ' '), ' {} ')]"