Files
odoo_source/addons/sale_management/controllers/portal.py
T
Victor Feyens 798bf138c6 [FIX] sale_management: reload page on option add
Partial revert of 0beebad

Since the aforementioned commit, if a client updated its order on the portal:
* adding optional products
* removing optional products
* updating optional line quantities
and paid directly after, without reloading the page, the amount he paid
was the amount of the SO when the page was loaded.

Avoiding the reload and only modifying some DOM parts was a bad idea to begin
with.

We'll consider developing a correct and clean way to (re)render the payment part
of the DOM, or use separate pages for orders modifications and effective payment
checkout.

closes odoo/odoo#107569

X-original-commit: 81a9080eb375c31a7766189bb61e1bd8d99d855a
Related: odoo/enterprise#34837
Signed-off-by: Victor Feyens (vfe) <vfe@odoo.com>
2022-12-12 13:19:05 +01:00

86 lines
3.3 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.exceptions import AccessError, MissingError
from odoo.http import request, route
from odoo.addons.sale.controllers import portal
class CustomerPortal(portal.CustomerPortal):
def _get_order_portal_content(self, order_sudo):
""" Return the order portal details.
:return: rendered html of the order portal details
:rtype: dict
"""
# TODO remove me in master
return
@route(['/my/orders/<int:order_id>/update_line_dict'], type='json', auth="public", website=True)
def portal_quote_option_update(self, order_id, line_id, access_token=None, remove=False, unlink=False, input_quantity=False, **kwargs):
""" Update the quantity or Remove an optional SOline from a SO.
:param int order_id: `sale.order` id
:param int line_id: `sale.order.line` id
:param str access_token: portal access_token of the specified order
:param bool remove: if true, 1 unit will be removed from the line
:param bool unlink: if true, the option will be removed from the SO
:param float input_quantity: if specified, will be set as new line qty
:param dict kwargs: unused parameters
:return: New order details (as html content)
:rtype: dict
"""
try:
order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
except (AccessError, MissingError):
return request.redirect('/my')
if order_sudo.state not in ('draft', 'sent'):
return False
order_line = request.env['sale.order.line'].sudo().browse(int(line_id)).exists()
if not order_line or order_line.order_id != order_sudo:
return False
if not order_line.sale_order_option_ids:
# Do not allow updating non optional lines from a quotation
return False
if input_quantity is not False:
quantity = input_quantity
else:
number = -1 if remove else 1
quantity = order_line.product_uom_qty + number
if unlink or quantity <= 0:
order_line.unlink()
else:
order_line.product_uom_qty = quantity
return self._get_order_portal_content(order_sudo)
@route(["/my/orders/<int:order_id>/add_option/<int:option_id>"], type='json', auth="public", website=True)
def portal_quote_add_option(self, order_id, option_id, access_token=None, **kwargs):
""" Add the specified option to the specified order.
:param int order_id: `sale.order` id
:param int option_id: `sale.order.option` id
:param str access_token: portal access_token of the specified order
:param dict kwargs: unused parameters
:return: New order details (as html content)
:rtype: dict
"""
try:
order_sudo = self._document_check_access('sale.order', order_id, access_token=access_token)
except (AccessError, MissingError):
return request.redirect('/my')
option_sudo = request.env['sale.order.option'].sudo().browse(option_id)
if order_sudo != option_sudo.order_id:
return request.redirect(order_sudo.get_portal_url())
option_sudo.add_option_to_order()
return self._get_order_portal_content(order_sudo)