From 1bd44e1106d02812aa8866ddc2835ac0f4ee200f Mon Sep 17 00:00:00 2001 From: rde Date: Tue, 31 Oct 2017 17:57:38 +0100 Subject: [PATCH 1/2] [FIX] website_sale_coupon: update reward line total when changing product qty on cart - Add a product (imac 1.799$) and a promo code (eg: 10%) in your cart - Go to checkout (/shop/cart). You now see 1,619.10 Total and 179.90 discount - Change product qty (eg: 2) - Subtotal is now 2x 1.799 - 179.90 instead of 2x 1.799 - 2x 179.90 - Reward line total (discount) is still the same amount (10% on 1 ipad) Now, we will recompute the discount price based on the entire cart Note: This behavior was wanted and comes from this commit #87d542 But for the shop, we need to have the reward line being updated on the fly or it wont make sense for the end user. This closes #ee4be7a532dd707a0cd19c766dc8e8537dcda242 --- controllers/main.py | 6 ++++++ models/__init__.py | 3 ++- models/website.py | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 models/website.py diff --git a/controllers/main.py b/controllers/main.py index 3a589ac2979..c818db4640f 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -19,3 +19,9 @@ class WebsiteSale(WebsiteSale): order = request.website.sale_get_order() order.recompute_coupon_lines() return super(WebsiteSale, self).payment(**post) + + @http.route(['/shop/cart'], type='http', auth="public", website=True) + def cart(self, **post): + order = request.website.sale_get_order() + order.recompute_coupon_lines() + return super(WebsiteSale, self).cart(**post) diff --git a/models/__init__.py b/models/__init__.py index bdc919f5eec..1cc49f34af5 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,4 +2,5 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. import sale_coupon_rule -import sale_order \ No newline at end of file +import sale_order +import website diff --git a/models/website.py b/models/website.py new file mode 100644 index 00000000000..37f93c7f64b --- /dev/null +++ b/models/website.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + + +class Website(models.Model): + _inherit = "website" + + @api.multi + def sale_get_order(self, force_create=False, code=None, update_pricelist=False, force_pricelist=False): + order = super(Website, self).sale_get_order(force_create, code, update_pricelist, force_pricelist) + order.recompute_coupon_lines() + return order From f7c58b65df2a2a6a08039183ed6644b939e119fb Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Mon, 13 Nov 2017 12:43:03 +0100 Subject: [PATCH 2/2] [FIX] (website_)sale_coupon: Display clearer promo code error on cart Before this commit: Coupon error on cart would always show "Invalid or Expired coupon code" instead of a more accurate error (eg: already applied, can't use 2 code..). Plus it would still show the error on page refresh because of the error being stored in URL param. Now: It will show the exact error and since the error is not stored in URL, it won't be still displayed on page refresh. This closes #1601 --- controllers/main.py | 4 +++- models/sale_order.py | 7 +++++++ views/website_sale_templates.xml | 7 +++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/controllers/main.py b/controllers/main.py index c818db4640f..0def9e81217 100644 --- a/controllers/main.py +++ b/controllers/main.py @@ -10,8 +10,10 @@ class WebsiteSale(WebsiteSale): def pricelist(self, promo, **post): order = request.website.sale_get_order() coupon_status = request.env['sale.coupon.apply.code'].sudo().apply_coupon(order, promo) - if coupon_status.get('error', False): + if coupon_status.get('not_found'): return super(WebsiteSale, self).pricelist(promo, **post) + elif coupon_status.get('error'): + request.session['error_promo_code'] = coupon_status['error'] return request.redirect(post.get('r', '/shop/cart')) @http.route(['/shop/payment'], type='http', auth="public", website=True) diff --git a/models/sale_order.py b/models/sale_order.py index 7bc53960d0a..3effee6a17c 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from odoo import models, fields, api +from odoo.http import request class SaleOrder(models.Model): @@ -10,3 +11,9 @@ class SaleOrder(models.Model): for order in self: reward_lines = order.website_order_line.filtered(lambda line: line.is_reward_line) order.cart_quantity -= int(sum(reward_lines.mapped('product_uom_qty'))) + + def get_promo_code_error(self, delete=True): + error = request.session.get('error_promo_code') + if error and delete: + request.session.pop('error_promo_code') + return error diff --git a/views/website_sale_templates.xml b/views/website_sale_templates.xml index e1d3b65e4c2..e3909b3be36 100644 --- a/views/website_sale_templates.xml +++ b/views/website_sale_templates.xml @@ -47,6 +47,13 @@ + +
+
+ +
+
+