You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							216 lines
						
					
					
						
							8.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							216 lines
						
					
					
						
							8.7 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################# | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################# | |
| from odoo import fields | |
| from odoo import http | |
| from odoo.http import request | |
| from werkzeug.exceptions import NotFound | |
| from odoo.tools.json import scriptsafe as json_scriptsafe | |
| from odoo.addons.payment import utils as payment_utils | |
| from odoo.addons.website_sale.controllers.main import WebsiteSale | |
| 
 | |
| 
 | |
| class WebsiteSaleDecimal(WebsiteSale): | |
|     """ | |
|     WebsiteSaleDecimal extends WebsiteSale class to update the methods: cart, | |
|     cart_update, cart_update_json and cart_quantity. | |
|     """ | |
| 
 | |
|     @http.route() | |
|     def cart(self, access_token=None, revive='', **post): | |
|         """ | |
|         Main cart management + abandoned cart revival | |
|         access_token: Abandoned cart SO access token | |
|         revive: Revival method when abandoned cart. Can be 'merge' or 'squash' | |
|         """ | |
|         order = request.website.sale_get_order() | |
|         if order and order.carrier_id: | |
|             # Express checkout is based on the amout of the sale order. If there is already a | |
|             # delivery line, Express Checkout form will display and compute the price of the | |
|             # delivery two times (One already computed in the total amount of the SO and one added | |
|             # in the form while selecting the delivery carrier) | |
|             order._remove_delivery_line() | |
|         if order and order.state != 'draft': | |
|             request.session['sale_order_id'] = None | |
|             order = request.website.sale_get_order() | |
| 
 | |
|         request.session['website_sale_cart_quantity'] = round( | |
|             sum(order.mapped('website_order_line.product_uom_qty')), 1) | |
| 
 | |
|         values = {} | |
|         if access_token: | |
|             abandoned_order = request.env['sale.order'].sudo().search( | |
|                 [('access_token', '=', access_token)], limit=1) | |
|             if not abandoned_order:  # wrong token (or SO has been deleted) | |
|                 raise NotFound() | |
|             if abandoned_order.state != 'draft':  # abandoned cart already finished | |
|                 values.update({'abandoned_proceed': True}) | |
|             elif revive == 'squash' or ( | |
|                     revive == 'merge' and not request.session.get( | |
|                     'sale_order_id')):  # restore old cart or merge with unexistant | |
|                 request.session['sale_order_id'] = abandoned_order.id | |
|                 return request.redirect('/shop/cart') | |
|             elif revive == 'merge': | |
|                 abandoned_order.order_line.write( | |
|                     {'order_id': request.session['sale_order_id']}) | |
|                 abandoned_order.action_cancel() | |
|             elif abandoned_order.id != request.session.get( | |
|                     'sale_order_id'):  # abandoned cart found, user have to choose what to do | |
|                 values.update({'access_token': abandoned_order.access_token}) | |
| 
 | |
|         values.update({ | |
|             'website_sale_order': order, | |
|             'date': fields.Date.today(), | |
|             'suggested_products': [], | |
|         }) | |
|         if order: | |
|             order.order_line.filtered( | |
|                 lambda l: not l.product_id.active).unlink() | |
|             values['suggested_products'] = order._cart_accessories() | |
|             values.update(self._get_express_shop_payment_values(order)) | |
| 
 | |
|         values.update(self._cart_values(**post)) | |
|         return request.render("website_sale.cart", values) | |
| 
 | |
|     @http.route() | |
|     def cart_update( | |
|             self, product_id, add_qty=1, set_qty=0, | |
|             product_custom_attribute_values=None, | |
|             no_variant_attribute_values=None, | |
|             express=False, **kwargs | |
|     ): | |
|         """This route is called when adding a product to cart (no options).""" | |
|         sale_order = request.website.sale_get_order(force_create=True) | |
|         if sale_order.state != 'draft': | |
|             request.session['sale_order_id'] = None | |
|             sale_order = request.website.sale_get_order(force_create=True) | |
| 
 | |
|         if product_custom_attribute_values: | |
|             product_custom_attribute_values = json_scriptsafe.loads( | |
|                 product_custom_attribute_values) | |
| 
 | |
