From a9c71c23c1e0537328547b347e8ec6ff0b64493e Mon Sep 17 00:00:00 2001 From: pilarvargas-tecnativa Date: Fri, 20 Dec 2024 21:23:44 +0100 Subject: [PATCH 01/11] [ADD] website_sale_menu_partner_top_selling: New module TT52287 --- .../README.rst | 103 ++++ .../__init__.py | 2 + .../__manifest__.py | 20 + .../controllers/__init__.py | 1 + .../controllers/main.py | 110 +++++ .../i18n/ca.po | 43 ++ .../i18n/es.po | 43 ++ .../website_sale_menu_partner_top_selling.pot | 37 ++ .../models/__init__.py | 1 + .../models/res_config_settings.py | 13 + .../readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 8 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 447 ++++++++++++++++++ ...website_sale_menu_top_user_selling_tour.js | 33 ++ .../tests/__init__.py | 1 + .../tests/test_ui.py | 75 +++ .../views/res_config_settings_views.xml | 26 + .../views/templates.xml | 35 ++ 21 files changed, 1011 insertions(+) create mode 100644 website_sale_menu_partner_top_selling/README.rst create mode 100644 website_sale_menu_partner_top_selling/__init__.py create mode 100644 website_sale_menu_partner_top_selling/__manifest__.py create mode 100644 website_sale_menu_partner_top_selling/controllers/__init__.py create mode 100644 website_sale_menu_partner_top_selling/controllers/main.py create mode 100644 website_sale_menu_partner_top_selling/i18n/ca.po create mode 100644 website_sale_menu_partner_top_selling/i18n/es.po create mode 100644 website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot create mode 100644 website_sale_menu_partner_top_selling/models/__init__.py create mode 100644 website_sale_menu_partner_top_selling/models/res_config_settings.py create mode 100644 website_sale_menu_partner_top_selling/readme/CONFIGURE.rst create mode 100644 website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst create mode 100644 website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst create mode 100644 website_sale_menu_partner_top_selling/readme/USAGE.rst create mode 100644 website_sale_menu_partner_top_selling/static/description/icon.png create mode 100644 website_sale_menu_partner_top_selling/static/description/index.html create mode 100644 website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js create mode 100644 website_sale_menu_partner_top_selling/tests/__init__.py create mode 100644 website_sale_menu_partner_top_selling/tests/test_ui.py create mode 100644 website_sale_menu_partner_top_selling/views/res_config_settings_views.xml create mode 100644 website_sale_menu_partner_top_selling/views/templates.xml diff --git a/website_sale_menu_partner_top_selling/README.rst b/website_sale_menu_partner_top_selling/README.rst new file mode 100644 index 0000000000..e7b38172dc --- /dev/null +++ b/website_sale_menu_partner_top_selling/README.rst @@ -0,0 +1,103 @@ +===================================== +Website Sale Menu Partner Top Selling +===================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:47880b18d2a2afbd1cce375bf5bd03ddce1f00e02250145731e0fb8389d42c27 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github + :target: https://github.com/OCA/e-commerce/tree/15.0/website_sale_menu_partner_top_selling + :alt: OCA/e-commerce +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_menu_partner_top_selling + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to display the products purchased regularly by a user and his +company in the online shop. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +The module allows you to configure the number of products to be displayed by means of a +configuration parameter. + +Limit settings: + +Go to Settings > Website > Products and adjust the value in the corresponding field to +set the maximum number of products to be displayed on the regular products page. +The category panel must also be active in /shop. + +Usage +===== + +Regular products can be viewed by accessing the URL /shop/my_regular_products on the +website. + +This URL can be accessed from */shop* by clicking on *My regular products* in the +category menu. + +The page will display the products regularly purchased by the user's company's +customers, sorted by the number of units sold in descending order. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_ + + * Pilar Vargas + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/e-commerce `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_sale_menu_partner_top_selling/__init__.py b/website_sale_menu_partner_top_selling/__init__.py new file mode 100644 index 0000000000..91c5580fed --- /dev/null +++ b/website_sale_menu_partner_top_selling/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import models diff --git a/website_sale_menu_partner_top_selling/__manifest__.py b/website_sale_menu_partner_top_selling/__manifest__.py new file mode 100644 index 0000000000..11818d60c0 --- /dev/null +++ b/website_sale_menu_partner_top_selling/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Tecnativa - Pilar Vargas +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Website Sale Menu Partner Top Selling", + "summary": "Displays the user's regular products in the e-commerce.", + "version": "15.0.1.0.0", + "category": "Website", + "website": "https://github.com/OCA/e-commerce", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["website_sale"], + "data": ["views/res_config_settings_views.xml", "views/templates.xml"], + "assets": { + "web.assets_tests": [ + "website_sale_menu_partner_top_selling/static/src/js/tours/*.js" + ], + }, +} diff --git a/website_sale_menu_partner_top_selling/controllers/__init__.py b/website_sale_menu_partner_top_selling/controllers/__init__.py new file mode 100644 index 0000000000..12a7e529b6 --- /dev/null +++ b/website_sale_menu_partner_top_selling/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/website_sale_menu_partner_top_selling/controllers/main.py b/website_sale_menu_partner_top_selling/controllers/main.py new file mode 100644 index 0000000000..57fd050ae9 --- /dev/null +++ b/website_sale_menu_partner_top_selling/controllers/main.py @@ -0,0 +1,110 @@ +from odoo import http +from odoo.http import request + +from odoo.addons.website_sale.controllers.main import TableCompute, WebsiteSale + + +class WebsiteSale(WebsiteSale): + @http.route( + ["/shop/my_regular_products", "/shop/my_regular_products/page/"], + type="http", + auth="public", + website=True, + ) + def user_regular_products(self, page=0, ppg=False, **kwargs): + if request.env.user.has_group("base.group_public"): + return request.redirect("/web/login") + param_limit = int( + request.env["ir.config_parameter"] + .sudo() + .get_param("website_sale_menu_partner_top_selling.limit", 10) + ) + # Get best-selling products from the user + partner = request.env.user.partner_id + company_partner = partner.commercial_partner_id or partner + product_data = ( + request.env["sale.order.line"] + .sudo() + .read_group( + [ + ( + "order_id.partner_id.commercial_partner_id", + "=", + company_partner.id, + ), + ("order_id.state", "in", ["sale", "done"]), + ("product_id.product_tmpl_id.website_published", "=", True), + ( + "product_id.product_tmpl_id.website_id", + "in", + [request.website.id, False], + ), + ( + "product_id.product_tmpl_id.company_id", + "in", + [request.website.company_id.id, False], + ), + ], + ["product_id", "product_uom_qty:sum"], + ["product_id"], + orderby="product_uom_qty DESC", + ) + ) + top_product_ids = [ + rec["product_id"][0] for rec in product_data if rec["product_id"] + ] + # Search for templates of best-selling products + product_templates = ( + request.env["product.product"] + .sudo() + .search([("id", "in", top_product_ids)]) + ) + template_quantities = {} + for product in product_templates: + template_id = product.product_tmpl_id.id + if template_id not in template_quantities: + template_quantities[template_id] = 0 + template_quantities[template_id] += next( + rec["product_uom_qty"] + for rec in product_data + if rec["product_id"][0] == product.id + ) + # Sort the templates by total quantity sold and limit + sorted_template_ids = sorted( + template_quantities.keys(), + key=lambda tmpl_id: template_quantities[tmpl_id], + reverse=True, + ) + limited_template_ids = sorted_template_ids[:param_limit] + templates = request.env["product.template"].sudo().browse(limited_template_ids) + # Pagination + ppg = ppg or 20 + total_products = len(templates) + page_count = (total_products + ppg - 1) // ppg + page = max(0, min(page, page_count - 1)) + offset = page * ppg + products_on_page = templates[offset : offset + ppg] + pager = request.website.pager( + url="/shop/my_regular_products", + total=total_products, + page=page + 1, + step=ppg, + scope=5, + url_args=kwargs, + ) + # Shop context for the view + shop_context = self.shop(page=page, ppg=ppg, **kwargs) + shop_context.qcontext.update( + { + "pager": pager, + "products": products_on_page, + "search_product": products_on_page, + "search_count": total_products, + "bins": TableCompute().process( + products_on_page, + ppg, + request.env["website"].get_current_website().shop_ppr or 4, + ), + } + ) + return request.render("website_sale.products", shop_context.qcontext) diff --git a/website_sale_menu_partner_top_selling/i18n/ca.po b/website_sale_menu_partner_top_selling/i18n/ca.po new file mode 100644 index 0000000000..c429030992 --- /dev/null +++ b/website_sale_menu_partner_top_selling/i18n/ca.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_sale_menu_partner_top_selling +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-09 12:22+0000\n" +"PO-Revision-Date: 2025-01-09 13:27+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.4.2\n" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustos de configuració" + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "" +"Define the number of regular products you want to display in the e-commerce " +"catalog." +msgstr "" +"Defineix el nombre de productes regulars que vols mostrar al catàleg de " +"comerç electrònic." + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.products_categories_top_user_selling +msgid "My Regular Products" +msgstr "Els meus productes habituals" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model.fields,field_description:website_sale_menu_partner_top_selling.field_res_config_settings__regular_products_limit +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "Regular Products Limit" +msgstr "Límit de productes habituals" diff --git a/website_sale_menu_partner_top_selling/i18n/es.po b/website_sale_menu_partner_top_selling/i18n/es.po new file mode 100644 index 0000000000..33c3e80a6c --- /dev/null +++ b/website_sale_menu_partner_top_selling/i18n/es.po @@ -0,0 +1,43 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_sale_menu_partner_top_selling +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-01-09 12:22+0000\n" +"PO-Revision-Date: 2025-01-09 13:23+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.4.2\n" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings +msgid "Config Settings" +msgstr "Opciones de configuración" + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "" +"Define the number of regular products you want to display in the e-commerce " +"catalog." +msgstr "" +"Defina el número de productos habituales que desea mostrar en el catálogo de " +"productos de comercio electrónico." + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.products_categories_top_user_selling +msgid "My Regular Products" +msgstr "Mis productos habituales" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model.fields,field_description:website_sale_menu_partner_top_selling.field_res_config_settings__regular_products_limit +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "Regular Products Limit" +msgstr "Límite de productos habituales" diff --git a/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot b/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot new file mode 100644 index 0000000000..0002d96f47 --- /dev/null +++ b/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_sale_menu_partner_top_selling +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "" +"Define the number of regular products you want to display in the e-commerce " +"catalog." +msgstr "" + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.products_categories_top_user_selling +msgid "My Regular Products" +msgstr "" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model.fields,field_description:website_sale_menu_partner_top_selling.field_res_config_settings__regular_products_limit +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "Regular Products Limit" +msgstr "" diff --git a/website_sale_menu_partner_top_selling/models/__init__.py b/website_sale_menu_partner_top_selling/models/__init__.py new file mode 100644 index 0000000000..0deb68c468 --- /dev/null +++ b/website_sale_menu_partner_top_selling/models/__init__.py @@ -0,0 +1 @@ +from . import res_config_settings diff --git a/website_sale_menu_partner_top_selling/models/res_config_settings.py b/website_sale_menu_partner_top_selling/models/res_config_settings.py new file mode 100644 index 0000000000..25e6db14e5 --- /dev/null +++ b/website_sale_menu_partner_top_selling/models/res_config_settings.py @@ -0,0 +1,13 @@ +# Copyright 2024 Tecnativa - Pilar Vargas +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + + _inherit = "res.config.settings" + + regular_products_limit = fields.Integer( + default=10, config_parameter="website_sale_menu_partner_top_selling.limit" + ) diff --git a/website_sale_menu_partner_top_selling/readme/CONFIGURE.rst b/website_sale_menu_partner_top_selling/readme/CONFIGURE.rst new file mode 100644 index 0000000000..ff91828b52 --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +The module allows you to configure the number of products to be displayed by means of a +configuration parameter. + +Limit settings: + +Go to Settings > Website > Products and adjust the value in the corresponding field to +set the maximum number of products to be displayed on the regular products page. +The category panel must also be active in /shop. diff --git a/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..7029b234a0 --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Tecnativa `_ + + * Pilar Vargas diff --git a/website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst b/website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..65ffb784b8 --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module allows you to display the products purchased regularly by a user and his +company in the online shop. diff --git a/website_sale_menu_partner_top_selling/readme/USAGE.rst b/website_sale_menu_partner_top_selling/readme/USAGE.rst new file mode 100644 index 0000000000..65704654ba --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/USAGE.rst @@ -0,0 +1,8 @@ +Regular products can be viewed by accessing the URL /shop/my_regular_products on the +website. + +This URL can be accessed from */shop* by clicking on *My regular products* in the +category menu. + +The page will display the products regularly purchased by the user's company's +customers, sorted by the number of units sold in descending order. diff --git a/website_sale_menu_partner_top_selling/static/description/icon.png b/website_sale_menu_partner_top_selling/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/website_sale_menu_partner_top_selling/static/description/index.html b/website_sale_menu_partner_top_selling/static/description/index.html new file mode 100644 index 0000000000..50cb2c3d4b --- /dev/null +++ b/website_sale_menu_partner_top_selling/static/description/index.html @@ -0,0 +1,447 @@ + + + + + +Website Sale Menu Partner Top Selling + + + +
+

