From cbd67bd099471ea49d6fa8bea810b73d58bd785f Mon Sep 17 00:00:00 2001 From: Victor Feyens Date: Tue, 18 Apr 2023 09:34:18 +0000 Subject: [PATCH] [FIX] website_sale: do not create zero-quantity lines We do not want to allow the creation of lines with zero quantity, Although we do not know of a standard flow making such requests, the cart_update routes could accept information such as * {"product_id": X, "set_qty":0} * {"product_id": X, "add_qty":0} If a line with product X already exists, it'll be deleted. If no such line exists, a new one would be created, which is not something we want to support. closes odoo/odoo#118999 X-original-commit: 231c8aa79ddd0b1f4ed47508fa22596ac19daacb Signed-off-by: Victor Feyens (vfe) Co-authored-by: Paul Morelle --- addons/website_sale/models/sale_order.py | 2 +- .../tests/test_website_sale_cart.py | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index 06a31c5c9b2..eacbabec3a9 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -132,7 +132,7 @@ class SaleOrder(models.Model): update_values = self._prepare_order_line_update_values(order_line, quantity, **kwargs) if update_values: self._update_cart_line_values(order_line, update_values) - elif quantity >= 0: + elif quantity > 0: # Create new line order_line_values = self._prepare_order_line_values(product_id, quantity, **kwargs) order_line = self.env['sale.order.line'].sudo().create(order_line_values) diff --git a/addons/website_sale/tests/test_website_sale_cart.py b/addons/website_sale/tests/test_website_sale_cart.py index d225d6a587b..ff4b5670018 100644 --- a/addons/website_sale/tests/test_website_sale_cart.py +++ b/addons/website_sale/tests/test_website_sale_cart.py @@ -78,3 +78,35 @@ class WebsiteSaleCart(TransactionCase): # Try processing payment with the old amount with self.assertRaises(UserError): PaymentPortal().shop_payment_transaction(sale_order.id, sale_order.access_token, amount=old_amount) + + def test_update_cart_zero_qty(self): + # Try to remove a product that has already been removed + product = self.env['product.product'].create({ + 'name': 'Test Product', + 'sale_ok': True, + 'website_published': True, + 'lst_price': 1000.0, + 'standard_price': 800.0, + }) + portal_user = self.env.ref('base.demo_user0') + website = self.website.with_user(portal_user) + + SaleOrderLine = self.env['sale.order.line'] + + with MockRequest(product.with_user(portal_user).env, website=website): + # add the product to the cart + self.WebsiteSaleController.cart_update_json(product_id=product.id, add_qty=1) + sale_order = website.sale_get_order() + self.assertEqual(sale_order.amount_total, 1150.0) + + # remove the product from the cart + self.WebsiteSaleController.cart_update_json(product_id=product.id, line_id=sale_order.order_line.id, set_qty=0) + self.assertEqual(sale_order.amount_total, 0.0) + self.assertEqual(sale_order.order_line, SaleOrderLine) + + # removing the product again doesn't add a line with zero quantity + self.WebsiteSaleController.cart_update_json(product_id=product.id, set_qty=0) + self.assertEqual(sale_order.order_line, SaleOrderLine) + + self.WebsiteSaleController.cart_update_json(product_id=product.id, add_qty=0) + self.assertEqual(sale_order.order_line, SaleOrderLine)