From 29a8093b163d9abbbb8a41c4b0c319b7f80a031b Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Fri, 12 Jan 2024 14:54:33 +0000 Subject: [PATCH] [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) --- addons/delivery/models/delivery_carrier.py | 11 +++++++++++ addons/website_sale/models/sale_order.py | 8 +------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/addons/delivery/models/delivery_carrier.py b/addons/delivery/models/delivery_carrier.py index 0b1cd5d40fc..1d8287dada1 100644 --- a/addons/delivery/models/delivery_carrier.py +++ b/addons/delivery/models/delivery_carrier.py @@ -128,6 +128,17 @@ class DeliveryCarrier(models.Model):

'''), } + 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)) diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index 5fe71fb6ef3..6d510448df3 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -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 ===#