summaryrefslogtreecommitdiff
path: root/addons/sale_product_configurator/controllers/main.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/sale_product_configurator/controllers/main.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/sale_product_configurator/controllers/main.py')
-rw-r--r--addons/sale_product_configurator/controllers/main.py86
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))