diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/sale_product_configurator/controllers/main.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/sale_product_configurator/controllers/main.py')
| -rw-r--r-- | addons/sale_product_configurator/controllers/main.py | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/addons/sale_product_configurator/controllers/main.py b/addons/sale_product_configurator/controllers/main.py new file mode 100644 index 00000000..d207d416 --- /dev/null +++ b/addons/sale_product_configurator/controllers/main.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import http +from odoo.http import request + + +class ProductConfiguratorController(http.Controller): + @http.route(['/sale_product_configurator/configure'], type='json', auth="user", methods=['POST']) + def configure(self, product_template_id, pricelist_id, **kw): + add_qty = int(kw.get('add_qty', 1)) + product_template = request.env['product.template'].browse(int(product_template_id)) + pricelist = self._get_pricelist(pricelist_id) + + product_combination = False + attribute_value_ids = set(kw.get('product_template_attribute_value_ids', [])) + attribute_value_ids |= set(kw.get('product_no_variant_attribute_value_ids', [])) + if attribute_value_ids: + product_combination = request.env['product.template.attribute.value'].browse(attribute_value_ids) + + if pricelist: + product_template = product_template.with_context(pricelist=pricelist.id, partner=request.env.user.partner_id) + + return request.env['ir.ui.view']._render_template("sale_product_configurator.configure", { + 'product': product_template, + 'pricelist': pricelist, + 'add_qty': add_qty, + 'product_combination': product_combination + }) + + @http.route(['/sale_product_configurator/show_optional_products'], type='json', auth="user", methods=['POST']) + def show_optional_products(self, product_id, variant_values, pricelist_id, **kw): + pricelist = self._get_pricelist(pricelist_id) + return self._show_optional_products(product_id, variant_values, pricelist, False, **kw) + + @http.route(['/sale_product_configurator/optional_product_items'], type='json', auth="user", methods=['POST']) + def optional_product_items(self, product_id, pricelist_id, **kw): + pricelist = self._get_pricelist(pricelist_id) + return self._optional_product_items(product_id, pricelist, **kw) + + def _optional_product_items(self, product_id, pricelist, **kw): + add_qty = int(kw.get('add_qty', 1)) + product = request.env['product.product'].browse(int(product_id)) + + parent_combination = product.product_template_attribute_value_ids + if product.env.context.get('no_variant_attribute_values'): + # Add "no_variant" attribute values' exclusions + # They are kept in the context since they are not linked to this product variant + parent_combination |= product.env.context.get('no_variant_attribute_values') + + return request.env['ir.ui.view']._render_template("sale_product_configurator.optional_product_items", { + 'product': product, + 'parent_name': product.name, + 'parent_combination': parent_combination, + 'pricelist': pricelist, + 'add_qty': add_qty, + }) + + def _show_optional_products(self, product_id, variant_values, pricelist, handle_stock, **kw): + product = request.env['product.product'].browse(int(product_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)) + + if not has_optional_products: + return False + + add_qty = int(kw.get('add_qty', 1)) + + no_variant_attribute_values = combination.filtered( + lambda product_template_attribute_value: product_template_attribute_value.attribute_id.create_variant == 'no_variant' + ) + if no_variant_attribute_values: + product = product.with_context(no_variant_attribute_values=no_variant_attribute_values) + + return request.env['ir.ui.view']._render_template("sale_product_configurator.optional_products_modal", { + 'product': product, + 'combination': combination, + 'add_qty': add_qty, + 'parent_name': product.name, + 'variant_values': variant_values, + 'pricelist': pricelist, + 'handle_stock': handle_stock, + }) + + def _get_pricelist(self, pricelist_id, pricelist_fallback=False): + return request.env['product.pricelist'].browse(int(pricelist_id or 0)) |