Website Sale Menu Partner Top Selling

+ + +

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runboat

+

This module allows you to display the products purchased regularly by a user and his +company in the online shop.

+

Table of contents

+ +
+

Configuration

+

The module allows you to configure the number of products to be displayed by means of a +configuration parameter.

+

Limit settings:

+

Go to Settings > Website > Products and adjust the value in the corresponding field to +set the maximum number of products to be displayed on the regular products page. +The category panel must also be active in /shop.

+
+
+

Usage

+

Regular products can be viewed by accessing the URL /shop/my_regular_products on the +website.

+

This URL can be accessed from /shop by clicking on My regular products in the +category menu.

+

The page will display the products regularly purchased by the user’s company’s +customers, sorted by the number of units sold in descending order.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/e-commerce project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js b/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js new file mode 100644 index 0000000000..7c8ea3cab3 --- /dev/null +++ b/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js @@ -0,0 +1,33 @@ +/* Copyright 2024 Pilar Vargas + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ + +odoo.define("website_sale_menu_partner_top_selling.tour", function (require) { + "use strict"; + + var tour = require("web_tour.tour"); + var base = require("web_editor.base"); + + var steps = [ + { + trigger: "#products_grid_before label:contains('My Regular Products')", + }, + { + trigger: "a:contains('Product 5')", + extra_trigger: + "#products_grid:has(a:contains('Product 3')):not(:has(a:contains('Product 1'))):not(:has(a:contains('Product 2'))):not(:has(a:contains('Product 4')))", + }, + ]; + + tour.register( + "website_sale_menu_partner_top_selling", + { + url: "/shop", + test: true, + wait_for: base.ready(), + }, + steps + ); + return { + steps: steps, + }; +}); diff --git a/website_sale_menu_partner_top_selling/tests/__init__.py b/website_sale_menu_partner_top_selling/tests/__init__.py new file mode 100644 index 0000000000..6dab214ac8 --- /dev/null +++ b/website_sale_menu_partner_top_selling/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ui diff --git a/website_sale_menu_partner_top_selling/tests/test_ui.py b/website_sale_menu_partner_top_selling/tests/test_ui.py new file mode 100644 index 0000000000..89182a495f --- /dev/null +++ b/website_sale_menu_partner_top_selling/tests/test_ui.py @@ -0,0 +1,75 @@ +# Copyright 2024 Tecnativa - Pilar Vargas +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import HttpCase, tagged + + +@tagged("post_install", "-at_install") +class TestUi(HttpCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + # Remove this variable in v16 and put instead: + # from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + DISABLED_MAIL_CONTEXT = { + "tracking_disable": True, + "mail_create_nolog": True, + "mail_create_nosubscribe": True, + "mail_notrack": True, + "no_reset_password": True, + } + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.env.ref("website_sale.products_categories").active = True + cls.env["ir.config_parameter"].sudo().set_param( + "website_sale_menu_partner_top_selling.limit", 2 + ) + cls.admin_user = cls.env.ref("base.user_admin") + cls.partner = cls.admin_user.partner_id + cls.products = [] + for i in range(1, 6): + product = cls.env["product.product"].create( + { + "name": f"Product {i}", + "list_price": 10.0 * i, + } + ) + product.product_tmpl_id.website_published = True + cls.products.append(product) + cls.sale_order = cls.env["sale.order"].create( + { + "partner_id": cls.partner.id, + } + ) + quantities = [50, 30, 70, 10, 90] + for product, qty in zip(cls.products, quantities): + cls.env["sale.order.line"].create( + { + "order_id": cls.sale_order.id, + "product_id": product.id, + "product_uom_qty": qty, + "price_unit": product.list_price, + } + ) + cls.sale_order.action_confirm() + # Unconfirmed order, no products to be counted + cls.sale_order_2 = cls.env["sale.order"].create( + { + "partner_id": cls.partner.id, + } + ) + cls.env["sale.order.line"].create( + { + "order_id": cls.sale_order_2.id, + "product_id": cls.products[0].id, + "product_uom_qty": 1000, + "price_unit": cls.products[0].list_price, + } + ) + + def test_ui(self): + """Test frontend tour.""" + self.start_tour( + "/shop", + "website_sale_menu_partner_top_selling", + login="admin", + ) diff --git a/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml b/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml new file mode 100644 index 0000000000..c96882e9e1 --- /dev/null +++ b/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml @@ -0,0 +1,26 @@ + + + + + res.config.settings + + + +
+
+
+
+
+ + + + diff --git a/website_sale_menu_partner_top_selling/views/templates.xml b/website_sale_menu_partner_top_selling/views/templates.xml new file mode 100644 index 0000000000..924267e4d6 --- /dev/null +++ b/website_sale_menu_partner_top_selling/views/templates.xml @@ -0,0 +1,35 @@ + + + + From f69142f1418ce95ace4209c7b67f71014a518e53 Mon Sep 17 00:00:00 2001 From: pilarvargas-tecnativa Date: Tue, 4 Feb 2025 07:44:20 +0100 Subject: [PATCH 02/11] [IMP] website_sale_menu_partner_top_selling: pre-commit auto fixes --- .../README.rst | 48 ++++++++++--------- .../models/res_config_settings.py | 1 - .../pyproject.toml | 3 ++ .../readme/CONFIGURE.md | 9 ++++ .../readme/CONFIGURE.rst | 8 ---- .../readme/CONTRIBUTORS.md | 2 + .../readme/CONTRIBUTORS.rst | 3 -- .../{DESCRIPTION.rst => DESCRIPTION.md} | 4 +- .../readme/USAGE.md | 9 ++++ .../readme/USAGE.rst | 8 ---- .../static/description/index.html | 34 ++++++------- 11 files changed, 68 insertions(+), 61 deletions(-) create mode 100644 website_sale_menu_partner_top_selling/pyproject.toml create mode 100644 website_sale_menu_partner_top_selling/readme/CONFIGURE.md delete mode 100644 website_sale_menu_partner_top_selling/readme/CONFIGURE.rst create mode 100644 website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md delete mode 100644 website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst rename website_sale_menu_partner_top_selling/readme/{DESCRIPTION.rst => DESCRIPTION.md} (56%) create mode 100644 website_sale_menu_partner_top_selling/readme/USAGE.md delete mode 100644 website_sale_menu_partner_top_selling/readme/USAGE.rst diff --git a/website_sale_menu_partner_top_selling/README.rst b/website_sale_menu_partner_top_selling/README.rst index e7b38172dc..8a7a0e8061 100644 --- a/website_sale_menu_partner_top_selling/README.rst +++ b/website_sale_menu_partner_top_selling/README.rst @@ -17,19 +17,19 @@ Website Sale Menu Partner Top Selling :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github - :target: https://github.com/OCA/e-commerce/tree/15.0/website_sale_menu_partner_top_selling + :target: https://github.com/OCA/e-commerce/tree/17.0/website_sale_menu_partner_top_selling :alt: OCA/e-commerce .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_menu_partner_top_selling + :target: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows you to display the products purchased regularly by a user and his -company in the online shop. +This module allows you to display the products purchased regularly by a +user and his company in the online shop. **Table of contents** @@ -39,26 +39,28 @@ company in the online shop. Configuration ============= -The module allows you to configure the number of products to be displayed by means of a -configuration parameter. +The module allows you to configure the number of products to be +displayed by means of a configuration parameter. Limit settings: -Go to Settings > Website > Products and adjust the value in the corresponding field to -set the maximum number of products to be displayed on the regular products page. -The category panel must also be active in /shop. +Go to Settings > Website > Products and adjust the value in the +corresponding field to set the maximum number of products to be +displayed on the regular products page. The category panel must also be +active in /shop. Usage ===== -Regular products can be viewed by accessing the URL /shop/my_regular_products on the -website. +Regular products can be viewed by accessing the URL +/shop/my_regular_products on the website. -This URL can be accessed from */shop* by clicking on *My regular products* in the -category menu. +This URL can be accessed from */shop* by clicking on *My regular +products* in the category menu. -The page will display the products regularly purchased by the user's company's -customers, sorted by the number of units sold in descending order. +The page will display the products regularly purchased by the user's +company's customers, sorted by the number of units sold in descending +order. Bug Tracker =========== @@ -66,7 +68,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -74,19 +76,19 @@ Credits ======= Authors -~~~~~~~ +------- * Tecnativa Contributors -~~~~~~~~~~~~ +------------ -* `Tecnativa `_ +- `Tecnativa `__ - * Pilar Vargas + - Pilar Vargas Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -98,6 +100,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/e-commerce `_ project on GitHub. +This module is part of the `OCA/e-commerce `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_sale_menu_partner_top_selling/models/res_config_settings.py b/website_sale_menu_partner_top_selling/models/res_config_settings.py index 25e6db14e5..5a8356f8e2 100644 --- a/website_sale_menu_partner_top_selling/models/res_config_settings.py +++ b/website_sale_menu_partner_top_selling/models/res_config_settings.py @@ -5,7 +5,6 @@ class ResConfigSettings(models.TransientModel): - _inherit = "res.config.settings" regular_products_limit = fields.Integer( diff --git a/website_sale_menu_partner_top_selling/pyproject.toml b/website_sale_menu_partner_top_selling/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/website_sale_menu_partner_top_selling/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/website_sale_menu_partner_top_selling/readme/CONFIGURE.md b/website_sale_menu_partner_top_selling/readme/CONFIGURE.md new file mode 100644 index 0000000000..b93720c43f --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/CONFIGURE.md @@ -0,0 +1,9 @@ +The module allows you to configure the number of products to be +displayed by means of a configuration parameter. + +Limit settings: + +Go to Settings \> Website \> Products and adjust the value in the +corresponding field to set the maximum number of products to be +displayed on the regular products page. The category panel must also be +active in /shop. diff --git a/website_sale_menu_partner_top_selling/readme/CONFIGURE.rst b/website_sale_menu_partner_top_selling/readme/CONFIGURE.rst deleted file mode 100644 index ff91828b52..0000000000 --- a/website_sale_menu_partner_top_selling/readme/CONFIGURE.rst +++ /dev/null @@ -1,8 +0,0 @@ -The module allows you to configure the number of products to be displayed by means of a -configuration parameter. - -Limit settings: - -Go to Settings > Website > Products and adjust the value in the corresponding field to -set the maximum number of products to be displayed on the regular products page. -The category panel must also be active in /shop. diff --git a/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..aaa6b9be25 --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Tecnativa](https://www.tecnativa.com) + - Pilar Vargas diff --git a/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst deleted file mode 100644 index 7029b234a0..0000000000 --- a/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,3 +0,0 @@ -* `Tecnativa `_ - - * Pilar Vargas diff --git a/website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst b/website_sale_menu_partner_top_selling/readme/DESCRIPTION.md similarity index 56% rename from website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst rename to website_sale_menu_partner_top_selling/readme/DESCRIPTION.md index 65ffb784b8..061a1730d8 100644 --- a/website_sale_menu_partner_top_selling/readme/DESCRIPTION.rst +++ b/website_sale_menu_partner_top_selling/readme/DESCRIPTION.md @@ -1,2 +1,2 @@ -This module allows you to display the products purchased regularly by a user and his -company in the online shop. +This module allows you to display the products purchased regularly by a +user and his company in the online shop. diff --git a/website_sale_menu_partner_top_selling/readme/USAGE.md b/website_sale_menu_partner_top_selling/readme/USAGE.md new file mode 100644 index 0000000000..fc778183cd --- /dev/null +++ b/website_sale_menu_partner_top_selling/readme/USAGE.md @@ -0,0 +1,9 @@ +Regular products can be viewed by accessing the URL +/shop/my_regular_products on the website. + +This URL can be accessed from */shop* by clicking on *My regular +products* in the category menu. + +The page will display the products regularly purchased by the user's +company's customers, sorted by the number of units sold in descending +order. diff --git a/website_sale_menu_partner_top_selling/readme/USAGE.rst b/website_sale_menu_partner_top_selling/readme/USAGE.rst deleted file mode 100644 index 65704654ba..0000000000 --- a/website_sale_menu_partner_top_selling/readme/USAGE.rst +++ /dev/null @@ -1,8 +0,0 @@ -Regular products can be viewed by accessing the URL /shop/my_regular_products on the -website. - -This URL can be accessed from */shop* by clicking on *My regular products* in the -category menu. - -The page will display the products regularly purchased by the user's company's -customers, sorted by the number of units sold in descending order. diff --git a/website_sale_menu_partner_top_selling/static/description/index.html b/website_sale_menu_partner_top_selling/static/description/index.html index 50cb2c3d4b..a7707e0561 100644 --- a/website_sale_menu_partner_top_selling/static/description/index.html +++ b/website_sale_menu_partner_top_selling/static/description/index.html @@ -369,9 +369,9 @@

Website Sale Menu Partner Top Selling

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:47880b18d2a2afbd1cce375bf5bd03ddce1f00e02250145731e0fb8389d42c27 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runboat

-

This module allows you to display the products purchased regularly by a user and his -company in the online shop.

+

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runboat

+

This module allows you to display the products purchased regularly by a +user and his company in the online shop.

Table of contents

    @@ -388,28 +388,30 @@

    Website Sale Menu Partner Top Selling

Configuration

-

The module allows you to configure the number of products to be displayed by means of a -configuration parameter.

+

The module allows you to configure the number of products to be +displayed by means of a configuration parameter.

Limit settings:

-

Go to Settings > Website > Products and adjust the value in the corresponding field to -set the maximum number of products to be displayed on the regular products page. -The category panel must also be active in /shop.

+

Go to Settings > Website > Products and adjust the value in the +corresponding field to set the maximum number of products to be +displayed on the regular products page. The category panel must also be +active in /shop.

Usage

-

Regular products can be viewed by accessing the URL /shop/my_regular_products on the -website.

-

This URL can be accessed from /shop by clicking on My regular products in the -category menu.

-

The page will display the products regularly purchased by the user’s company’s -customers, sorted by the number of units sold in descending order.

+

Regular products can be viewed by accessing the URL +/shop/my_regular_products on the website.

+

This URL can be accessed from /shop by clicking on My regular +products in the category menu.

+

The page will display the products regularly purchased by the user’s +company’s customers, sorted by the number of units sold in descending +order.

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -438,7 +440,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/e-commerce project on GitHub.

+

This module is part of the OCA/e-commerce project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From 0193e3982343754608a27698ab8e15499681c449 Mon Sep 17 00:00:00 2001 From: pilarvargas-tecnativa Date: Tue, 4 Feb 2025 10:51:50 +0100 Subject: [PATCH 03/11] [MIG] website_sale_menu_partner_top_selling: Migration to version 17.0 TT52987 --- .../README.rst | 14 +++++++-- .../__manifest__.py | 5 ++-- .../controllers/main.py | 20 ++++++++++--- .../website_sale_menu_partner_top_selling.pot | 2 +- .../static/description/index.html | 4 ++- ...te_sale_menu_top_user_selling_tour.esm.js} | 29 +++++-------------- .../tests/test_ui.py | 14 +++------ .../views/res_config_settings_views.xml | 25 +++++++--------- .../views/templates.xml | 17 +++++------ 9 files changed, 65 insertions(+), 65 deletions(-) rename website_sale_menu_partner_top_selling/static/src/js/tours/{website_sale_menu_top_user_selling_tour.js => website_sale_menu_top_user_selling_tour.esm.js} (51%) diff --git a/website_sale_menu_partner_top_selling/README.rst b/website_sale_menu_partner_top_selling/README.rst index 8a7a0e8061..3e2469f533 100644 --- a/website_sale_menu_partner_top_selling/README.rst +++ b/website_sale_menu_partner_top_selling/README.rst @@ -7,7 +7,7 @@ Website Sale Menu Partner Top Selling !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:47880b18d2a2afbd1cce375bf5bd03ddce1f00e02250145731e0fb8389d42c27 + !! source digest: sha256:551f110e4312267011f5510e441abdf47f84484bccdc8b1a68a8932202220d5c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -83,9 +83,9 @@ Authors Contributors ------------ -- `Tecnativa `__ +- `Tecnativa `__ - - Pilar Vargas + - Pilar Vargas Maintainers ----------- @@ -100,6 +100,14 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. +.. |maintainer-pilarvargas-tecnativa| image:: https://github.com/pilarvargas-tecnativa.png?size=40px + :target: https://github.com/pilarvargas-tecnativa + :alt: pilarvargas-tecnativa + +Current `maintainer `__: + +|maintainer-pilarvargas-tecnativa| + This module is part of the `OCA/e-commerce `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_sale_menu_partner_top_selling/__manifest__.py b/website_sale_menu_partner_top_selling/__manifest__.py index 11818d60c0..e8769cbd12 100644 --- a/website_sale_menu_partner_top_selling/__manifest__.py +++ b/website_sale_menu_partner_top_selling/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Website Sale Menu Partner Top Selling", "summary": "Displays the user's regular products in the e-commerce.", - "version": "15.0.1.0.0", + "version": "17.0.1.0.0", "category": "Website", "website": "https://github.com/OCA/e-commerce", "author": "Tecnativa, Odoo Community Association (OCA)", @@ -14,7 +14,8 @@ "data": ["views/res_config_settings_views.xml", "views/templates.xml"], "assets": { "web.assets_tests": [ - "website_sale_menu_partner_top_selling/static/src/js/tours/*.js" + "website_sale_menu_partner_top_selling/static/src/js/tours/*.esm.js" ], }, + "maintainers": ["pilarvargas-tecnativa"], } diff --git a/website_sale_menu_partner_top_selling/controllers/main.py b/website_sale_menu_partner_top_selling/controllers/main.py index 57fd050ae9..de94ee67e8 100644 --- a/website_sale_menu_partner_top_selling/controllers/main.py +++ b/website_sale_menu_partner_top_selling/controllers/main.py @@ -1,5 +1,6 @@ from odoo import http from odoo.http import request +from odoo.tools import lazy from odoo.addons.website_sale.controllers.main import TableCompute, WebsiteSale @@ -14,6 +15,7 @@ class WebsiteSale(WebsiteSale): def user_regular_products(self, page=0, ppg=False, **kwargs): if request.env.user.has_group("base.group_public"): return request.redirect("/web/login") + website = request.env["website"].get_current_website() param_limit = int( request.env["ir.config_parameter"] .sudo() @@ -92,6 +94,12 @@ def user_regular_products(self, page=0, ppg=False, **kwargs): scope=5, url_args=kwargs, ) + pricelist = website.pricelist_id + # Try to fetch geoip based fpos or fallback on partner one + fiscal_position_sudo = website.fiscal_position_id.sudo() + products_prices = lazy( + lambda: products_on_page._get_sales_prices(pricelist, fiscal_position_sudo) + ) # Shop context for the view shop_context = self.shop(page=page, ppg=ppg, **kwargs) shop_context.qcontext.update( @@ -100,10 +108,14 @@ def user_regular_products(self, page=0, ppg=False, **kwargs): "products": products_on_page, "search_product": products_on_page, "search_count": total_products, - "bins": TableCompute().process( - products_on_page, - ppg, - request.env["website"].get_current_website().shop_ppr or 4, + "bins": lazy( + lambda: TableCompute().process( + products_on_page, ppg, website.shop_ppr or 4 + ) + ), + "products_prices": products_prices, + "get_product_prices": lambda product: lazy( + lambda: products_prices[product.id] ), } ) diff --git a/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot b/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot index 0002d96f47..d726c6d735 100644 --- a/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot +++ b/website_sale_menu_partner_top_selling/i18n/website_sale_menu_partner_top_selling.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 15.0\n" +"Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" diff --git a/website_sale_menu_partner_top_selling/static/description/index.html b/website_sale_menu_partner_top_selling/static/description/index.html index a7707e0561..b27016665e 100644 --- a/website_sale_menu_partner_top_selling/static/description/index.html +++ b/website_sale_menu_partner_top_selling/static/description/index.html @@ -367,7 +367,7 @@

Website Sale Menu Partner Top Selling

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:47880b18d2a2afbd1cce375bf5bd03ddce1f00e02250145731e0fb8389d42c27 +!! source digest: sha256:551f110e4312267011f5510e441abdf47f84484bccdc8b1a68a8932202220d5c !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runboat

This module allows you to display the products purchased regularly by a @@ -440,6 +440,8 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

+

Current maintainer:

+

pilarvargas-tecnativa

This module is part of the OCA/e-commerce project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js b/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js similarity index 51% rename from website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js rename to website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js index 7c8ea3cab3..32f9d68669 100644 --- a/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.js +++ b/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js @@ -1,13 +1,13 @@ +/** @odoo-module **/ + /* Copyright 2024 Pilar Vargas * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ +import {registry} from "@web/core/registry"; -odoo.define("website_sale_menu_partner_top_selling.tour", function (require) { - "use strict"; - - var tour = require("web_tour.tour"); - var base = require("web_editor.base"); - - var steps = [ +registry.category("web_tour.tours").add("website_sale_menu_partner_top_selling", { + test: true, + url: "/shop", + steps: () => [ { trigger: "#products_grid_before label:contains('My Regular Products')", }, @@ -16,18 +16,5 @@ odoo.define("website_sale_menu_partner_top_selling.tour", function (require) { extra_trigger: "#products_grid:has(a:contains('Product 3')):not(:has(a:contains('Product 1'))):not(:has(a:contains('Product 2'))):not(:has(a:contains('Product 4')))", }, - ]; - - tour.register( - "website_sale_menu_partner_top_selling", - { - url: "/shop", - test: true, - wait_for: base.ready(), - }, - steps - ); - return { - steps: steps, - }; + ], }); diff --git a/website_sale_menu_partner_top_selling/tests/test_ui.py b/website_sale_menu_partner_top_selling/tests/test_ui.py index 89182a495f..d52ccf5e65 100644 --- a/website_sale_menu_partner_top_selling/tests/test_ui.py +++ b/website_sale_menu_partner_top_selling/tests/test_ui.py @@ -3,21 +3,14 @@ from odoo.tests.common import HttpCase, tagged +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + @tagged("post_install", "-at_install") class TestUi(HttpCase): @classmethod def setUpClass(cls): super().setUpClass() - # Remove this variable in v16 and put instead: - # from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT - DISABLED_MAIL_CONTEXT = { - "tracking_disable": True, - "mail_create_nolog": True, - "mail_create_nosubscribe": True, - "mail_notrack": True, - "no_reset_password": True, - } cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) cls.env.ref("website_sale.products_categories").active = True cls.env["ir.config_parameter"].sudo().set_param( @@ -41,7 +34,7 @@ def setUpClass(cls): } ) quantities = [50, 30, 70, 10, 90] - for product, qty in zip(cls.products, quantities): + for product, qty in zip(cls.products, quantities, strict=True): cls.env["sale.order.line"].create( { "order_id": cls.sale_order.id, @@ -72,4 +65,5 @@ def test_ui(self): "/shop", "website_sale_menu_partner_top_selling", login="admin", + step_delay=100, ) diff --git a/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml b/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml index c96882e9e1..b43c24ec22 100644 --- a/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml +++ b/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml @@ -6,20 +6,17 @@ res.config.settings - -
-
-
-
-
+ + + + diff --git a/website_sale_menu_partner_top_selling/views/templates.xml b/website_sale_menu_partner_top_selling/views/templates.xml index 924267e4d6..7a3c3d9b52 100644 --- a/website_sale_menu_partner_top_selling/views/templates.xml +++ b/website_sale_menu_partner_top_selling/views/templates.xml @@ -2,7 +2,7 @@ From 86fc197508d08e1cd0fdaaa1347c4d08d2db5436 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 27 May 2025 11:57:44 +0000 Subject: [PATCH 04/11] Added translation using Weblate (Italian) --- .../i18n/it.po | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 website_sale_menu_partner_top_selling/i18n/it.po diff --git a/website_sale_menu_partner_top_selling/i18n/it.po b/website_sale_menu_partner_top_selling/i18n/it.po new file mode 100644 index 0000000000..4e684c1534 --- /dev/null +++ b/website_sale_menu_partner_top_selling/i18n/it.po @@ -0,0 +1,42 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_sale_menu_partner_top_selling +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-05-28 11:25+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "" +"Define the number of regular products you want to display in the e-commerce " +"catalog." +msgstr "" +"Definire il numero dei prodotti regolari che si vuole visualizzare nel " +"catalogo di e-commerce." + +#. module: website_sale_menu_partner_top_selling +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.products_categories_top_user_selling +msgid "My Regular Products" +msgstr "I miei prodotti regolari" + +#. module: website_sale_menu_partner_top_selling +#: model:ir.model.fields,field_description:website_sale_menu_partner_top_selling.field_res_config_settings__regular_products_limit +#: model_terms:ir.ui.view,arch_db:website_sale_menu_partner_top_selling.view_stock_configuration +msgid "Regular Products Limit" +msgstr "Limite prodotti regolari" From b121145fdf209c59d12f3bb0f04309241488d633 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 5 May 2026 15:13:00 +0000 Subject: [PATCH 05/11] Translated using Weblate (Spanish) Currently translated at 100.0% (4 of 4 strings) Translation: e-commerce-17.0/e-commerce-17.0-website_sale_menu_partner_top_selling Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling/es/ --- website_sale_menu_partner_top_selling/i18n/es.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website_sale_menu_partner_top_selling/i18n/es.po b/website_sale_menu_partner_top_selling/i18n/es.po index 33c3e80a6c..293b60111d 100644 --- a/website_sale_menu_partner_top_selling/i18n/es.po +++ b/website_sale_menu_partner_top_selling/i18n/es.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-09 12:22+0000\n" -"PO-Revision-Date: 2025-01-09 13:23+0100\n" -"Last-Translator: \n" +"PO-Revision-Date: 2026-05-05 15:13+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.4.2\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: website_sale_menu_partner_top_selling #: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings From 2a3acf3680f6495030b2e09f640a49e9ab667c92 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 5 May 2026 15:13:00 +0000 Subject: [PATCH 06/11] Translated using Weblate (Catalan) Currently translated at 100.0% (4 of 4 strings) Translation: e-commerce-17.0/e-commerce-17.0-website_sale_menu_partner_top_selling Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling/ca/ --- website_sale_menu_partner_top_selling/i18n/ca.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/website_sale_menu_partner_top_selling/i18n/ca.po b/website_sale_menu_partner_top_selling/i18n/ca.po index c429030992..a820408140 100644 --- a/website_sale_menu_partner_top_selling/i18n/ca.po +++ b/website_sale_menu_partner_top_selling/i18n/ca.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-09 12:22+0000\n" -"PO-Revision-Date: 2025-01-09 13:27+0100\n" -"Last-Translator: \n" +"PO-Revision-Date: 2026-05-05 15:13+0000\n" +"Last-Translator: Anonymous \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.4.2\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" #. module: website_sale_menu_partner_top_selling #: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings From a4a531dd37a5da7da377487d96f4c08f695216d1 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 5 May 2026 15:13:01 +0000 Subject: [PATCH 07/11] Translated using Weblate (Italian) Currently translated at 100.0% (4 of 4 strings) Translation: e-commerce-17.0/e-commerce-17.0-website_sale_menu_partner_top_selling Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling/it/ --- website_sale_menu_partner_top_selling/i18n/it.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website_sale_menu_partner_top_selling/i18n/it.po b/website_sale_menu_partner_top_selling/i18n/it.po index 4e684c1534..19dbe5bdcc 100644 --- a/website_sale_menu_partner_top_selling/i18n/it.po +++ b/website_sale_menu_partner_top_selling/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2025-05-28 11:25+0000\n" +"PO-Revision-Date: 2026-05-05 15:13+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.10.4\n" +"X-Generator: Weblate 5.15.2\n" #. module: website_sale_menu_partner_top_selling #: model:ir.model,name:website_sale_menu_partner_top_selling.model_res_config_settings From fe8f79dcdddce29a08d78cdfa0e541d13875f7c9 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 5 May 2026 15:13:47 +0000 Subject: [PATCH 08/11] Translated using Weblate (Spanish) Currently translated at 100.0% (4 of 4 strings) Translation: e-commerce-17.0/e-commerce-17.0-website_sale_menu_partner_top_selling Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling/es/ --- website_sale_menu_partner_top_selling/i18n/es.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_sale_menu_partner_top_selling/i18n/es.po b/website_sale_menu_partner_top_selling/i18n/es.po index 293b60111d..3d40c8c075 100644 --- a/website_sale_menu_partner_top_selling/i18n/es.po +++ b/website_sale_menu_partner_top_selling/i18n/es.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-09 12:22+0000\n" -"PO-Revision-Date: 2026-05-05 15:13+0000\n" +"PO-Revision-Date: 2026-05-05 15:14+0000\n" "Last-Translator: Anonymous \n" "Language-Team: \n" "Language: es\n" From b867a390d499cecb01693b04ab28bc5c1950ec16 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 5 May 2026 15:13:30 +0000 Subject: [PATCH 09/11] Translated using Weblate (Catalan) Currently translated at 100.0% (4 of 4 strings) Translation: e-commerce-17.0/e-commerce-17.0-website_sale_menu_partner_top_selling Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling/ca/ --- website_sale_menu_partner_top_selling/i18n/ca.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_sale_menu_partner_top_selling/i18n/ca.po b/website_sale_menu_partner_top_selling/i18n/ca.po index a820408140..401db3074c 100644 --- a/website_sale_menu_partner_top_selling/i18n/ca.po +++ b/website_sale_menu_partner_top_selling/i18n/ca.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-09 12:22+0000\n" -"PO-Revision-Date: 2026-05-05 15:13+0000\n" +"PO-Revision-Date: 2026-05-05 15:14+0000\n" "Last-Translator: Anonymous \n" "Language-Team: \n" "Language: ca\n" From eff1aa2e00364558a0f3e8d217a8ede3ec8d7cbc Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 5 May 2026 15:13:30 +0000 Subject: [PATCH 10/11] Translated using Weblate (Italian) Currently translated at 100.0% (4 of 4 strings) Translation: e-commerce-17.0/e-commerce-17.0-website_sale_menu_partner_top_selling Translate-URL: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling/it/ --- website_sale_menu_partner_top_selling/i18n/it.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_sale_menu_partner_top_selling/i18n/it.po b/website_sale_menu_partner_top_selling/i18n/it.po index 19dbe5bdcc..cd87024030 100644 --- a/website_sale_menu_partner_top_selling/i18n/it.po +++ b/website_sale_menu_partner_top_selling/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2026-05-05 15:13+0000\n" +"PO-Revision-Date: 2026-05-05 15:14+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" From 2d06b34607af3704bea46340aa9a131007d469cc Mon Sep 17 00:00:00 2001 From: "cristina.hidalgo" Date: Wed, 26 Aug 2026 07:48:28 +0200 Subject: [PATCH 11/11] [MIG] website_sale_menu_partner_top_selling: Migration to 19.0 --- .../README.rst | 17 ++++-- .../__manifest__.py | 2 +- .../controllers/main.py | 61 ++++++++----------- .../readme/CONTRIBUTORS.md | 1 + .../static/description/index.html | 31 ++++++---- ...ite_sale_menu_top_user_selling_tour.esm.js | 12 ++-- .../tests/test_ui.py | 1 - .../views/res_config_settings_views.xml | 5 +- .../views/templates.xml | 58 ++++++++++++------ 9 files changed, 103 insertions(+), 85 deletions(-) diff --git a/website_sale_menu_partner_top_selling/README.rst b/website_sale_menu_partner_top_selling/README.rst index 3e2469f533..84140edaa1 100644 --- a/website_sale_menu_partner_top_selling/README.rst +++ b/website_sale_menu_partner_top_selling/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ===================================== Website Sale Menu Partner Top Selling ===================================== @@ -13,17 +17,17 @@ Website Sale Menu Partner Top Selling .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github - :target: https://github.com/OCA/e-commerce/tree/17.0/website_sale_menu_partner_top_selling + :target: https://github.com/OCA/e-commerce/tree/19.0/website_sale_menu_partner_top_selling :alt: OCA/e-commerce .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_menu_partner_top_selling + :target: https://translation.odoo-community.org/projects/e-commerce-19-0/e-commerce-19-0-website_sale_menu_partner_top_selling :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -68,7 +72,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -86,6 +90,7 @@ Contributors - `Tecnativa `__ - Pilar Vargas + - Cristina Hidalgo Maintainers ----------- @@ -108,6 +113,6 @@ Current `maintainer `__: |maintainer-pilarvargas-tecnativa| -This module is part of the `OCA/e-commerce `_ project on GitHub. +This module is part of the `OCA/e-commerce `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/website_sale_menu_partner_top_selling/__manifest__.py b/website_sale_menu_partner_top_selling/__manifest__.py index e8769cbd12..8b0c902ed6 100644 --- a/website_sale_menu_partner_top_selling/__manifest__.py +++ b/website_sale_menu_partner_top_selling/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Website Sale Menu Partner Top Selling", "summary": "Displays the user's regular products in the e-commerce.", - "version": "17.0.1.0.0", + "version": "19.0.1.0.0", "category": "Website", "website": "https://github.com/OCA/e-commerce", "author": "Tecnativa, Odoo Community Association (OCA)", diff --git a/website_sale_menu_partner_top_selling/controllers/main.py b/website_sale_menu_partner_top_selling/controllers/main.py index de94ee67e8..7e7f8a31b6 100644 --- a/website_sale_menu_partner_top_selling/controllers/main.py +++ b/website_sale_menu_partner_top_selling/controllers/main.py @@ -27,8 +27,8 @@ def user_regular_products(self, page=0, ppg=False, **kwargs): product_data = ( request.env["sale.order.line"] .sudo() - .read_group( - [ + ._read_group( + domain=[ ( "order_id.partner_id.commercial_partner_id", "=", @@ -47,38 +47,22 @@ def user_regular_products(self, page=0, ppg=False, **kwargs): [request.website.company_id.id, False], ), ], - ["product_id", "product_uom_qty:sum"], - ["product_id"], - orderby="product_uom_qty DESC", + groupby=["product_id"], + aggregates=["product_uom_qty:sum"], ) ) - top_product_ids = [ - rec["product_id"][0] for rec in product_data if rec["product_id"] - ] - # Search for templates of best-selling products - product_templates = ( - request.env["product.product"] - .sudo() - .search([("id", "in", top_product_ids)]) - ) + # Sum quantities per template (a template may have several variants sold) template_quantities = {} - for product in product_templates: - template_id = product.product_tmpl_id.id - if template_id not in template_quantities: - template_quantities[template_id] = 0 - template_quantities[template_id] += next( - rec["product_uom_qty"] - for rec in product_data - if rec["product_id"][0] == product.id - ) + for product, qty in product_data: + template = product.product_tmpl_id + template_quantities[template] = template_quantities.get(template, 0) + qty # Sort the templates by total quantity sold and limit - sorted_template_ids = sorted( - template_quantities.keys(), - key=lambda tmpl_id: template_quantities[tmpl_id], - reverse=True, + sorted_templates = sorted( + template_quantities, key=template_quantities.get, reverse=True + ) + templates = request.env["product.template"].concat( + *sorted_templates[:param_limit] ) - limited_template_ids = sorted_template_ids[:param_limit] - templates = request.env["product.template"].sudo().browse(limited_template_ids) # Pagination ppg = ppg or 20 total_products = len(templates) @@ -94,20 +78,27 @@ def user_regular_products(self, page=0, ppg=False, **kwargs): scope=5, url_args=kwargs, ) - pricelist = website.pricelist_id - # Try to fetch geoip based fpos or fallback on partner one - fiscal_position_sudo = website.fiscal_position_id.sudo() - products_prices = lazy( - lambda: products_on_page._get_sales_prices(pricelist, fiscal_position_sudo) + products_prices = lazy(lambda: products_on_page._get_sales_prices(website)) + # Map each product to its variant, like WebsiteSale.shop() does, since our + # own product set differs from the one shop() computed for itself. + variants = ( + request.env["product.product"] + .sudo() + .browse( + product._get_first_possible_variant_id() for product in products_on_page + ) ) + variants.fetch() + product_variants = dict(zip(products_on_page, variants, strict=False)) # Shop context for the view - shop_context = self.shop(page=page, ppg=ppg, **kwargs) + shop_context = self.shop(page=page, **kwargs) shop_context.qcontext.update( { "pager": pager, "products": products_on_page, "search_product": products_on_page, "search_count": total_products, + "product_variants": product_variants, "bins": lazy( lambda: TableCompute().process( products_on_page, ppg, website.shop_ppr or 4 diff --git a/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md index aaa6b9be25..0033bcca52 100644 --- a/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md +++ b/website_sale_menu_partner_top_selling/readme/CONTRIBUTORS.md @@ -1,2 +1,3 @@ - [Tecnativa](https://www.tecnativa.com) - Pilar Vargas + - Cristina Hidalgo diff --git a/website_sale_menu_partner_top_selling/static/description/index.html b/website_sale_menu_partner_top_selling/static/description/index.html index b27016665e..04e90f12ad 100644 --- a/website_sale_menu_partner_top_selling/static/description/index.html +++ b/website_sale_menu_partner_top_selling/static/description/index.html @@ -360,16 +360,21 @@ -
-

Website Sale Menu Partner Top Selling

+
+ + +Odoo Community Association + +
+

Website Sale Menu Partner Top Selling

-

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/e-commerce Translate me on Weblate Try me on Runboat

This module allows you to display the products purchased regularly by a user and his company in the online shop.

Table of contents

@@ -387,7 +392,7 @@

Website Sale Menu Partner Top Selling

-

Configuration

+

Configuration

The module allows you to configure the number of products to be displayed by means of a configuration parameter.

Limit settings:

@@ -397,7 +402,7 @@

Configuration

active in /shop.

-

Usage

+

Usage

Regular products can be viewed by accessing the URL /shop/my_regular_products on the website.

This URL can be accessed from /shop by clicking on My regular @@ -407,32 +412,33 @@

Usage

order.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Tecnativa
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -442,10 +448,11 @@

Maintainers

promote its widespread use.

Current maintainer:

pilarvargas-tecnativa

-

This module is part of the OCA/e-commerce project on GitHub.

+

This module is part of the OCA/e-commerce project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
diff --git a/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js b/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js index 32f9d68669..b100061a35 100644 --- a/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js +++ b/website_sale_menu_partner_top_selling/static/src/js/tours/website_sale_menu_top_user_selling_tour.esm.js @@ -1,20 +1,18 @@ -/** @odoo-module **/ - /* Copyright 2024 Pilar Vargas * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ import {registry} from "@web/core/registry"; registry.category("web_tour.tours").add("website_sale_menu_partner_top_selling", { - test: true, url: "/shop", steps: () => [ { - trigger: "#products_grid_before label:contains('My Regular Products')", + trigger: "#products_grid_before a:contains('My Regular Products')", + run: "click", + expectUnloadPage: true, }, { - trigger: "a:contains('Product 5')", - extra_trigger: - "#products_grid:has(a:contains('Product 3')):not(:has(a:contains('Product 1'))):not(:has(a:contains('Product 2'))):not(:has(a:contains('Product 4')))", + trigger: + "#products_grid:has(a:contains('Product 5')):has(a:contains('Product 3')):not(:has(a:contains('Product 1'))):not(:has(a:contains('Product 2'))):not(:has(a:contains('Product 4')))", }, ], }); diff --git a/website_sale_menu_partner_top_selling/tests/test_ui.py b/website_sale_menu_partner_top_selling/tests/test_ui.py index d52ccf5e65..719e3798a3 100644 --- a/website_sale_menu_partner_top_selling/tests/test_ui.py +++ b/website_sale_menu_partner_top_selling/tests/test_ui.py @@ -65,5 +65,4 @@ def test_ui(self): "/shop", "website_sale_menu_partner_top_selling", login="admin", - step_delay=100, ) diff --git a/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml b/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml index b43c24ec22..2d5730cee2 100644 --- a/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml +++ b/website_sale_menu_partner_top_selling/views/res_config_settings_views.xml @@ -6,10 +6,7 @@ res.config.settings - + - + 'true' if not category and not request.httprequest.path.startswith('/shop/my_regular_products') else None + name="t-attf-class" + >{{not category and not request.httprequest.path.startswith('/shop/my_regular_products') and 'text-decoration-underline'}} p-0 - + + + + +