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.
		
		
		
		
		
			
		
			
				
					
					
						
							130 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							130 lines
						
					
					
						
							5.5 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
							 | 
						|
								#    Author: Yassir Irfan(<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 <https://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								from odoo import http
							 | 
						|
								from odoo.http import request
							 | 
						|
								from odoo.addons.website_sale.controllers.main import WebsiteSale
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class WebsiteSaleEcom(WebsiteSale):
							 | 
						|
								    """
							 | 
						|
								    Customized version of the website sale controller for e-commerce.
							 | 
						|
								    This class is a subclass of `WebsiteSale` and provides additional
							 | 
						|
								    customizations and overrides specific to e-commerce functionality on the
							 | 
						|
								    website. It extends the base functionality of `WebsiteSale` to cater to the
							 | 
						|
								    specific needs of an e-commerce website.
							 | 
						|
								
							 | 
						|
								    Inherits:
							 | 
						|
								        WebsiteSale: The base class for the website sale controller.
							 | 
						|
								    Usage:
							 | 
						|
								    1. Create an instance of `WebsiteSaleEcom` and customize it as needed.
							 | 
						|
								    2. Use the instance to handle e-commerce functionality on your website.
							 | 
						|
								    """
							 | 
						|
								
							 | 
						|
								    def _get_address_values(self, **post):
							 | 
						|
								        """
							 | 
						|
								        This method overrides the default `address()` method of the
							 | 
						|
								        `WebsiteSale` class to get additional context values related to the
							 | 
						|
								        customer's address.
							 | 
						|
								
							 | 
						|
								        :param post: A dictionary containing the form data submitted by the
							 | 
						|
								        user.
							 | 
						|
								        :type post: dict
							 | 
						|
								
							 | 
						|
								        :return: A dictionary containing the updated q-context values related
							 | 
						|
								        to the customer's address.
							 | 
						|
								        :rtype: dict
							 | 
						|
								        """
							 | 
						|
								        return super(WebsiteSaleEcom, self).address(**post).qcontext
							 | 
						|
								
							 | 
						|
								    @http.route(['/shop/address'], type='http', methods=['GET', 'POST'],
							 | 
						|
								                auth="public", website=True, sitemap=False)
							 | 
						|
								    def address(self, **kw):
							 | 
						|
								        """
							 | 
						|
								        Renders the checkout address page for the current website sale order.
							 | 
						|
								        If the request is a POST, updates the current order's delivery and
							 | 
						|
								        invoice addresses with the provided data.
							 | 
						|
								
							 | 
						|
								        If the current user is authenticated and the order's partner matches
							 | 
						|
								        the authenticated user's partner, redirects to the payment page.
							 | 
						|
								
							 | 
						|
								        :return: An HTTP response with the rendered checkout address page or a
							 | 
						|
								        redirection to the login or payment page.
							 | 
						|
								        :rtype: werkzeug.wrappers.Response
							 | 
						|
								        """
							 | 
						|
								        res = super(WebsiteSaleEcom, self).address(**kw)
							 | 
						|
								        order = res.qcontext.get('website_sale_order')
							 | 
						|
								        if order:
							 | 
						|
								            user = request.website.user_id.sudo()
							 | 
						|
								            if order.partner_id.id == user.partner_id.id:
							 | 
						|
								                return request.redirect('/shop/payment')
							 | 
						|
								            else:
							 | 
						|
								                return res
							 | 
						|
								        return res
							 | 
						|
								
							 | 
						|
								    @http.route(['/shop/extra_info'], type='http', auth="public", website=True,
							 | 
						|
								                sitemap=False)
							 | 
						|
								    def extra_info(self):
							 | 
						|
								        """
							 | 
						|
								        Overwrites the existing extra_info function.
							 | 
						|
								        Redirects the current request to the checkout payment page.
							 | 
						|
								
							 | 
						|
								        :return: An HTTP response redirecting to the checkout payment page.
							 | 
						|
								        :rtype: werkzeug.wrappers.Response
							 | 
						|
								        """
							 | 
						|
								        return request.redirect('/shop/payment')
							 | 
						|
								
							 | 
						|
								    @http.route('/shop/payment', type='http', auth='public', website=True,
							 | 
						|
								                sitemap=False)
							 | 
						|
								    def shop_payment(self, **post):
							 | 
						|
								        """
							 | 
						|
								        Overwrites the existing shop_payment function.
							 | 
						|
								        Removed the redirection if there is no address for user.
							 | 
						|
								        This page proposes several payment means based on available
							 | 
						|
								        payment.provider. State at this point :
							 | 
						|
								
							 | 
						|
								         - a draft sales order with lines; otherwise, clean context / session
							 | 
						|
								            and back to the shop
							 | 
						|
								         - no transaction in context / session, or only a draft one, if the
							 | 
						|
								            customer did go to a payment.provider webshop_paymentsite but
							 | 
						|
								            closed the tab without paying / canceling
							 | 
						|
								        """
							 | 
						|
								        order = request.website.sale_get_order()
							 | 
						|
								        render_values = self._get_shop_payment_values(order, **post)
							 | 
						|
								        render_values['only_services'] = order and order.only_services or False
							 | 
						|
								        address_values = self._get_address_values(**post)
							 | 
						|
								        # Included /address values to the /payment and its template
							 | 
						|
								        render_values.update({
							 | 
						|
								            'account_on_checkout': address_values.get('account_on_checkout'),
							 | 
						|
								            'country_states': address_values.get('country_states', []),
							 | 
						|
								            'is_public_user': address_values.get('is_public_user'),
							 | 
						|
								            'only_services': address_values.get('only_services'),
							 | 
						|
								            'countries': address_values.get('countries', []),
							 | 
						|
								            'country': address_values.get('country', []),
							 | 
						|
								            'checkout': address_values.get('checkout'),
							 | 
						|
								            'error': address_values.get('error'),
							 | 
						|
								            'mode': address_values.get('mode'),
							 | 
						|
								        })
							 | 
						|
								        if render_values['errors']:
							 | 
						|
								            render_values.pop('providers', '')
							 | 
						|
								            render_values.pop('tokens', '')
							 | 
						|
								
							 | 
						|
								        return request.render("website_sale.payment", render_values)
							 | 
						|
								
							 |