72 lines
2.9 KiB
Python
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,
|
|
}
|
|
)
|