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), ' '), ' {} ')]"