|         if no_variant_attribute_values: | |
|             no_variant_attribute_values = json_scriptsafe.loads( | |
|                 no_variant_attribute_values) | |
| 
 | |
|         sale_order._cart_update( | |
|             product_id=int(product_id), | |
|             add_qty=add_qty, | |
|             set_qty=set_qty, | |
|             product_custom_attribute_values=product_custom_attribute_values, | |
|             no_variant_attribute_values=no_variant_attribute_values, | |
|             **kwargs | |
|         ) | |
| 
 | |
|         request.session[ | |
|             'website_sale_cart_quantity'] = round( | |
|             sum(sale_order.mapped('website_order_line.product_uom_qty')), 1) | |
| 
 | |
|         if express: | |
|             return request.redirect("/shop/checkout?express=1") | |
|         return request.redirect("/shop/cart") | |
| 
 | |
|     @http.route() | |
|     def cart_update_json( | |
|             self, product_id, line_id=None, add_qty=None, set_qty=None, | |
|             display=True, | |
|             product_custom_attribute_values=None, | |
|             no_variant_attribute_values=None, **kw | |
|     ): | |
|         """ | |
|         This route is called : | |
|             - When changing quantity from the cart. | |
|             - When adding a product from the wishlist. | |
|             - When adding a product to cart on the same page (without redirection). | |
|         """ | |
|         order = request.website.sale_get_order(force_create=True) | |
|         if order.state != 'draft': | |
|             request.website.sale_reset() | |
|             if kw.get('force_create'): | |
|                 order = request.website.sale_get_order(force_create=True) | |
|             else: | |
|                 return {} | |
| 
 | |
|         if product_custom_attribute_values: | |
|             product_custom_attribute_values = json_scriptsafe.loads( | |
|                 product_custom_attribute_values) | |
| 
 | |
|         if no_variant_attribute_values: | |
|             no_variant_attribute_values = json_scriptsafe.loads( | |
|                 no_variant_attribute_values) | |
| 
 | |
|         values = order._cart_update( | |
|             product_id=product_id, | |
|             line_id=line_id, | |
|             add_qty=add_qty, | |
|             set_qty=set_qty, | |
|             product_custom_attribute_values=product_custom_attribute_values, | |
|             no_variant_attribute_values=no_variant_attribute_values, | |
|             **kw | |
|         ) | |
| 
 | |
|         values['notification_info'] = self._get_cart_notification_information( | |
|             order, [values['line_id']]) | |
|         values['notification_info']['warning'] = values.pop('warning', '') | |
|         request.session['website_sale_cart_quantity'] = round( | |
|             sum(order.mapped('website_order_line.product_uom_qty')), 1) | |
| 
 | |
|         if not order.cart_quantity: | |
|             request.website.sale_reset() | |
|             return values | |
| 
 | |
|         values['cart_quantity'] = round( | |
|             sum(order.mapped('website_order_line.product_uom_qty')), 1) | |
|         values['minor_amount'] = payment_utils.to_minor_currency_units( | |
|             order.amount_total, order.currency_id | |
|         ), | |
|         values['amount'] = order.amount_total | |
| 
 | |
|         if not display: | |
|             return values | |
| 
 | |
|         values['cart_ready'] = order._is_cart_ready() | |
|         values['website_sale.cart_lines'] = request.env[ | |
|             'ir.ui.view']._render_template( | |
|             "website_sale.cart_lines", { | |
|                 'website_sale_order': order, | |
|                 'date': fields.Date.today(), | |
|                 'suggested_products': order._cart_accessories() | |
|             } | |
|         ) | |
|         values['website_sale.total'] = request.env[ | |
|             'ir.ui.view']._render_template( | |
|             "website_sale.total", { | |
|                 'website_sale_order': order, | |
|             } | |
|         ) | |
|         return values | |
| 
 | |
|     @http.route() | |
|     def cart_quantity(self): | |
|         """ | |
|         This method updates the cart quantity count in the session based on | |
|         the order's website order lines. | |
|         """ | |
|         if 'website_sale_cart_quantity' not in request.session: | |
|             return request.website.sale_get_order().mapped( | |
|                 'website_order_line.product_uom_qty') | |
|         return request.session['website_sale_cart_quantity']
 | |
| 
 |