72 lines
2.9 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.http import Controller, request, route
class WebsiteSaleProductConfiguratorController(Controller):
@route(
'/sale_product_configurator/show_advanced_configurator',
type='json', auth='public', methods=['POST'], website=True,
)
def show_advanced_configurator(
self, product_id, variant_values, add_qty=1, force_dialog=False, **kw,
):
product = request.env['product.product'].browse(int(product_id))
product_template = product.product_tmpl_id
combination = request.env['product.template.attribute.value'].browse(variant_values)
has_optional_products = product.optional_product_ids.filtered(
lambda p: p._is_add_to_cart_possible(combination)
and (not request.website.prevent_zero_price_sale or p._get_contextual_price())
)
already_configured = bool(combination)
if not force_dialog and not has_optional_products and (
product.product_variant_count <= 1 or already_configured
):
# The modal is not shown if there are no optional products and
# the main product either has no variants or is already configured
return False
add_qty = float(add_qty)
combination_info = product_template._get_combination_info(
combination=combination,
product_id=product.id,
add_qty=add_qty,
)
return request.env['ir.ui.view']._render_template(
'website_sale_product_configurator.optional_products_modal',
{
'product': product,
'product_template': product_template,
'combination': combination,
'combination_info': combination_info,
'add_qty': add_qty,
'parent_name': product.name,
'variant_values': variant_values,
'already_configured': already_configured,
'mode': kw.get('mode', 'add'),
'product_custom_attribute_values': kw.get('product_custom_attribute_values', None),
'no_attribute': kw.get('no_attribute', False),
'custom_attribute': kw.get('custom_attribute', False),
}
)
@route(
'/sale_product_configurator/optional_product_items',
type='json', auth='public', methods=['POST'], website=True,
)
def optional_product_items(self, product_id, add_qty=1, **kw):
product = request.env['product.product'].browse(int(product_id))
return request.env['ir.ui.view']._render_template(
'website_sale_product_configurator.optional_product_items',
{
'product': product,
'parent_name': product.name,
'parent_combination': product.product_template_attribute_value_ids,
'add_qty': float(add_qty) or 1.0,
}
)