[FIX] delivery,website_sale: do not make api request on page rendering

Following a fix in 16.3 with 5052b9e4a15155c694cf005fdf330997770c6cac,
backported in 16.0+ with commit d28a8f67da06e58358b40636d1dca1f91a84e1ad,
the rates for the different carriers were computed on page loading,
to make sure unavailable carriers were hidden.

Nevertheless, this leads to significant increases of /shop/payment page
loading time depending on the enabled carriers.

This commit restricts the previous fix to the targeted type of carriers,
aka `base_on_rule` ones, whose rates do not depend on third party API
requests.

closes odoo/odoo#149657

X-original-commit: 99c8bda43f6f3bb027f8e03a753aaf2bb7ac585f
Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
This commit is contained in:
Victor Feyens
2024-01-18 12:01:04 +00:00
parent fc27a3d452
commit 29a8093b16
2 changed files with 12 additions and 7 deletions
@@ -128,6 +128,17 @@ class DeliveryCarrier(models.Model):
</p>'''),
}
def _is_available_for_order(self, order):
self.ensure_one()
order.ensure_one()
if not self._match_address(order.partner_shipping_id):
return False
if self.delivery_type == 'base_on_rule':
return self.rate_shipment(order).get('success')
return True
def available_carriers(self, partner):
return self.filtered(lambda c: c._match_address(partner))
+1 -7
View File
@@ -628,16 +628,10 @@ class SaleOrder(models.Model):
return bool(carrier)
def _get_delivery_methods(self):
def _is_carrier_available(carrier):
# Drop carriers where price computation fails (no price rule available/matching request)
res = carrier.rate_shipment(self)
return res['success']
# searching on website_published will also search for available website (_search method on computed field)
return self.env['delivery.carrier'].sudo().search([
('website_published', '=', True),
]).available_carriers(
self.partner_shipping_id
).filtered(_is_carrier_available)
]).filtered(lambda carrier: carrier._is_available_for_order(self))
#=== TOOLING ===#