From ce7212d5d752ad2ba66a72f19f3d462c6e8f221a Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Fri, 1 Aug 2014 17:11:20 +0200 Subject: [PATCH] [FIX] website_sale: everytime you want to change both billing & delivery address, any change creates duplicates in the backend --- addons/website_sale/controllers/main.py | 59 ++++++++++++++----- .../static/src/js/website_sale.js | 19 ++++-- addons/website_sale/views/templates.xml | 54 ++++++++++------- 3 files changed, 90 insertions(+), 42 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 4b496c06f1e..79b04fa5ee6 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -304,18 +304,17 @@ class website_sale(http.Controller): countries = orm_country.browse(cr, SUPERUSER_ID, country_ids, context) states_ids = state_orm.search(cr, SUPERUSER_ID, [], context=context) states = state_orm.browse(cr, SUPERUSER_ID, states_ids, context) + partner = orm_user.browse(cr, SUPERUSER_ID, request.uid, context).partner_id + order = None + + shipping_id = None + shipping_ids = [] checkout = {} if not data: if request.uid != request.website.user_id.id: - partner = orm_user.browse(cr, SUPERUSER_ID, request.uid, context).partner_id checkout.update( self.checkout_parse("billing", partner) ) - - shipping_ids = orm_partner.search(cr, SUPERUSER_ID, [("parent_id", "=", partner.id), ('type', "=", 'delivery')], limit=1, context=context) - if shipping_ids: - shipping = orm_user.browse(cr, SUPERUSER_ID, request.uid, context) - checkout.update( self.checkout_parse("shipping", shipping) ) - checkout['shipping_different'] = True + shipping_ids = orm_partner.search(cr, SUPERUSER_ID, [("parent_id", "=", partner.id), ('type', "=", 'delivery')], context=context) else: order = request.website.sale_get_order(force_create=1, context=context) if order.partner_id: @@ -325,17 +324,47 @@ class website_sale(http.Controller): checkout.update( self.checkout_parse("billing", order.partner_id) ) else: checkout = self.checkout_parse('billing', data) - if data.get("shipping_different"): + try: + shipping_id = int(data["shipping_id"]) + except ValueError: + pass + if shipping_id == -1: checkout.update(self.checkout_parse('shipping', data)) - checkout["shipping_different"] = True + + if shipping_id is None: + if not order: + order = request.website.sale_get_order(context=context) + if order and order.partner_shipping_id: + shipping_id = order.partner_shipping_id.id + + shipping_ids = list(set(shipping_ids) - set([partner.id])) + + if shipping_id == partner.id: + shipping_id = 0 + elif shipping_id > 0 and shipping_id not in shipping_ids: + shipping_ids.append(shipping_id) + elif shipping_id is None and shipping_ids: + shipping_id = shipping_ids[0] + + ctx = dict(context, show_address=1) + shippings = [] + if shipping_ids: + shippings = shipping_ids and orm_partner.browse(cr, SUPERUSER_ID, list(shipping_ids), ctx) or [] + if shipping_id > 0: + shipping = orm_partner.browse(cr, SUPERUSER_ID, shipping_id, ctx) + checkout.update( self.checkout_parse("shipping", shipping) ) + + checkout['shipping_id'] = shipping_id values = { 'countries': countries, 'states': states, 'checkout': checkout, - 'shipping_different': checkout.get('shipping_different'), + 'shipping_id': partner.id != shipping_id and shipping_id or 0, + 'shippings': shippings, 'error': {}, } + return values mandatory_billing_fields = ["name", "phone", "email", "street", "city", "country_id", "zip"] @@ -395,7 +424,7 @@ class website_sale(http.Controller): if not check_func(cr, uid, vat_country, vat_number, context=None): # simple_vat_check error["vat"] = 'error' - if data.get("shipping_different"): + if data.get("shipping_id") == -1: for field_name in self.mandatory_shipping_fields: field_name = 'shipping_' + field_name if not data.get(field_name): @@ -431,21 +460,20 @@ class website_sale(http.Controller): partner_id = orm_partner.create(cr, SUPERUSER_ID, billing_info, context=context) # create a new shipping partner - shipping_id = None - if checkout.get('shipping_different'): + if checkout.get('shipping_id') == -1: shipping_info = self.checkout_parse('shipping', checkout, True) shipping_info['type'] = 'delivery' shipping_info['parent_id'] = partner_id - shipping_id = orm_partner.create(cr, SUPERUSER_ID, shipping_info, context) + checkout['shipping_id'] = orm_partner.create(cr, SUPERUSER_ID, shipping_info, context) order_info = { 'partner_id': partner_id, 'message_follower_ids': [(4, partner_id)], 'partner_invoice_id': partner_id, - 'partner_shipping_id': shipping_id or partner_id } order_info.update(registry.get('sale.order').onchange_partner_id(cr, SUPERUSER_ID, [], partner_id, context=context)['value']) order_info.pop('user_id') + order_info.update(partner_shipping_id=checkout.get('shipping_id') or partner_id) order_obj.write(cr, SUPERUSER_ID, [order.id], order_info, context=context) @@ -482,6 +510,7 @@ class website_sale(http.Controller): return request.website.render("website_sale.checkout", values) self.checkout_form_save(values["checkout"]) + request.session['sale_last_order_id'] = order.id return request.redirect("/shop/payment") diff --git a/addons/website_sale/static/src/js/website_sale.js b/addons/website_sale/static/src/js/website_sale.js index 62c1f829bde..4ca9aa34e8b 100644 --- a/addons/website_sale/static/src/js/website_sale.js +++ b/addons/website_sale/static/src/js/website_sale.js @@ -1,10 +1,17 @@ $(document).ready(function () { - var $shippingDifferent = $(".oe_website_sale input[name='shipping_different']"); - if ($shippingDifferent.is(':checked')) { - $(".oe_website_sale .js_shipping").show(); - } - $shippingDifferent.change(function () { - $(".oe_website_sale .js_shipping").toggle(); + var $shippingDifferent = $(".oe_website_sale select[name='shipping_id']"); + $shippingDifferent.change(function (event) { + var value = +$shippingDifferent.val(); + var data = $shippingDifferent.find("option:selected").data(); + var $snipping = $(".oe_website_sale .js_shipping"); + var $inputs = $snipping.find("input,select"); + + $snipping.toggle(!!value); + $inputs.attr("readonly", value <= 0 ? null : "readonly" ).prop("readonly", value <= 0 ? null : "readonly" ); + + $inputs.each(function () { + $(this).val( data[$(this).attr("name")] || "" ); + }); }); // change for css diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index d77f7528bc0..f4becb6ce45 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -865,7 +865,7 @@
- + - Ship to a different address - +
+ +
-
+

Shipping Information

- - + +
- - + +
- - + +
- - + +
- - + +
- - @@ -917,8 +929,8 @@
- -