[FIX] website_sale_delivery: unavailable carriers don't hide the other ones anymore

Backport of 48156efcd9 + 44f6409731 that fixed the problem in next versions
Revert of da563bcf5c that hid warning for users in backend

One day, we will have to refactor website_sale_delivery. But today, we are the dung beetles.
This commit is contained in:
Richard Mathot
2015-12-11 16:16:27 +01:00
parent df638109a3
commit 48cdd1e77f
2 changed files with 22 additions and 14 deletions
+1 -4
View File
@@ -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']
@@ -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)