Odoo18-Base/addons/website_sale_stock/controllers/main.py

64 lines
2.8 KiB
Python
Raw Permalink Normal View History

2025-03-10 11:12:23 +07:00
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.website_sale.controllers import main as website_sale_controller
from odoo.tools import email_re
from odoo import http, _
from odoo.http import request
from odoo.exceptions import ValidationError
from werkzeug.exceptions import BadRequest
class PaymentPortal(website_sale_controller.PaymentPortal):
@http.route()
def shop_payment_transaction(self, *args, **kwargs):
""" Payment transaction override to double check cart quantities before
placing the order
"""
order = request.website.sale_get_order()
values = []
for line in order.order_line:
if line.product_id.type == 'product' and not line.product_id.allow_out_of_stock_order:
cart_qty, avl_qty = order._get_cart_and_free_qty(line=line)
if cart_qty > avl_qty:
line._set_shop_warning_stock(cart_qty, max(avl_qty, 0))
values.append(line.shop_warning)
if values:
raise ValidationError(' '.join(values))
return super().shop_payment_transaction(*args, **kwargs)
class WebsiteSale(website_sale_controller.WebsiteSale):
@http.route(['/shop/add/stock_notification'], type="json", auth="public", website=True)
def add_stock_email_notification(self, email, product_id):
if not email_re.match(email):
raise BadRequest(_("Invalid Email"))
product = request.env['product.product'].browse(int(product_id))
partners = request.env['res.partner'].sudo()._mail_find_partner_from_emails([email], force_create=True)
partner = partners[0]
if not product._has_stock_notification(partner):
product.sudo().stock_notification_partner_ids += partner
if request.website.is_public_user():
request.session['product_with_stock_notification_enabled'] = request.session.get(
'product_with_stock_notification_enabled',
set()
) | {product_id}
request.session['stock_notification_email'] = email
def _prepare_product_values(self, product, category='', search='', **kwargs):
values = super()._prepare_product_values(product, category, search, **kwargs)
# We need the user mail to prefill the back of stock notification, so we put it in the value that will be sent
values['user_email'] = request.env.user.email or request.session.get('stock_notification_email', '')
return values
class CustomerPortal(website_sale_controller.CustomerPortal):
def _sale_reorder_get_line_context(self):
return {
**super()._sale_reorder_get_line_context(),
'website_sale_stock_get_quantity': True,
}