From c8d915d58f5da7c416975dbf91f4dbfa5bb9d1af Mon Sep 17 00:00:00 2001 From: Pieter Paulussen Date: Fri, 19 Jul 2024 12:13:52 +0200 Subject: [PATCH] [MIG] website_sale_product_assortment: Migration to 17.0 --- .eslintrc.yml | 3 +- .../controllers/variant.py | 4 +- .../controllers/website_sale.py | 33 +++++- .../models/product_template.py | 2 - .../static/src/js/assortment_list_preview.js | 87 +++++++------- .../static/src/js/no_purchase_tour.js | 2 - .../static/src/js/no_restriction_tour.js | 2 - .../static/src/js/no_show_tour.js | 2 - .../static/src/js/variant_mixin.js | 107 ++++++++---------- .../views/ir_filters_views.xml | 4 +- 10 files changed, 129 insertions(+), 117 deletions(-) diff --git a/.eslintrc.yml b/.eslintrc.yml index 0b38203958..20ead468ec 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,7 +4,8 @@ env: # See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 parserOptions: - ecmaVersion: 2022 + ecmaVersion: 2020 + sourceType: module overrides: - files: diff --git a/website_sale_product_assortment/controllers/variant.py b/website_sale_product_assortment/controllers/variant.py index f80dcf5044..c5f405f860 100644 --- a/website_sale_product_assortment/controllers/variant.py +++ b/website_sale_product_assortment/controllers/variant.py @@ -4,10 +4,10 @@ from odoo import _, http from odoo.http import request -from odoo.addons.sale.controllers.variant import VariantController +from odoo.addons.website_sale.controllers.variant import WebsiteSaleVariantController -class WebsiteSaleVariantController(VariantController): +class WebsiteSaleVariantControllerAssortment(WebsiteSaleVariantController): @http.route( ["/sale/get_info_assortment_preview"], type="json", diff --git a/website_sale_product_assortment/controllers/website_sale.py b/website_sale_product_assortment/controllers/website_sale.py index f8b64a205c..03879e994f 100644 --- a/website_sale_product_assortment/controllers/website_sale.py +++ b/website_sale_product_assortment/controllers/website_sale.py @@ -4,10 +4,11 @@ from odoo.http import request, route +from odoo.addons.website.controllers.main import Website from odoo.addons.website_sale.controllers.main import WebsiteSale -class WebsiteSale(WebsiteSale): +class WebsiteSaleAssortment(WebsiteSale): def _get_products_allowed(self): partner = request.env.user.partner_id website_id = request.website.id @@ -76,3 +77,33 @@ def _get_search_options( ("product_variant_ids", "in", list(allowed_product_ids)) ] return res + + +class WebsiteAssortment(Website): + @route() + def autocomplete( + self, + search_type=None, + term=None, + order=None, + limit=5, + max_nb_chars=999, + options=None, + ): + ( + allowed_product_ids, + assortment_restriction, + ) = WebsiteSaleAssortment._get_products_allowed(self) + if assortment_restriction: + options["allowed_product_domain"] = [ + ("product_variant_ids", "in", list(allowed_product_ids)) + ] + + return super().autocomplete( + search_type=search_type, + term=term, + order=order, + limit=limit, + max_nb_chars=max_nb_chars, + options=options, + ) diff --git a/website_sale_product_assortment/models/product_template.py b/website_sale_product_assortment/models/product_template.py index 3f96895afd..5f1a467ad9 100644 --- a/website_sale_product_assortment/models/product_template.py +++ b/website_sale_product_assortment/models/product_template.py @@ -38,7 +38,6 @@ def _get_combination_info( combination=False, product_id=False, add_qty=1, - pricelist=False, parent_combination=False, only_template=False, ): @@ -46,7 +45,6 @@ def _get_combination_info( combination=combination, product_id=product_id, add_qty=add_qty, - pricelist=pricelist, parent_combination=parent_combination, only_template=only_template, ) diff --git a/website_sale_product_assortment/static/src/js/assortment_list_preview.js b/website_sale_product_assortment/static/src/js/assortment_list_preview.js index 226b6f13fd..11b9262935 100644 --- a/website_sale_product_assortment/static/src/js/assortment_list_preview.js +++ b/website_sale_product_assortment/static/src/js/assortment_list_preview.js @@ -1,48 +1,49 @@ -odoo.define("website_sale_product_assortment.assortment_preview", function (require) { - "use strict"; +/** @odoo-module **/ +// Copyright 2021 Tecnativa - Carlos Roca +// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). - const publicWidget = require("web.public.widget"); - const core = require("web.core"); +import {jsonrpc} from "@web/core/network/rpc_service"; +import publicWidget from "@web/legacy/js/public/public_widget"; +import {renderToFragment} from "@web/core/utils/render"; - publicWidget.registry.WebsiteSaleProductAssortment = publicWidget.Widget.extend({ - selector: "#products_grid", +export const WebsiteSaleProductAssortment = publicWidget.Widget.extend({ + selector: "#products_grid", - start: function () { - this._super.apply(this, arguments); - this.render_assortments(); - }, - render_assortments: function () { - const $products = $(".o_wsale_product_grid_wrapper"); - const product_dic = {}; - $products.each(function () { - product_dic[this.querySelector("a img").src.split("/")[6]] = this; - }); - const product_ids = Object.keys(product_dic).map(Number); - return this._rpc({ - route: "/sale/get_info_assortment_preview", - params: {product_template_ids: product_ids}, - }).then((product_values) => { - for (const product of product_values) { - this.render_product_assortment(product_dic[product.id], product); - } - }); - }, - render_product_assortment: function (product_info, product) { - $(product_info) - .find(".product_price") - .append( - $( - core.qweb.render( - "website_sale_product_assortment.product_availability", - { - message_unavailable: product.message_unavailable, - product_template_id: product.id, - } - ) - ).get(0) - ); + start: function () { + this._super.apply(this, arguments); + this.render_assortments(); + }, - $(product_info).find(".fa-shopping-cart").parent().addClass("disabled"); - }, - }); + render_assortments: function () { + const $products = $(".o_wsale_product_grid_wrapper"); + const product_dic = {}; + $products.each(function () { + product_dic[this.querySelector("a img").src.split("/")[6]] = this; + }); + const product_ids = Object.keys(product_dic).map(Number); + return jsonrpc("/sale/get_info_assortment_preview", { + product_template_ids: product_ids, + }).then((product_values) => { + for (const product of product_values) { + this.render_product_assortment(product_dic[product.id], product); + } + }); + }, + + render_product_assortment: function (product_info, product) { + $(product_info) + .find(".product_price") + .append( + renderToFragment( + "website_sale_product_assortment.product_availability", + { + message_unavailable: product.message_unavailable, + product_template_id: product.id, + } + ) + ); + $(product_info).find(".fa-shopping-cart").parent().addClass("disabled"); + }, }); + +publicWidget.registry.WebsiteSaleProductAssortment = WebsiteSaleProductAssortment; diff --git a/website_sale_product_assortment/static/src/js/no_purchase_tour.js b/website_sale_product_assortment/static/src/js/no_purchase_tour.js index 6dd1bb8ae8..fd36cbb7e5 100644 --- a/website_sale_product_assortment/static/src/js/no_purchase_tour.js +++ b/website_sale_product_assortment/static/src/js/no_purchase_tour.js @@ -1,8 +1,6 @@ /* Copyright 2021 Tecnativa - Carlos Roca License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ odoo.define("website_sale_product_assortment.tour_no_purchase", function (require) { - "use strict"; - var tour = require("web_tour.tour"); var steps = [ diff --git a/website_sale_product_assortment/static/src/js/no_restriction_tour.js b/website_sale_product_assortment/static/src/js/no_restriction_tour.js index 2ae639bfba..7c5266ea8e 100644 --- a/website_sale_product_assortment/static/src/js/no_restriction_tour.js +++ b/website_sale_product_assortment/static/src/js/no_restriction_tour.js @@ -1,8 +1,6 @@ /* Copyright 2021 Tecnativa - Carlos Roca License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ odoo.define("website_sale_product_assortment.tour_no_restriction", function (require) { - "use strict"; - var tour = require("web_tour.tour"); var steps = [ diff --git a/website_sale_product_assortment/static/src/js/no_show_tour.js b/website_sale_product_assortment/static/src/js/no_show_tour.js index 3cba54c699..576b2a4131 100644 --- a/website_sale_product_assortment/static/src/js/no_show_tour.js +++ b/website_sale_product_assortment/static/src/js/no_show_tour.js @@ -1,8 +1,6 @@ /* Copyright 2021 Tecnativa - Carlos Roca License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ odoo.define("website_sale_product_assortment.tour_no_show", function (require) { - "use strict"; - var tour = require("web_tour.tour"); var steps = [ diff --git a/website_sale_product_assortment/static/src/js/variant_mixin.js b/website_sale_product_assortment/static/src/js/variant_mixin.js index 25094c3ad9..60b333c2be 100644 --- a/website_sale_product_assortment/static/src/js/variant_mixin.js +++ b/website_sale_product_assortment/static/src/js/variant_mixin.js @@ -1,65 +1,52 @@ +/** @odoo-module **/ // Copyright 2021 Tecnativa - Carlos Roca // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -odoo.define("website_sale_product_assortment.VariantMixin", function (require) { - "use strict"; - var VariantMixin = require("sale.VariantMixin"); - var publicWidget = require("web.public.widget"); - var core = require("web.core"); - var QWeb = core.qweb; +import VariantMixin from "@website_sale/js/sale_variant_mixin"; +import {renderToFragment} from "@web/core/utils/render"; - require("website_sale.website_sale"); +VariantMixin._onChangeCombinationAssortment = function (ev, $parent, combination) { + let product_id = 0; + if ($parent.find("input.product_id:checked").length) { + product_id = $parent.find("input.product_id:checked").val(); + } else { + product_id = $parent.find(".product_id").val(); + } + const isMainProduct = + combination.product_id && + ($parent.is(".js_main_product") || $parent.is(".main_product")) && + combination.product_id === parseInt(product_id, 10); + if (!this.isWebsite || !isMainProduct) { + return; + } + $(".oe_website_sale") + .find("#message_unavailable_" + combination.product_template_id) + .remove(); + $("#product_full_assortment_description").remove(); + if (!combination.product_avoid_purchase) { + return; + } + $parent.find("#add_to_cart").addClass("disabled"); + $parent.find("#buy_now").addClass("disabled"); + $(".oe_website_sale") + .find("#product_option_block") + .prepend( + renderToFragment( + "website_sale_product_assortment.product_availability", + combination + ) + ); + if (combination.assortment_information) { + $("#product_detail").after( + "
" + + combination.assortment_information + + "
" + ); + } +}; - VariantMixin._onChangeCombinationAssortment = function (ev, $parent, combination) { - let product_id = 0; - if ($parent.find("input.product_id:checked").length) { - product_id = $parent.find("input.product_id:checked").val(); - } else { - product_id = $parent.find(".product_id").val(); - } - const isMainProduct = - combination.product_id && - ($parent.is(".js_main_product") || $parent.is(".main_product")) && - combination.product_id === parseInt(product_id, 10); - if (!this.isWebsite || !isMainProduct) { - return; - } - $(".oe_website_sale") - .find("#message_unavailable_" + combination.product_template_id) - .remove(); - $("#product_full_assortment_description").remove(); - if (!combination.product_avoid_purchase) { - return; - } - $parent.find("#add_to_cart").addClass("disabled"); - $parent.find("#buy_now").addClass("disabled"); - $(".oe_website_sale") - .find("#product_option_block") - .prepend( - QWeb.render( - "website_sale_product_assortment.product_availability", - combination - ) - ); - if (combination.assortment_information) { - $("#product_detail").after( - "
" + - combination.assortment_information + - "
" - ); - } - }; - - publicWidget.registry.WebsiteSale.include({ - /** - * Adds the stock checking to the regular _onChangeCombination method - * @override - */ - _onChangeCombination: function () { - this._super.apply(this, arguments); - VariantMixin._onChangeCombinationAssortment.apply(this, arguments); - }, - }); - - return VariantMixin; -}); +const originalOnChangeCombination = VariantMixin._onChangeCombination; +VariantMixin._onChangeCombination = function (ev, $parent, combination) { + originalOnChangeCombination.apply(this, arguments); + VariantMixin._onChangeCombinationAssortment.apply(this, ev, $parent, combination); +}; diff --git a/website_sale_product_assortment/views/ir_filters_views.xml b/website_sale_product_assortment/views/ir_filters_views.xml index 51142aa750..68c0e728f7 100644 --- a/website_sale_product_assortment/views/ir_filters_views.xml +++ b/website_sale_product_assortment/views/ir_filters_views.xml @@ -18,11 +18,11 @@