diff --git a/addons/delivery/models/delivery_carrier.py b/addons/delivery/models/delivery_carrier.py index 68fded1bb32..1a59f182fcb 100644 --- a/addons/delivery/models/delivery_carrier.py +++ b/addons/delivery/models/delivery_carrier.py @@ -21,7 +21,7 @@ import logging from openerp import models, fields, api -from openerp.exceptions import UserError, ValidationError +from openerp.exceptions import UserError _logger = logging.getLogger(__name__) @@ -72,9 +72,6 @@ class DeliveryCarrier(models.Model): # no suitable delivery method found, probably configuration error _logger.info("Carrier %s: %s, not found", self.name, e.name) self.price = 0.0 - except ValidationError as e: - _logger.info("Carrier %s: %s, not available: %s", self.name, e.name, e.message) - self.price = 0.0 else: res = super(DeliveryCarrier, self).get_price('price', []) self.available = res[self.id]['available'] diff --git a/addons/website_sale_delivery/models/sale_order.py b/addons/website_sale_delivery/models/sale_order.py index 10fe22c0677..5099cefc75c 100644 --- a/addons/website_sale_delivery/models/sale_order.py +++ b/addons/website_sale_delivery/models/sale_order.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import logging from openerp.osv import orm, fields from openerp import SUPERUSER_ID @@ -7,6 +8,9 @@ from openerp.exceptions import ValidationError from openerp.tools.translate import _ +_logger = logging.getLogger(__name__) + + class delivery_carrier(orm.Model): _name = 'delivery.carrier' _inherit = ['delivery.carrier', 'website.published.mixin'] @@ -88,25 +92,32 @@ class SaleOrder(orm.Model): if carrier_id: order.delivery_set() else: - order._delivery_unset() + order._delivery_unset() return bool(carrier_id) def _get_delivery_methods(self, cr, uid, order, context=None): carrier_obj = self.pool.get('delivery.carrier') - delivery_ids = carrier_obj.search(cr, uid, [('website_published','=',True)], context=context) + carrier_ids = carrier_obj.search(cr, uid, [('website_published', '=', True)], context=context) + available_carrier_ids = [] # Following loop is done to avoid displaying delivery methods who are not available for this order # This can surely be done in a more efficient way, but at the moment, it mimics the way it's # done in delivery_set method of sale.py, from delivery module - for delivery_id in carrier_obj.browse(cr, SUPERUSER_ID, delivery_ids, context=dict(context, order_id=order.id)): + + new_context = dict(context, order_id=order.id) + for carrier in carrier_ids: + try: - if not delivery_id.available: - delivery_ids.remove(delivery_id.id) - except ValidationError: - # RIM: hack to remove in master, because available field should not depend on a SOAP call to external shipping provider - # The validation error is used in backend to display errors in fedex config, but should fail silently in frontend - delivery_ids.remove(delivery_id.id) - return delivery_ids + _logger.debug("Checking availability of carrier #%s" % carrier) + available = carrier_obj.read(cr, SUPERUSER_ID, [carrier], fields=['available'], context=new_context)[0]['available'] + if available: + available_carrier_ids = available_carrier_ids + [carrier] + except ValidationError as e: + # RIM: hack to remove in master, because available field should not depend on a SOAP call to external shipping provider + # The validation error is used in backend to display errors in fedex config, but should fail silently in frontend + _logger.debug("Carrier #%s removed from e-commerce carrier list. %s" % (carrier, e)) + + return available_carrier_ids def _get_errors(self, cr, uid, order, context=None): errors = super(SaleOrder, self)._get_errors(cr, uid, order, context=context)