summaryrefslogtreecommitdiff
path: root/addons/website_sale_product_configurator/controllers
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/website_sale_product_configurator/controllers
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/website_sale_product_configurator/controllers')
-rw-r--r--addons/website_sale_product_configurator/controllers/__init__.py3
-rw-r--r--addons/website_sale_product_configurator/controllers/main.py83
2 files changed, 86 insertions, 0 deletions
diff --git a/addons/website_sale_product_configurator/controllers/__init__.py b/addons/website_sale_product_configurator/controllers/__init__.py
new file mode 100644
index 00000000..65a8c120
--- /dev/null
+++ b/addons/website_sale_product_configurator/controllers/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import main
diff --git a/addons/website_sale_product_configurator/controllers/main.py b/addons/website_sale_product_configurator/controllers/main.py
new file mode 100644
index 00000000..23785369
--- /dev/null
+++ b/addons/website_sale_product_configurator/controllers/main.py
@@ -0,0 +1,83 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+import json
+from odoo import http
+from odoo.http import request
+
+from odoo.addons.sale_product_configurator.controllers.main import ProductConfiguratorController
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+
+class WebsiteSaleProductConfiguratorController(ProductConfiguratorController):
+ @http.route(['/sale_product_configurator/show_optional_products_website'], type='json', auth="public", methods=['POST'], website=True)
+ def show_optional_products_website(self, product_id, variant_values, **kw):
+ """Special route to use website logic in get_combination_info override.
+ This route is called in JS by appending _website to the base route.
+ """
+ kw.pop('pricelist_id')
+ return self.show_optional_products(product_id, variant_values, request.website.get_current_pricelist(), **kw)
+
+ @http.route(['/sale_product_configurator/optional_product_items_website'], type='json', auth="public", methods=['POST'], website=True)
+ def optional_product_items_website(self, product_id, **kw):
+ """Special route to use website logic in get_combination_info override.
+ This route is called in JS by appending _website to the base route.
+ """
+ kw.pop('pricelist_id')
+ return self.optional_product_items(product_id, request.website.get_current_pricelist(), **kw)
+
+class WebsiteSale(WebsiteSale):
+ def _prepare_product_values(self, product, category, search, **kwargs):
+ values = super(WebsiteSale, self)._prepare_product_values(product, category, search, **kwargs)
+
+ values['optional_product_ids'] = [p.with_context(active_id=p.id) for p in product.optional_product_ids]
+ return values
+
+ @http.route(['/shop/cart/update_option'], type='http', auth="public", methods=['POST'], website=True, multilang=False)
+ def cart_options_update_json(self, product_and_options, goto_shop=None, lang=None, **kwargs):
+ """This route is called when submitting the optional product modal.
+ The product without parent is the main product, the other are options.
+ Options need to be linked to their parents with a unique ID.
+ The main product is the first product in the list and the options
+ need to be right after their parent.
+ product_and_options {
+ 'product_id',
+ 'product_template_id',
+ 'quantity',
+ 'parent_unique_id',
+ 'unique_id',
+ 'product_custom_attribute_values',
+ 'no_variant_attribute_values'
+ }
+ """
+ if lang:
+ request.website = request.website.with_context(lang=lang)
+
+ order = request.website.sale_get_order(force_create=True)
+ if order.state != 'draft':
+ request.session['sale_order_id'] = None
+ order = request.website.sale_get_order(force_create=True)
+
+ product_and_options = json.loads(product_and_options)
+ if product_and_options:
+ # The main product is the first, optional products are the rest
+ main_product = product_and_options[0]
+ value = order._cart_update(
+ product_id=main_product['product_id'],
+ add_qty=main_product['quantity'],
+ product_custom_attribute_values=main_product['product_custom_attribute_values'],
+ no_variant_attribute_values=main_product['no_variant_attribute_values'],
+ )
+
+ # Link option with its parent.
+ option_parent = {main_product['unique_id']: value['line_id']}
+ for option in product_and_options[1:]:
+ parent_unique_id = option['parent_unique_id']
+ option_value = order._cart_update(
+ product_id=option['product_id'],
+ set_qty=option['quantity'],
+ linked_line_id=option_parent[parent_unique_id],
+ product_custom_attribute_values=option['product_custom_attribute_values'],
+ no_variant_attribute_values=option['no_variant_attribute_values'],
+ )
+ option_parent[option['unique_id']] = option_value['line_id']
+
+ return str(order.cart_quantity)