From 0e9a604d57989604b5f0672e4d58759bfc7c2751 Mon Sep 17 00:00:00 2001
From: Sergio Teruel Albert
Date: Tue, 28 May 2019 18:38:57 +0200
Subject: [PATCH 01/25] [11.0][NEW] website_sale_product_minimal_price: New
module (#283)
* [11.0][NEW] website_sale_product_minimal_price: New module
* [11.0][IMP] website_sale_product_minimal_price: Order by minimal variant price (from pricelists or extra variant price)
[UPD] Update website_sale_product_minimal_price.pot
Update translation files
Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.
Translation: e-commerce-11.0/e-commerce-11.0-website_sale_product_minimal_price
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-11-0/e-commerce-11-0-website_sale_product_minimal_price/
[UPD] README.rst
---
website_sale_product_minimal_price/README.rst | 87 ++++
.../__init__.py | 2 +
.../__manifest__.py | 24 +
.../data/demo.xml | 49 ++
website_sale_product_minimal_price/i18n/es.po | 57 +++
.../website_sale_product_minimal_price.pot | 54 +++
.../models/__init__.py | 1 +
.../models/product_template.py | 29 ++
.../readme/CONTRIBUTORS.rst | 3 +
.../readme/DESCRIPTION.rst | 3 +
.../readme/USAGE.rst | 6 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 439 ++++++++++++++++++
...website_sale_product_minimal_price_tour.js | 31 ++
.../tests/__init__.py | 1 +
...test_website_sale_product_minimal_price.py | 18 +
.../views/assets.xml | 9 +
.../views/templates.xml | 33 ++
18 files changed, 846 insertions(+)
create mode 100644 website_sale_product_minimal_price/README.rst
create mode 100644 website_sale_product_minimal_price/__init__.py
create mode 100644 website_sale_product_minimal_price/__manifest__.py
create mode 100644 website_sale_product_minimal_price/data/demo.xml
create mode 100644 website_sale_product_minimal_price/i18n/es.po
create mode 100644 website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
create mode 100644 website_sale_product_minimal_price/models/__init__.py
create mode 100644 website_sale_product_minimal_price/models/product_template.py
create mode 100644 website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
create mode 100644 website_sale_product_minimal_price/readme/DESCRIPTION.rst
create mode 100644 website_sale_product_minimal_price/readme/USAGE.rst
create mode 100644 website_sale_product_minimal_price/static/description/icon.png
create mode 100644 website_sale_product_minimal_price/static/description/index.html
create mode 100644 website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
create mode 100644 website_sale_product_minimal_price/tests/__init__.py
create mode 100644 website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
create mode 100644 website_sale_product_minimal_price/views/assets.xml
create mode 100755 website_sale_product_minimal_price/views/templates.xml
diff --git a/website_sale_product_minimal_price/README.rst b/website_sale_product_minimal_price/README.rst
new file mode 100644
index 0000000000..a3785b9696
--- /dev/null
+++ b/website_sale_product_minimal_price/README.rst
@@ -0,0 +1,87 @@
+==================================
+Website Sale Product Minimal Price
+==================================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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/11.0/website_sale_product_minimal_price
+ :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-11-0/e-commerce-11-0-website_sale_product_minimal_price
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/113/11.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module extends the functionality of website sale module to allow to
+display the minimal price in '/shop' view when product has distinct variants
+price and set order by minimal price in product's view.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+#. Go to backend and set a product with variants and extra price by attribute
+ value or define a distinct prices in public price list for this variant.
+#. Go to Website Shop.
+#. You will see that in main products view appears the text "From " with
+ minimal price if the product has a distinct prices by attribute.
+#. Click on product, the price displayed is the minimal variant price.
+
+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 smashing 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 `_:
+
+ * Sergio Teruel
+
+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_product_minimal_price/__init__.py b/website_sale_product_minimal_price/__init__.py
new file mode 100644
index 0000000000..3275ac2adf
--- /dev/null
+++ b/website_sale_product_minimal_price/__init__.py
@@ -0,0 +1,2 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import models
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
new file mode 100644
index 0000000000..fbfba46aa5
--- /dev/null
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -0,0 +1,24 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ 'name': 'Website Sale Product Minimal Price',
+ 'summary': 'Display minimal price for products that has variants',
+ 'version': '11.0.1.0.0',
+ 'development_status': 'Beta',
+ '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/assets.xml',
+ 'views/templates.xml',
+ ],
+ 'demo': [
+ 'data/demo.xml',
+ ],
+}
diff --git a/website_sale_product_minimal_price/data/demo.xml b/website_sale_product_minimal_price/data/demo.xml
new file mode 100644
index 0000000000..a21fe954fd
--- /dev/null
+++ b/website_sale_product_minimal_price/data/demo.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+ Test attribute
+
+
+
+ Test v1
+
+
+
+ Test v2
+
+
+
+ My product test with various prices
+ 20.0
+ consu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5.0
+
+
+
+
+ 10.0
+
+
+
diff --git a/website_sale_product_minimal_price/i18n/es.po b/website_sale_product_minimal_price/i18n/es.po
new file mode 100644
index 0000000000..db2e5e2335
--- /dev/null
+++ b/website_sale_product_minimal_price/i18n/es.po
@@ -0,0 +1,57 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_product_minimal_price
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-05-07 14:11+0000\n"
+"PO-Revision-Date: 2019-05-07 16:13+0200\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 2.0.6\n"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
+msgid "From "
+msgstr "Desde "
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product_has_distinct_variant_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template_has_distinct_variant_price
+msgid "Has variants with distinct extra"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:product.product,name:website_sale_product_minimal_price.product_product_test_1
+#: model:product.product,name:website_sale_product_minimal_price.product_product_test_2
+#: model:product.template,name:website_sale_product_minimal_price.product_product_test_1_product_template
+#: model:product.template,name:website_sale_product_minimal_price.product_product_test_2_product_template
+msgid "My product test with various prices"
+msgstr "Mi producto de test con varios precios"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
+msgid "Product Template"
+msgstr "Plantilla de producto"
+
+#. module: website_sale_product_minimal_price
+#: model:product.attribute,name:website_sale_product_minimal_price.product_attribute_test
+msgid "Test attribute"
+msgstr "Atributo de prueba"
+
+#. module: website_sale_product_minimal_price
+#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_1
+msgid "Test v1"
+msgstr "Valor 1 de test"
+
+#. module: website_sale_product_minimal_price
+#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_2
+msgid "Test v2"
+msgstr "Valor 2 de test"
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
new file mode 100644
index 0000000000..be41c4a889
--- /dev/null
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -0,0 +1,54 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_product_minimal_price
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.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_product_minimal_price
+#: model:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
+msgid "From "
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product_has_distinct_variant_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template_has_distinct_variant_price
+msgid "Has variants with distinct extra"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:product.product,name:website_sale_product_minimal_price.product_product_test_1
+#: model:product.product,name:website_sale_product_minimal_price.product_product_test_2
+#: model:product.template,name:website_sale_product_minimal_price.product_product_test_1_product_template
+#: model:product.template,name:website_sale_product_minimal_price.product_product_test_2_product_template
+msgid "My product test with various prices"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:product.attribute,name:website_sale_product_minimal_price.product_attribute_test
+msgid "Test attribute"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_1
+msgid "Test v1"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_2
+msgid "Test v2"
+msgstr ""
+
diff --git a/website_sale_product_minimal_price/models/__init__.py b/website_sale_product_minimal_price/models/__init__.py
new file mode 100644
index 0000000000..e8fa8f6bf1
--- /dev/null
+++ b/website_sale_product_minimal_price/models/__init__.py
@@ -0,0 +1 @@
+from . import product_template
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
new file mode 100644
index 0000000000..5e19bf9d20
--- /dev/null
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -0,0 +1,29 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import fields, models
+
+
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
+ has_distinct_variant_price = fields.Boolean(
+ compute='_compute_has_distinct_variant_price',
+ string='Has variants with distinct extra',
+ )
+
+ def _compute_has_distinct_variant_price(self):
+ for template in self:
+ if template.product_variant_count > 1:
+ prices = template.product_variant_ids.mapped('website_price')
+ if len(prices) > 1:
+ template.has_distinct_variant_price = True
+
+ def _website_price(self):
+ templates = self.filtered(lambda x: x.product_variant_count > 1)
+ super(ProductTemplate, self - templates)._website_price()
+ for product in templates:
+ variant = product.product_variant_ids.sorted(
+ key=lambda p: p.website_price)[:1]
+ product.website_price = variant.website_price
+ product.website_public_price = variant.website_public_price
+ product.website_price_difference = variant.website_price_difference
diff --git a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..3bfad993cb
--- /dev/null
+++ b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
@@ -0,0 +1,3 @@
+* `Tecnativa `_:
+
+ * Sergio Teruel
diff --git a/website_sale_product_minimal_price/readme/DESCRIPTION.rst b/website_sale_product_minimal_price/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..09c47abbba
--- /dev/null
+++ b/website_sale_product_minimal_price/readme/DESCRIPTION.rst
@@ -0,0 +1,3 @@
+This module extends the functionality of website sale module to allow to
+display the minimal price in '/shop' view when product has distinct variants
+price and set order by minimal price in product's view.
diff --git a/website_sale_product_minimal_price/readme/USAGE.rst b/website_sale_product_minimal_price/readme/USAGE.rst
new file mode 100644
index 0000000000..5e5e861d43
--- /dev/null
+++ b/website_sale_product_minimal_price/readme/USAGE.rst
@@ -0,0 +1,6 @@
+#. Go to backend and set a product with variants and extra price by attribute
+ value or define a distinct prices in public price list for this variant.
+#. Go to Website Shop.
+#. You will see that in main products view appears the text "From " with
+ minimal price if the product has a distinct prices by attribute.
+#. Click on product, the price displayed is the minimal variant price.
diff --git a/website_sale_product_minimal_price/static/description/icon.png b/website_sale_product_minimal_price/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_product_minimal_price/static/description/index.html b/website_sale_product_minimal_price/static/description/index.html
new file mode 100644
index 0000000000..7a7887680c
--- /dev/null
+++ b/website_sale_product_minimal_price/static/description/index.html
@@ -0,0 +1,439 @@
+
+
+
+
+
+
+Website Sale Product Minimal Price
+
+
+
+
+
Website Sale Product Minimal Price
+
+
+

+
This module extends the functionality of website sale module to allow to
+display the minimal price in ‘/shop’ view when product has distinct variants
+price and set order by minimal price in product’s view.
+
Table of contents
+
+
+
+
+- Go to backend and set a product with variants and extra price by attribute
+value or define a distinct prices in public price list for this variant.
+- Go to Website Shop.
+- You will see that in main products view appears the text “From ” with
+minimal price if the product has a distinct prices by attribute.
+- Click on product, the price displayed is the minimal variant price.
+
+
+
+
+
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 smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+

+
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_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
new file mode 100644
index 0000000000..72a56fe11d
--- /dev/null
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
@@ -0,0 +1,31 @@
+/* Copyright 2019 Sergio Teruel
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+odoo.define("website_sale_product_minimal_price.tour", function (require) {
+ "use strict";
+
+ var tour = require("web_tour.tour");
+ var base = require("web_editor.base");
+
+ var steps = [
+ {
+ trigger: "a:contains('My product test')",
+ extra_trigger: ".product_price:has(span:contains('From '))",
+ },
+ {
+ trigger: "a[href='/shop']",
+ extra_trigger: ".js_attribute_value:eq(0):has(span:contains('Test v1'))",
+ },
+ ];
+ tour.register("website_sale_product_minimal_price",
+ {
+ url: "/shop",
+ test: true,
+ wait_for: base.ready(),
+ },
+ steps
+ );
+ return {
+ steps: steps,
+ };
+});
diff --git a/website_sale_product_minimal_price/tests/__init__.py b/website_sale_product_minimal_price/tests/__init__.py
new file mode 100644
index 0000000000..3feff797da
--- /dev/null
+++ b/website_sale_product_minimal_price/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_website_sale_product_minimal_price
diff --git a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
new file mode 100644
index 0000000000..bcaf4d6b07
--- /dev/null
+++ b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
@@ -0,0 +1,18 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo.tests.common import HttpCase
+
+
+class WebsiteSaleProductMinimalPriceHttpCase(HttpCase):
+
+ def test_ui_website(self):
+ """Test frontend tour."""
+ tour = (
+ "odoo.__DEBUG__.services['web_tour.tour']",
+ "website_sale_product_minimal_price",
+ )
+ self.phantom_js(
+ url_path="/",
+ code="%s.run('%s')" % tour,
+ ready="%s.tours['%s'].ready" % tour,
+ )
diff --git a/website_sale_product_minimal_price/views/assets.xml b/website_sale_product_minimal_price/views/assets.xml
new file mode 100644
index 0000000000..e3da2ba84f
--- /dev/null
+++ b/website_sale_product_minimal_price/views/assets.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/website_sale_product_minimal_price/views/templates.xml b/website_sale_product_minimal_price/views/templates.xml
new file mode 100755
index 0000000000..be6aabbe0d
--- /dev/null
+++ b/website_sale_product_minimal_price/views/templates.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+ sorted_values
+
+
+ sorted_values
+
+
+ sorted_values
+
+
+
+
+
+
+
+ From
+
+
+
+
+
From d12a44ddcb4db66d857fb074c9161ab0629d018c Mon Sep 17 00:00:00 2001
From: Sergio Teruel
Date: Thu, 12 Dec 2019 00:25:49 +0100
Subject: [PATCH 02/25] [MIG] website_sale_product_minimal_price: Migration to
v12.0
---
website_sale_product_minimal_price/README.rst | 22 ++++---
.../__manifest__.py | 8 +--
.../data/demo.xml | 49 ---------------
website_sale_product_minimal_price/i18n/es.po | 43 +++++--------
.../website_sale_product_minimal_price.pot | 35 +++--------
.../models/product_template.py | 61 ++++++++++++++++---
.../static/description/index.html | 8 ++-
...website_sale_product_minimal_price_tour.js | 9 ++-
...test_website_sale_product_minimal_price.py | 60 +++++++++++++++++-
.../views/templates.xml | 16 +++--
10 files changed, 171 insertions(+), 140 deletions(-)
delete mode 100644 website_sale_product_minimal_price/data/demo.xml
diff --git a/website_sale_product_minimal_price/README.rst b/website_sale_product_minimal_price/README.rst
index a3785b9696..bc11d1335f 100644
--- a/website_sale_product_minimal_price/README.rst
+++ b/website_sale_product_minimal_price/README.rst
@@ -7,20 +7,20 @@ Website Sale Product Minimal Price
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
- :alt: Beta
+ :alt: Production/Stable
.. |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/11.0/website_sale_product_minimal_price
+ :target: https://github.com/OCA/e-commerce/tree/12.0/website_sale_product_minimal_price
: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-11-0/e-commerce-11-0-website_sale_product_minimal_price
+ :target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_product_minimal_price
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/113/11.0
+ :target: https://runbot.odoo-community.org/runbot/113/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,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 smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -82,6 +82,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.
-This module is part of the `OCA/e-commerce `_ project on GitHub.
+.. |maintainer-sergio-teruel| image:: https://github.com/sergio-teruel.png?size=40px
+ :target: https://github.com/sergio-teruel
+ :alt: sergio-teruel
+
+Current `maintainer `__:
+
+|maintainer-sergio-teruel|
+
+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_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index fbfba46aa5..516561f762 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,8 +3,9 @@
{
'name': 'Website Sale Product Minimal Price',
'summary': 'Display minimal price for products that has variants',
- 'version': '11.0.1.0.0',
- 'development_status': 'Beta',
+ 'version': '12.0.1.0.0',
+ 'development_status': 'Production/Stable',
+ 'maintainers': ['sergio-teruel'],
'category': 'Website',
'website': 'https://github.com/OCA/e-commerce',
'author': 'Tecnativa, Odoo Community Association (OCA)',
@@ -18,7 +19,4 @@
'views/assets.xml',
'views/templates.xml',
],
- 'demo': [
- 'data/demo.xml',
- ],
}
diff --git a/website_sale_product_minimal_price/data/demo.xml b/website_sale_product_minimal_price/data/demo.xml
deleted file mode 100644
index a21fe954fd..0000000000
--- a/website_sale_product_minimal_price/data/demo.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
-
-
- Test attribute
-
-
-
- Test v1
-
-
-
- Test v2
-
-
-
- My product test with various prices
- 20.0
- consu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 5.0
-
-
-
-
- 10.0
-
-
-
diff --git a/website_sale_product_minimal_price/i18n/es.po b/website_sale_product_minimal_price/i18n/es.po
index db2e5e2335..989d4e6118 100644
--- a/website_sale_product_minimal_price/i18n/es.po
+++ b/website_sale_product_minimal_price/i18n/es.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-05-07 14:11+0000\n"
-"PO-Revision-Date: 2019-05-07 16:13+0200\n"
+"POT-Creation-Date: 2019-12-11 23:22+0000\n"
+"PO-Revision-Date: 2019-12-12 00:24+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
@@ -18,40 +18,29 @@ msgstr ""
"X-Generator: Poedit 2.0.6\n"
#. module: website_sale_product_minimal_price
-#: model:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
+#: model_terms:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
msgid "From "
msgstr "Desde "
#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product_has_distinct_variant_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template_has_distinct_variant_price
-msgid "Has variants with distinct extra"
-msgstr ""
-
-#. module: website_sale_product_minimal_price
-#: model:product.product,name:website_sale_product_minimal_price.product_product_test_1
-#: model:product.product,name:website_sale_product_minimal_price.product_product_test_2
-#: model:product.template,name:website_sale_product_minimal_price.product_product_test_1_product_template
-#: model:product.template,name:website_sale_product_minimal_price.product_product_test_2_product_template
-msgid "My product test with various prices"
-msgstr "Mi producto de test con varios precios"
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product__has_distinct_variant_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__has_distinct_variant_price
+msgid "Has variants with distinct price extra"
+msgstr "Tiene variantes con diferentes precios extra"
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
msgstr "Plantilla de producto"
-#. module: website_sale_product_minimal_price
-#: model:product.attribute,name:website_sale_product_minimal_price.product_attribute_test
-msgid "Test attribute"
-msgstr "Atributo de prueba"
+#~ msgid "My product test with various prices"
+#~ msgstr "Mi producto de test con varios precios"
-#. module: website_sale_product_minimal_price
-#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_1
-msgid "Test v1"
-msgstr "Valor 1 de test"
+#~ msgid "Test attribute"
+#~ msgstr "Atributo de prueba"
-#. module: website_sale_product_minimal_price
-#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_2
-msgid "Test v2"
-msgstr "Valor 2 de test"
+#~ msgid "Test v1"
+#~ msgstr "Valor 1 de test"
+
+#~ msgid "Test v2"
+#~ msgstr "Valor 2 de test"
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index be41c4a889..2bb3e5cb10 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -4,8 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 11.0\n"
+"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-12-11 23:22+0000\n"
+"PO-Revision-Date: 2019-12-11 23:22+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -14,22 +16,14 @@ msgstr ""
"Plural-Forms: \n"
#. module: website_sale_product_minimal_price
-#: model:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
+#: model_terms:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
msgid "From "
msgstr ""
#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product_has_distinct_variant_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template_has_distinct_variant_price
-msgid "Has variants with distinct extra"
-msgstr ""
-
-#. module: website_sale_product_minimal_price
-#: model:product.product,name:website_sale_product_minimal_price.product_product_test_1
-#: model:product.product,name:website_sale_product_minimal_price.product_product_test_2
-#: model:product.template,name:website_sale_product_minimal_price.product_product_test_1_product_template
-#: model:product.template,name:website_sale_product_minimal_price.product_product_test_2_product_template
-msgid "My product test with various prices"
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product__has_distinct_variant_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__has_distinct_variant_price
+msgid "Has variants with distinct price extra"
msgstr ""
#. module: website_sale_product_minimal_price
@@ -37,18 +31,3 @@ msgstr ""
msgid "Product Template"
msgstr ""
-#. module: website_sale_product_minimal_price
-#: model:product.attribute,name:website_sale_product_minimal_price.product_attribute_test
-msgid "Test attribute"
-msgstr ""
-
-#. module: website_sale_product_minimal_price
-#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_1
-msgid "Test v1"
-msgstr ""
-
-#. module: website_sale_product_minimal_price
-#: model:product.attribute.value,name:website_sale_product_minimal_price.product_attribute_value_test_2
-msgid "Test v2"
-msgstr ""
-
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index 5e19bf9d20..6fcf9eaa55 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -8,7 +8,7 @@ class ProductTemplate(models.Model):
has_distinct_variant_price = fields.Boolean(
compute='_compute_has_distinct_variant_price',
- string='Has variants with distinct extra',
+ string='Has variants with distinct price extra',
)
def _compute_has_distinct_variant_price(self):
@@ -18,12 +18,53 @@ def _compute_has_distinct_variant_price(self):
if len(prices) > 1:
template.has_distinct_variant_price = True
- def _website_price(self):
- templates = self.filtered(lambda x: x.product_variant_count > 1)
- super(ProductTemplate, self - templates)._website_price()
- for product in templates:
- variant = product.product_variant_ids.sorted(
- key=lambda p: p.website_price)[:1]
- product.website_price = variant.website_price
- product.website_public_price = variant.website_public_price
- product.website_price_difference = variant.website_price_difference
+ def _get_combination_info(
+ self, combination=False, product_id=False, add_qty=1, pricelist=False,
+ parent_combination=False, only_template=False):
+ """
+ Update product template prices for products items view in website shop
+ render with cheaper variant prices.
+ """
+ combination_info = super()._get_combination_info(
+ combination=combination, product_id=product_id, add_qty=add_qty,
+ pricelist=pricelist, parent_combination=parent_combination,
+ only_template=only_template)
+
+ if (only_template and self.env.context.get('website_id') and
+ self.product_variant_count > 1):
+ cheaper_variant = self.product_variant_ids.sorted(
+ key=lambda p: p.price_extra)[:1]
+
+ res = cheaper_variant._get_combination_info_variant()
+
+ combination_info.update({
+ 'price': res.get('price'),
+ 'list_price': res.get('list_price'),
+ 'has_discounted_price': res.get('has_discounted_price'),
+ })
+ return combination_info
+
+ def _get_first_possible_combination(
+ self, parent_combination=None, necessary_values=None):
+ """
+ Get the cheaper product combination for the product for website view.
+ We only take into account attributes that generate variants and
+ products with more than one variant.
+ """
+ combination = super()._get_first_possible_combination(
+ parent_combination=parent_combination,
+ necessary_values=necessary_values
+ )
+ if (self.env.context.get('website_id') and
+ self.product_variant_count > 1):
+ ptav_obj = self.env['product.template.attribute.value']
+ pav = self.product_variant_ids.sorted(
+ 'lst_price')[:1].attribute_value_ids
+ cheaper_combination = ptav_obj.search([
+ ('product_tmpl_id', '=', self.id),
+ ('product_attribute_value_id', 'in', pav.ids),
+ ])
+ variant_combination = combination.filtered(
+ lambda x: x.attribute_id.create_variant == 'always')
+ return cheaper_combination + (combination - variant_combination)
+ return combination
diff --git a/website_sale_product_minimal_price/static/description/index.html b/website_sale_product_minimal_price/static/description/index.html
index 7a7887680c..9f1c74c784 100644
--- a/website_sale_product_minimal_price/static/description/index.html
+++ b/website_sale_product_minimal_price/static/description/index.html
@@ -367,7 +367,7 @@ Website Sale Product Minimal Price
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of website sale module to allow to
display the minimal price in ‘/shop’ view when product has distinct variants
price and set order by minimal price in product’s view.
@@ -400,7 +400,7 @@
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 smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -430,7 +430,9 @@
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.
+
Current maintainer:
+

+
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_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
index 72a56fe11d..854f64cc81 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
@@ -14,7 +14,14 @@ odoo.define("website_sale_product_minimal_price.tour", function (require) {
},
{
trigger: "a[href='/shop']",
- extra_trigger: ".js_attribute_value:eq(0):has(span:contains('Test v1'))",
+ extra_trigger: ".js_attribute_value:eq(0):has(span:contains('Test v2'))",
+ },
+ {
+ trigger: "a:contains('My product test')",
+ },
+ {
+ trigger: "a[href='/shop']",
+ extra_trigger: ".product_price:has(span:contains('125.00'))",
},
];
tour.register("website_sale_product_minimal_price",
diff --git a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
index bcaf4d6b07..21f312a280 100644
--- a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
+++ b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
@@ -5,13 +5,71 @@
class WebsiteSaleProductMinimalPriceHttpCase(HttpCase):
+ def setUp(self):
+ super().setUp()
+
+ # Models
+ AttributeCategory = self.env['product.attribute.category']
+ ProductAttribute = self.env['product.attribute']
+ ProductAttributeValue = self.env['product.attribute.value']
+ ProductTmplAttributeValue = self.env[
+ 'product.template.attribute.value']
+
+ self.attribute_category = AttributeCategory.create({
+ 'name': 'Test category',
+ })
+ self.product_attribute = ProductAttribute.create({
+ 'name': 'Test',
+ 'website_published': True,
+ 'create_variant': 'always',
+ 'category_id': self.attribute_category.id,
+ })
+ self.product_attribute_value_test_1 = ProductAttributeValue.create({
+ 'name': 'Test v1',
+ 'attribute_id': self.product_attribute.id,
+ })
+ self.product_attribute_value_test_2 = ProductAttributeValue.create({
+ 'name': 'Test v2',
+ 'attribute_id': self.product_attribute.id,
+ })
+ self.product_template = self.env['product.template'].create({
+ 'name': 'My product test with various prices',
+ 'website_published': True,
+ 'type': 'consu',
+ 'list_price': 100.0,
+ 'website_sequence': 5000,
+ 'attribute_line_ids': [
+ (0, 0, {
+ 'attribute_id': self.product_attribute.id,
+ 'value_ids': [
+ (4, self.product_attribute_value_test_1.id),
+ (4, self.product_attribute_value_test_2.id),
+ ],
+ }),
+ ],
+ })
+ product_tmpl_att_value = ProductTmplAttributeValue.search([
+ ('product_tmpl_id', '=', self.product_template.id),
+ ('attribute_id', '=', self.product_attribute.id),
+ ('product_attribute_value_id', '=',
+ self.product_attribute_value_test_1.id),
+ ])
+ product_tmpl_att_value.price_extra = 50.0
+ product_tmpl_att_value = ProductTmplAttributeValue.search([
+ ('product_tmpl_id', '=', self.product_template.id),
+ ('attribute_id', '=', self.product_attribute.id),
+ ('product_attribute_value_id', '=',
+ self.product_attribute_value_test_2.id),
+ ])
+ product_tmpl_att_value.price_extra = 25.0
+
def test_ui_website(self):
"""Test frontend tour."""
tour = (
"odoo.__DEBUG__.services['web_tour.tour']",
"website_sale_product_minimal_price",
)
- self.phantom_js(
+ self.browser_js(
url_path="/",
code="%s.run('%s')" % tour,
ready="%s.tours['%s'].ready" % tour,
diff --git a/website_sale_product_minimal_price/views/templates.xml b/website_sale_product_minimal_price/views/templates.xml
index be6aabbe0d..8c31b46952 100755
--- a/website_sale_product_minimal_price/views/templates.xml
+++ b/website_sale_product_minimal_price/views/templates.xml
@@ -3,27 +3,25 @@
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
-
+
-
-
+
+
-
-
+
sorted_values
-
+
sorted_values
-
+
sorted_values
-
+
From
From d60b58f9e71816f228292b8b9a28457c9bce02d3 Mon Sep 17 00:00:00 2001
From: Sergio Teruel
Date: Mon, 13 Jan 2020 23:21:41 +0100
Subject: [PATCH 03/25] [FIX] website_sale_product_minimal_price: combination
does not exist message error
---
website_sale_product_minimal_price/__manifest__.py | 2 +-
.../i18n/website_sale_product_minimal_price.pot | 2 --
.../models/product_template.py | 10 +++++++---
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index 516561f762..c271e03d0b 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
'name': 'Website Sale Product Minimal Price',
'summary': 'Display minimal price for products that has variants',
- 'version': '12.0.1.0.0',
+ 'version': '12.0.1.1.0',
'development_status': 'Production/Stable',
'maintainers': ['sergio-teruel'],
'category': 'Website',
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index 2bb3e5cb10..83e719409e 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -6,8 +6,6 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-12-11 23:22+0000\n"
-"PO-Revision-Date: 2019-12-11 23:22+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index 6fcf9eaa55..953fffc3ff 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -33,7 +33,7 @@ def _get_combination_info(
if (only_template and self.env.context.get('website_id') and
self.product_variant_count > 1):
cheaper_variant = self.product_variant_ids.sorted(
- key=lambda p: p.price_extra)[:1]
+ key=lambda p: p.website_price)[:1]
res = cheaper_variant._get_combination_info_variant()
@@ -59,12 +59,16 @@ def _get_first_possible_combination(
self.product_variant_count > 1):
ptav_obj = self.env['product.template.attribute.value']
pav = self.product_variant_ids.sorted(
- 'lst_price')[:1].attribute_value_ids
+ 'website_price')[:1].attribute_value_ids
cheaper_combination = ptav_obj.search([
('product_tmpl_id', '=', self.id),
('product_attribute_value_id', 'in', pav.ids),
])
variant_combination = combination.filtered(
lambda x: x.attribute_id.create_variant == 'always')
- return cheaper_combination + (combination - variant_combination)
+ combination_returned = cheaper_combination + (
+ combination - variant_combination)
+ # Keep order to avoid This combination does not exist message
+ return combination_returned.sorted(
+ lambda x: x.attribute_id.sequence)
return combination
From 7d6040471f28f7d71f7bdf8461e86941363d03f7 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Thu, 4 Jun 2020 10:01:58 +0200
Subject: [PATCH 04/25] [IMP] website_sale_product_minimal_price: black, isort,
prettier
---
.../__manifest__.py | 31 ++---
.../models/product_template.py | 85 ++++++++-----
...website_sale_product_minimal_price_tour.js | 5 +-
...test_website_sale_product_minimal_price.py | 114 ++++++++++--------
.../views/assets.xml | 8 +-
.../views/templates.xml | 35 ++++--
6 files changed, 161 insertions(+), 117 deletions(-)
mode change 100755 => 100644 website_sale_product_minimal_price/views/templates.xml
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index c271e03d0b..7a6d897342 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -1,22 +1,17 @@
# Copyright 2019 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
- 'name': 'Website Sale Product Minimal Price',
- 'summary': 'Display minimal price for products that has variants',
- 'version': '12.0.1.1.0',
- 'development_status': 'Production/Stable',
- 'maintainers': ['sergio-teruel'],
- '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/assets.xml',
- 'views/templates.xml',
- ],
+ "name": "Website Sale Product Minimal Price",
+ "summary": "Display minimal price for products that has variants",
+ "version": "12.0.1.1.0",
+ "development_status": "Production/Stable",
+ "maintainers": ["sergio-teruel"],
+ "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/assets.xml", "views/templates.xml"],
}
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index 953fffc3ff..bf4b72e18c 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -4,71 +4,90 @@
class ProductTemplate(models.Model):
- _inherit = 'product.template'
+ _inherit = "product.template"
has_distinct_variant_price = fields.Boolean(
- compute='_compute_has_distinct_variant_price',
- string='Has variants with distinct price extra',
+ compute="_compute_has_distinct_variant_price",
+ string="Has variants with distinct price extra",
)
def _compute_has_distinct_variant_price(self):
for template in self:
if template.product_variant_count > 1:
- prices = template.product_variant_ids.mapped('website_price')
+ prices = template.product_variant_ids.mapped("website_price")
if len(prices) > 1:
template.has_distinct_variant_price = True
def _get_combination_info(
- self, combination=False, product_id=False, add_qty=1, pricelist=False,
- parent_combination=False, only_template=False):
+ self,
+ combination=False,
+ product_id=False,
+ add_qty=1,
+ pricelist=False,
+ parent_combination=False,
+ only_template=False,
+ ):
"""
Update product template prices for products items view in website shop
render with cheaper variant prices.
"""
combination_info = super()._get_combination_info(
- combination=combination, product_id=product_id, add_qty=add_qty,
- pricelist=pricelist, parent_combination=parent_combination,
- only_template=only_template)
+ combination=combination,
+ product_id=product_id,
+ add_qty=add_qty,
+ pricelist=pricelist,
+ parent_combination=parent_combination,
+ only_template=only_template,
+ )
- if (only_template and self.env.context.get('website_id') and
- self.product_variant_count > 1):
+ if (
+ only_template
+ and self.env.context.get("website_id")
+ and self.product_variant_count > 1
+ ):
cheaper_variant = self.product_variant_ids.sorted(
- key=lambda p: p.website_price)[:1]
+ key=lambda p: p.website_price
+ )[:1]
res = cheaper_variant._get_combination_info_variant()
- combination_info.update({
- 'price': res.get('price'),
- 'list_price': res.get('list_price'),
- 'has_discounted_price': res.get('has_discounted_price'),
- })
+ combination_info.update(
+ {
+ "price": res.get("price"),
+ "list_price": res.get("list_price"),
+ "has_discounted_price": res.get("has_discounted_price"),
+ }
+ )
return combination_info
def _get_first_possible_combination(
- self, parent_combination=None, necessary_values=None):
+ self, parent_combination=None, necessary_values=None
+ ):
"""
Get the cheaper product combination for the product for website view.
We only take into account attributes that generate variants and
products with more than one variant.
"""
combination = super()._get_first_possible_combination(
- parent_combination=parent_combination,
- necessary_values=necessary_values
+ parent_combination=parent_combination, necessary_values=necessary_values
)
- if (self.env.context.get('website_id') and
- self.product_variant_count > 1):
- ptav_obj = self.env['product.template.attribute.value']
- pav = self.product_variant_ids.sorted(
- 'website_price')[:1].attribute_value_ids
- cheaper_combination = ptav_obj.search([
- ('product_tmpl_id', '=', self.id),
- ('product_attribute_value_id', 'in', pav.ids),
- ])
+ if self.env.context.get("website_id") and self.product_variant_count > 1:
+ ptav_obj = self.env["product.template.attribute.value"]
+ pav = self.product_variant_ids.sorted("website_price")[
+ :1
+ ].attribute_value_ids
+ cheaper_combination = ptav_obj.search(
+ [
+ ("product_tmpl_id", "=", self.id),
+ ("product_attribute_value_id", "in", pav.ids),
+ ]
+ )
variant_combination = combination.filtered(
- lambda x: x.attribute_id.create_variant == 'always')
+ lambda x: x.attribute_id.create_variant == "always"
+ )
combination_returned = cheaper_combination + (
- combination - variant_combination)
+ combination - variant_combination
+ )
# Keep order to avoid This combination does not exist message
- return combination_returned.sorted(
- lambda x: x.attribute_id.sequence)
+ return combination_returned.sorted(lambda x: x.attribute_id.sequence)
return combination
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
index 854f64cc81..305665070e 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
@@ -1,7 +1,7 @@
/* Copyright 2019 Sergio Teruel
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define("website_sale_product_minimal_price.tour", function (require) {
+odoo.define("website_sale_product_minimal_price.tour", function(require) {
"use strict";
var tour = require("web_tour.tour");
@@ -24,7 +24,8 @@ odoo.define("website_sale_product_minimal_price.tour", function (require) {
extra_trigger: ".product_price:has(span:contains('125.00'))",
},
];
- tour.register("website_sale_product_minimal_price",
+ tour.register(
+ "website_sale_product_minimal_price",
{
url: "/shop",
test: true,
diff --git a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
index 21f312a280..7855bd989d 100644
--- a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
+++ b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
@@ -4,63 +4,75 @@
class WebsiteSaleProductMinimalPriceHttpCase(HttpCase):
-
def setUp(self):
super().setUp()
# Models
- AttributeCategory = self.env['product.attribute.category']
- ProductAttribute = self.env['product.attribute']
- ProductAttributeValue = self.env['product.attribute.value']
- ProductTmplAttributeValue = self.env[
- 'product.template.attribute.value']
+ AttributeCategory = self.env["product.attribute.category"]
+ ProductAttribute = self.env["product.attribute"]
+ ProductAttributeValue = self.env["product.attribute.value"]
+ ProductTmplAttributeValue = self.env["product.template.attribute.value"]
- self.attribute_category = AttributeCategory.create({
- 'name': 'Test category',
- })
- self.product_attribute = ProductAttribute.create({
- 'name': 'Test',
- 'website_published': True,
- 'create_variant': 'always',
- 'category_id': self.attribute_category.id,
- })
- self.product_attribute_value_test_1 = ProductAttributeValue.create({
- 'name': 'Test v1',
- 'attribute_id': self.product_attribute.id,
- })
- self.product_attribute_value_test_2 = ProductAttributeValue.create({
- 'name': 'Test v2',
- 'attribute_id': self.product_attribute.id,
- })
- self.product_template = self.env['product.template'].create({
- 'name': 'My product test with various prices',
- 'website_published': True,
- 'type': 'consu',
- 'list_price': 100.0,
- 'website_sequence': 5000,
- 'attribute_line_ids': [
- (0, 0, {
- 'attribute_id': self.product_attribute.id,
- 'value_ids': [
- (4, self.product_attribute_value_test_1.id),
- (4, self.product_attribute_value_test_2.id),
- ],
- }),
- ],
- })
- product_tmpl_att_value = ProductTmplAttributeValue.search([
- ('product_tmpl_id', '=', self.product_template.id),
- ('attribute_id', '=', self.product_attribute.id),
- ('product_attribute_value_id', '=',
- self.product_attribute_value_test_1.id),
- ])
+ self.attribute_category = AttributeCategory.create({"name": "Test category"})
+ self.product_attribute = ProductAttribute.create(
+ {
+ "name": "Test",
+ "website_published": True,
+ "create_variant": "always",
+ "category_id": self.attribute_category.id,
+ }
+ )
+ self.product_attribute_value_test_1 = ProductAttributeValue.create(
+ {"name": "Test v1", "attribute_id": self.product_attribute.id}
+ )
+ self.product_attribute_value_test_2 = ProductAttributeValue.create(
+ {"name": "Test v2", "attribute_id": self.product_attribute.id}
+ )
+ self.product_template = self.env["product.template"].create(
+ {
+ "name": "My product test with various prices",
+ "website_published": True,
+ "type": "consu",
+ "list_price": 100.0,
+ "website_sequence": 5000,
+ "attribute_line_ids": [
+ (
+ 0,
+ 0,
+ {
+ "attribute_id": self.product_attribute.id,
+ "value_ids": [
+ (4, self.product_attribute_value_test_1.id),
+ (4, self.product_attribute_value_test_2.id),
+ ],
+ },
+ ),
+ ],
+ }
+ )
+ product_tmpl_att_value = ProductTmplAttributeValue.search(
+ [
+ ("product_tmpl_id", "=", self.product_template.id),
+ ("attribute_id", "=", self.product_attribute.id),
+ (
+ "product_attribute_value_id",
+ "=",
+ self.product_attribute_value_test_1.id,
+ ),
+ ]
+ )
product_tmpl_att_value.price_extra = 50.0
- product_tmpl_att_value = ProductTmplAttributeValue.search([
- ('product_tmpl_id', '=', self.product_template.id),
- ('attribute_id', '=', self.product_attribute.id),
- ('product_attribute_value_id', '=',
- self.product_attribute_value_test_2.id),
- ])
+ product_tmpl_att_value = ProductTmplAttributeValue.search(
+ [
+ ("product_tmpl_id", "=", self.product_template.id),
+ ("attribute_id", "=", self.product_attribute.id),
+ (
+ "product_attribute_value_id",
+ "=",
+ self.product_attribute_value_test_2.id,
+ ),
+ ]
+ )
product_tmpl_att_value.price_extra = 25.0
def test_ui_website(self):
diff --git a/website_sale_product_minimal_price/views/assets.xml b/website_sale_product_minimal_price/views/assets.xml
index e3da2ba84f..a872cd564e 100644
--- a/website_sale_product_minimal_price/views/assets.xml
+++ b/website_sale_product_minimal_price/views/assets.xml
@@ -1,9 +1,11 @@
-
+
-
+
diff --git a/website_sale_product_minimal_price/views/templates.xml b/website_sale_product_minimal_price/views/templates.xml
old mode 100755
new mode 100644
index 8c31b46952..2df6ad6b56
--- a/website_sale_product_minimal_price/views/templates.xml
+++ b/website_sale_product_minimal_price/views/templates.xml
@@ -1,31 +1,46 @@
-
+
-
-
-
+
+
-
+
sorted_values
-
+
sorted_values
-
+
sorted_values
-
-
+
From
-
From 9536cf1cc41a8da388963b177b56cad5699f2a4f Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Fri, 5 Jun 2020 13:33:22 +0200
Subject: [PATCH 05/25] [MIG] website_sale_product_minimal_price: Migration to
v13
---
website_sale_product_minimal_price/README.rst | 13 ++--
.../__init__.py | 2 +
.../__manifest__.py | 3 +-
.../controllers/__init__.py | 1 +
.../controllers/main.py | 48 +++++++++++++
.../demo/assets.xml | 11 +++
website_sale_product_minimal_price/i18n/es.po | 36 +++-------
.../website_sale_product_minimal_price.pot | 19 ++----
.../models/product_template.py | 68 +++----------------
.../readme/CONTRIBUTORS.rst | 3 +-
.../static/description/index.html | 9 +--
..._product_minimal_price_tour.js => tour.js} | 9 +--
.../js/website_sale_product_minimal_price.js | 64 +++++++++++++++++
.../website_sale_product_minimal_price.xml | 9 +++
...test_website_sale_product_minimal_price.py | 17 ++---
.../views/assets.xml | 6 +-
.../views/templates.xml | 24 ++-----
17 files changed, 198 insertions(+), 144 deletions(-)
create mode 100644 website_sale_product_minimal_price/controllers/__init__.py
create mode 100644 website_sale_product_minimal_price/controllers/main.py
create mode 100644 website_sale_product_minimal_price/demo/assets.xml
rename website_sale_product_minimal_price/static/src/js/{website_sale_product_minimal_price_tour.js => tour.js} (72%)
create mode 100644 website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
create mode 100644 website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml
diff --git a/website_sale_product_minimal_price/README.rst b/website_sale_product_minimal_price/README.rst
index bc11d1335f..6086355998 100644
--- a/website_sale_product_minimal_price/README.rst
+++ b/website_sale_product_minimal_price/README.rst
@@ -14,13 +14,13 @@ Website Sale Product Minimal Price
: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/12.0/website_sale_product_minimal_price
+ :target: https://github.com/OCA/e-commerce/tree/13.0/website_sale_product_minimal_price
: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-12-0/e-commerce-12-0-website_sale_product_minimal_price
+ :target: https://translation.odoo-community.org/projects/e-commerce-13-0/e-commerce-13-0-website_sale_product_minimal_price
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/113/12.0
+ :target: https://runbot.odoo-community.org/runbot/113/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,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 smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -67,7 +67,8 @@ Contributors
* `Tecnativa `_:
- * Sergio Teruel
+ * Sergio Teruel
+ * Carlos Roca
Maintainers
~~~~~~~~~~~
@@ -90,6 +91,6 @@ Current `maintainer `__:
|maintainer-sergio-teruel|
-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_product_minimal_price/__init__.py b/website_sale_product_minimal_price/__init__.py
index 3275ac2adf..5c2bd8c997 100644
--- a/website_sale_product_minimal_price/__init__.py
+++ b/website_sale_product_minimal_price/__init__.py
@@ -1,2 +1,4 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import controllers
from . import models
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index 7a6d897342..07ac27b87c 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Product Minimal Price",
"summary": "Display minimal price for products that has variants",
- "version": "12.0.1.1.0",
+ "version": "13.0.1.0.0",
"development_status": "Production/Stable",
"maintainers": ["sergio-teruel"],
"category": "Website",
@@ -14,4 +14,5 @@
"installable": True,
"depends": ["website_sale"],
"data": ["views/assets.xml", "views/templates.xml"],
+ "demo": ["demo/assets.xml"],
}
diff --git a/website_sale_product_minimal_price/controllers/__init__.py b/website_sale_product_minimal_price/controllers/__init__.py
new file mode 100644
index 0000000000..12a7e529b6
--- /dev/null
+++ b/website_sale_product_minimal_price/controllers/__init__.py
@@ -0,0 +1 @@
+from . import main
diff --git a/website_sale_product_minimal_price/controllers/main.py b/website_sale_product_minimal_price/controllers/main.py
new file mode 100644
index 0000000000..0c49321796
--- /dev/null
+++ b/website_sale_product_minimal_price/controllers/main.py
@@ -0,0 +1,48 @@
+# Copyright 2020 Tecnativa - Carlos Roca
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import http
+from odoo.http import request
+
+from odoo.addons.sale.controllers.variant import VariantController
+
+
+class WebsiteSaleVariantController(VariantController):
+ @http.route(
+ ["/sale/get_combination_info_minimal_price"],
+ type="json",
+ auth="public",
+ methods=["POST"],
+ website=True,
+ )
+ def get_combination_info_minimal_price(self, product_template_ids, **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.
+ """
+
+ res = []
+ templates = request.env["product.template"].sudo().browse(product_template_ids)
+ for template in templates.filtered(lambda t: t.is_published):
+ cheaper_variant = template.product_variant_ids.sorted(
+ key=lambda p: p._get_combination_info_variant().get("price")
+ )[:1]
+ res.append(
+ {
+ "id": template.id,
+ "price": cheaper_variant._get_combination_info_variant().get(
+ "price"
+ ),
+ "distinct_prices": self._compute_has_distinct_variant_price(
+ template
+ ),
+ }
+ )
+
+ return res
+
+ def _compute_has_distinct_variant_price(self, template):
+ if template.product_variant_count > 1:
+ prices = template.product_variant_ids.mapped("price")
+ if len(prices) > 1:
+ return True
+ return False
diff --git a/website_sale_product_minimal_price/demo/assets.xml b/website_sale_product_minimal_price/demo/assets.xml
new file mode 100644
index 0000000000..e51644c980
--- /dev/null
+++ b/website_sale_product_minimal_price/demo/assets.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/website_sale_product_minimal_price/i18n/es.po b/website_sale_product_minimal_price/i18n/es.po
index 989d4e6118..89f472e874 100644
--- a/website_sale_product_minimal_price/i18n/es.po
+++ b/website_sale_product_minimal_price/i18n/es.po
@@ -4,11 +4,11 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 11.0\n"
+"Project-Id-Version: Odoo Server 13.0+e\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-12-11 23:22+0000\n"
-"PO-Revision-Date: 2019-12-12 00:24+0100\n"
-"Last-Translator: \n"
+"POT-Creation-Date: 2020-06-08 10:44+0000\n"
+"PO-Revision-Date: 2020-06-08 12:47+0200\n"
+"Last-Translator: Carlos \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
@@ -18,29 +18,13 @@ msgstr ""
"X-Generator: Poedit 2.0.6\n"
#. module: website_sale_product_minimal_price
-#: model_terms:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
-msgid "From "
-msgstr "Desde "
-
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product__has_distinct_variant_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__has_distinct_variant_price
-msgid "Has variants with distinct price extra"
-msgstr "Tiene variantes con diferentes precios extra"
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
+#, python-format
+msgid "From"
+msgstr "Desde"
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
-msgstr "Plantilla de producto"
-
-#~ msgid "My product test with various prices"
-#~ msgstr "Mi producto de test con varios precios"
-
-#~ msgid "Test attribute"
-#~ msgstr "Atributo de prueba"
-
-#~ msgid "Test v1"
-#~ msgstr "Valor 1 de test"
-
-#~ msgid "Test v2"
-#~ msgstr "Valor 2 de test"
+msgstr ""
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index 83e719409e..44fa895198 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -1,12 +1,12 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * website_sale_product_minimal_price
+# * website_sale_product_minimal_price
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"Last-Translator: <>\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -14,18 +14,13 @@ msgstr ""
"Plural-Forms: \n"
#. module: website_sale_product_minimal_price
-#: model_terms:ir.ui.view,arch_db:website_sale_product_minimal_price.products_item
-msgid "From "
-msgstr ""
-
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_product__has_distinct_variant_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__has_distinct_variant_price
-msgid "Has variants with distinct price extra"
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
+#, python-format
+msgid "From"
msgstr ""
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
msgstr ""
-
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index bf4b72e18c..66fb3caab6 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -1,65 +1,11 @@
# Copyright 2019 Tecnativa - Sergio Teruel
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import fields, models
+from odoo import models
class ProductTemplate(models.Model):
_inherit = "product.template"
- has_distinct_variant_price = fields.Boolean(
- compute="_compute_has_distinct_variant_price",
- string="Has variants with distinct price extra",
- )
-
- def _compute_has_distinct_variant_price(self):
- for template in self:
- if template.product_variant_count > 1:
- prices = template.product_variant_ids.mapped("website_price")
- if len(prices) > 1:
- template.has_distinct_variant_price = True
-
- def _get_combination_info(
- self,
- combination=False,
- product_id=False,
- add_qty=1,
- pricelist=False,
- parent_combination=False,
- only_template=False,
- ):
- """
- Update product template prices for products items view in website shop
- render with cheaper variant prices.
- """
- combination_info = super()._get_combination_info(
- combination=combination,
- product_id=product_id,
- add_qty=add_qty,
- pricelist=pricelist,
- parent_combination=parent_combination,
- only_template=only_template,
- )
-
- if (
- only_template
- and self.env.context.get("website_id")
- and self.product_variant_count > 1
- ):
- cheaper_variant = self.product_variant_ids.sorted(
- key=lambda p: p.website_price
- )[:1]
-
- res = cheaper_variant._get_combination_info_variant()
-
- combination_info.update(
- {
- "price": res.get("price"),
- "list_price": res.get("list_price"),
- "has_discounted_price": res.get("has_discounted_price"),
- }
- )
- return combination_info
-
def _get_first_possible_combination(
self, parent_combination=None, necessary_values=None
):
@@ -73,13 +19,17 @@ def _get_first_possible_combination(
)
if self.env.context.get("website_id") and self.product_variant_count > 1:
ptav_obj = self.env["product.template.attribute.value"]
- pav = self.product_variant_ids.sorted("website_price")[
- :1
- ].attribute_value_ids
+ ptav = self.product_variant_ids.sorted(
+ key=lambda p: p._get_combination_info_variant().get("price")
+ )[:1].product_template_attribute_value_ids
cheaper_combination = ptav_obj.search(
[
("product_tmpl_id", "=", self.id),
- ("product_attribute_value_id", "in", pav.ids),
+ (
+ "product_attribute_value_id",
+ "in",
+ ptav.product_attribute_value_id.ids,
+ ),
]
)
variant_combination = combination.filtered(
diff --git a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
index 3bfad993cb..3fde901979 100644
--- a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
+++ b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
@@ -1,3 +1,4 @@
* `Tecnativa `_:
- * Sergio Teruel
+ * Sergio Teruel
+ * Carlos Roca
diff --git a/website_sale_product_minimal_price/static/description/index.html b/website_sale_product_minimal_price/static/description/index.html
index 9f1c74c784..32f8dbb9ae 100644
--- a/website_sale_product_minimal_price/static/description/index.html
+++ b/website_sale_product_minimal_price/static/description/index.html
@@ -367,7 +367,7 @@ Website Sale Product Minimal Price
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of website sale module to allow to
display the minimal price in ‘/shop’ view when product has distinct variants
price and set order by minimal price in product’s view.
@@ -400,7 +400,7 @@
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 smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js b/website_sale_product_minimal_price/static/src/js/tour.js
similarity index 72%
rename from website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
rename to website_sale_product_minimal_price/static/src/js/tour.js
index 305665070e..e882629145 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price_tour.js
+++ b/website_sale_product_minimal_price/static/src/js/tour.js
@@ -9,21 +9,22 @@ odoo.define("website_sale_product_minimal_price.tour", function(require) {
var steps = [
{
- trigger: "a:contains('My product test')",
- extra_trigger: ".product_price:has(span:contains('From '))",
+ trigger:
+ ".o_wsale_product_information:has(span:contains('From')) a:contains('My product test with various prices')",
},
{
trigger: "a[href='/shop']",
- extra_trigger: ".js_attribute_value:eq(0):has(span:contains('Test v2'))",
+ extra_trigger: ".js_add_cart_variants:has(span:contains('Test v2'))",
},
{
- trigger: "a:contains('My product test')",
+ trigger: "a:contains('My product test with various prices')",
},
{
trigger: "a[href='/shop']",
extra_trigger: ".product_price:has(span:contains('125.00'))",
},
];
+
tour.register(
"website_sale_product_minimal_price",
{
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
new file mode 100644
index 0000000000..f6f0970333
--- /dev/null
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
@@ -0,0 +1,64 @@
+odoo.define("website_sale_product_minimal_price.shop_min_price", function(require) {
+ "use strict";
+
+ const publicWidget = require("web.public.widget");
+ const core = require("web.core");
+ const field_utils = require("web.field_utils");
+
+ publicWidget.registry.WebsiteSaleProductMinimalPrice = publicWidget.Widget.extend({
+ selector: "#products_grid",
+ xmlDependencies: [
+ "/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml",
+ ],
+
+ start: function() {
+ return Promise.all([
+ this._super.apply(this, arguments),
+ this.render_price(),
+ ]);
+ },
+ render_price: async 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);
+ const products_min_price = await this._rpc({
+ route: "/sale/get_combination_info_minimal_price/",
+ params: {product_template_ids: product_ids},
+ });
+
+ for (const product of products_min_price) {
+ if (!product.distinct_prices) {
+ continue;
+ }
+ $(product_dic[product.id])
+ .find(".product_price")
+ .prepend(
+ $(
+ core.qweb.render(
+ "website_sale_product_minimal_price.from_view"
+ )
+ ).get(0)
+ );
+ $(product_dic[product.id])
+ .find(".product_price .oe_currency_value")
+ .replaceWith(
+ $(
+ core.qweb.render(
+ "website_sale_product_minimal_price.product_minimal_price",
+ {
+ price: this.widgetMonetary(product.price),
+ }
+ )
+ ).get(0)
+ );
+ }
+ return products_min_price;
+ },
+ widgetMonetary: function(value) {
+ return field_utils.format.monetary(value);
+ },
+ });
+});
diff --git a/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml b/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml
new file mode 100644
index 0000000000..36ab698b1a
--- /dev/null
+++ b/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+ From
+
+
diff --git a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
index 7855bd989d..cb09ebb2fa 100644
--- a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
+++ b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
@@ -8,19 +8,13 @@ def setUp(self):
super().setUp()
# Models
- AttributeCategory = self.env["product.attribute.category"]
+
ProductAttribute = self.env["product.attribute"]
ProductAttributeValue = self.env["product.attribute.value"]
ProductTmplAttributeValue = self.env["product.template.attribute.value"]
- self.attribute_category = AttributeCategory.create({"name": "Test category"})
self.product_attribute = ProductAttribute.create(
- {
- "name": "Test",
- "website_published": True,
- "create_variant": "always",
- "category_id": self.attribute_category.id,
- }
+ {"name": "Test", "create_variant": "always"}
)
self.product_attribute_value_test_1 = ProductAttributeValue.create(
{"name": "Test v1", "attribute_id": self.product_attribute.id}
@@ -31,10 +25,10 @@ def setUp(self):
self.product_template = self.env["product.template"].create(
{
"name": "My product test with various prices",
- "website_published": True,
+ "is_published": True,
"type": "consu",
"list_price": 100.0,
- "website_sequence": 5000,
+ "website_sequence": 1,
"attribute_line_ids": [
(
0,
@@ -82,7 +76,8 @@ def test_ui_website(self):
"website_sale_product_minimal_price",
)
self.browser_js(
- url_path="/",
+ url_path="/shop",
code="%s.run('%s')" % tour,
ready="%s.tours['%s'].ready" % tour,
+ login="admin",
)
diff --git a/website_sale_product_minimal_price/views/assets.xml b/website_sale_product_minimal_price/views/assets.xml
index a872cd564e..0d3da66e7d 100644
--- a/website_sale_product_minimal_price/views/assets.xml
+++ b/website_sale_product_minimal_price/views/assets.xml
@@ -4,7 +4,11 @@
+
diff --git a/website_sale_product_minimal_price/views/templates.xml b/website_sale_product_minimal_price/views/templates.xml
index 2df6ad6b56..45306c4194 100644
--- a/website_sale_product_minimal_price/views/templates.xml
+++ b/website_sale_product_minimal_price/views/templates.xml
@@ -4,43 +4,29 @@
-
+
sorted_values
sorted_values
sorted_values
-
-
-
-
- From
-
-
-
From 8225305867f240671d7807985961f327218fab01 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Mon, 29 Jun 2020 13:30:52 +0200
Subject: [PATCH 06/25] [IMP] website_sale_product_minimal_price: Removed the
async/await for avoid the inheritance problems
---
.../__manifest__.py | 2 +-
.../js/website_sale_product_minimal_price.js | 60 +++++++++----------
2 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index 07ac27b87c..3c82223cd3 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Product Minimal Price",
"summary": "Display minimal price for products that has variants",
- "version": "13.0.1.0.0",
+ "version": "13.0.1.0.1",
"development_status": "Production/Stable",
"maintainers": ["sergio-teruel"],
"category": "Website",
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
index f6f0970333..b9850ed385 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
@@ -17,45 +17,45 @@ odoo.define("website_sale_product_minimal_price.shop_min_price", function(requir
this.render_price(),
]);
},
- render_price: async function() {
+ render_price: 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);
- const products_min_price = await this._rpc({
+ return this._rpc({
route: "/sale/get_combination_info_minimal_price/",
params: {product_template_ids: product_ids},
- });
-
- for (const product of products_min_price) {
- if (!product.distinct_prices) {
- continue;
+ }).then(products_min_price => {
+ for (const product of products_min_price) {
+ if (!product.distinct_prices) {
+ continue;
+ }
+ $(product_dic[product.id])
+ .find(".product_price")
+ .prepend(
+ $(
+ core.qweb.render(
+ "website_sale_product_minimal_price.from_view"
+ )
+ ).get(0)
+ );
+ $(product_dic[product.id])
+ .find(".product_price .oe_currency_value")
+ .replaceWith(
+ $(
+ core.qweb.render(
+ "website_sale_product_minimal_price.product_minimal_price",
+ {
+ price: this.widgetMonetary(product.price),
+ }
+ )
+ ).get(0)
+ );
}
- $(product_dic[product.id])
- .find(".product_price")
- .prepend(
- $(
- core.qweb.render(
- "website_sale_product_minimal_price.from_view"
- )
- ).get(0)
- );
- $(product_dic[product.id])
- .find(".product_price .oe_currency_value")
- .replaceWith(
- $(
- core.qweb.render(
- "website_sale_product_minimal_price.product_minimal_price",
- {
- price: this.widgetMonetary(product.price),
- }
- )
- ).get(0)
- );
- }
- return products_min_price;
+ return products_min_price;
+ });
},
widgetMonetary: function(value) {
return field_utils.format.monetary(value);
From 5690a794a58fd93fd985149fa98d7f0b53b71865 Mon Sep 17 00:00:00 2001
From: Bosd
Date: Tue, 15 Dec 2020 10:30:49 +0000
Subject: [PATCH 07/25] Added translation using Weblate (Dutch)
---
website_sale_product_minimal_price/i18n/nl.po | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 website_sale_product_minimal_price/i18n/nl.po
diff --git a/website_sale_product_minimal_price/i18n/nl.po b/website_sale_product_minimal_price/i18n/nl.po
new file mode 100644
index 0000000000..f0cdc668cb
--- /dev/null
+++ b/website_sale_product_minimal_price/i18n/nl.po
@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_product_minimal_price
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 13.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2020-12-15 13:19+0000\n"
+"Last-Translator: Bosd \n"
+"Language-Team: none\n"
+"Language: nl\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 4.3.2\n"
+
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
+#, python-format
+msgid "From"
+msgstr "Van"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
+msgid "Product Template"
+msgstr "Product Sjabloon"
From 00ea772043f904a788ac43e4b8969cda05ee083c Mon Sep 17 00:00:00 2001
From: claudiagn
Date: Thu, 25 Feb 2021 15:54:17 +0000
Subject: [PATCH 08/25] Added translation using Weblate (Catalan)
---
website_sale_product_minimal_price/i18n/ca.po | 29 +++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100644 website_sale_product_minimal_price/i18n/ca.po
diff --git a/website_sale_product_minimal_price/i18n/ca.po b/website_sale_product_minimal_price/i18n/ca.po
new file mode 100644
index 0000000000..8a464abfb1
--- /dev/null
+++ b/website_sale_product_minimal_price/i18n/ca.po
@@ -0,0 +1,29 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_product_minimal_price
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 13.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2021-02-25 17:46+0000\n"
+"Last-Translator: claudiagn \n"
+"Language-Team: none\n"
+"Language: ca\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 4.3.2\n"
+
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
+#, python-format
+msgid "From"
+msgstr "De"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
+msgid "Product Template"
+msgstr "Plantilla de producte"
From ca57801e7b4484bbf648e32a370d10a0c68f308a Mon Sep 17 00:00:00 2001
From: claudiagn
Date: Thu, 25 Feb 2021 15:54:33 +0000
Subject: [PATCH 09/25] Translated using Weblate (Spanish)
Currently translated at 100.0% (2 of 2 strings)
Translation: e-commerce-13.0/e-commerce-13.0-website_sale_product_minimal_price
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-13-0/e-commerce-13-0-website_sale_product_minimal_price/es/
---
website_sale_product_minimal_price/i18n/es.po | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/website_sale_product_minimal_price/i18n/es.po b/website_sale_product_minimal_price/i18n/es.po
index 89f472e874..60a377827c 100644
--- a/website_sale_product_minimal_price/i18n/es.po
+++ b/website_sale_product_minimal_price/i18n/es.po
@@ -7,15 +7,15 @@ msgstr ""
"Project-Id-Version: Odoo Server 13.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-06-08 10:44+0000\n"
-"PO-Revision-Date: 2020-06-08 12:47+0200\n"
-"Last-Translator: Carlos \n"
+"PO-Revision-Date: 2021-02-25 17:45+0000\n"
+"Last-Translator: claudiagn \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 2.0.6\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 4.3.2\n"
#. module: website_sale_product_minimal_price
#. openerp-web
@@ -27,4 +27,4 @@ msgstr "Desde"
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
-msgstr ""
+msgstr "Plantilla de producto"
From 69648e74f1dfccb580063743a578b579dbab1530 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Marques?=
Date: Tue, 30 Mar 2021 11:21:02 +0100
Subject: [PATCH 10/25] [FIX] website_sale_product_minimal_price: Fix tests
Ensure we use a consistant currency
TT28906
---
.../__manifest__.py | 2 +-
...test_website_sale_product_minimal_price.py | 28 ++++++++++---------
2 files changed, 16 insertions(+), 14 deletions(-)
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index 3c82223cd3..2894718f5d 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Product Minimal Price",
"summary": "Display minimal price for products that has variants",
- "version": "13.0.1.0.1",
+ "version": "13.0.1.0.2",
"development_status": "Production/Stable",
"maintainers": ["sergio-teruel"],
"category": "Website",
diff --git a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
index cb09ebb2fa..02bd5178ed 100644
--- a/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
+++ b/website_sale_product_minimal_price/tests/test_website_sale_product_minimal_price.py
@@ -6,13 +6,23 @@
class WebsiteSaleProductMinimalPriceHttpCase(HttpCase):
def setUp(self):
super().setUp()
-
+ # Create and select a pricelist
+ # to make tests pass no matter what l10n package is enabled
+ self.website = self.env["website"].get_current_website()
+ pricelist = self.env["product.pricelist"].create(
+ {
+ "name": "website_sale_product_minimal_price public",
+ "currency_id": self.env.company.currency_id.id,
+ "selectable": True,
+ "sequence": 1,
+ "website_id": self.website.id,
+ }
+ )
+ self.env.ref("base.user_admin").property_product_pricelist = pricelist
# Models
-
ProductAttribute = self.env["product.attribute"]
ProductAttributeValue = self.env["product.attribute.value"]
ProductTmplAttributeValue = self.env["product.template.attribute.value"]
-
self.product_attribute = ProductAttribute.create(
{"name": "Test", "create_variant": "always"}
)
@@ -28,6 +38,7 @@ def setUp(self):
"is_published": True,
"type": "consu",
"list_price": 100.0,
+ "website_id": self.website.id,
"website_sequence": 1,
"attribute_line_ids": [
(
@@ -71,13 +82,4 @@ def setUp(self):
def test_ui_website(self):
"""Test frontend tour."""
- tour = (
- "odoo.__DEBUG__.services['web_tour.tour']",
- "website_sale_product_minimal_price",
- )
- self.browser_js(
- url_path="/shop",
- code="%s.run('%s')" % tour,
- ready="%s.tours['%s'].ready" % tour,
- login="admin",
- )
+ self.start_tour("/shop", "website_sale_product_minimal_price", login="admin")
From b0def20c0a0a85492b56ea63bd17e03708ef5f39 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Mon, 17 May 2021 16:39:50 +0200
Subject: [PATCH 11/25] [IMP] website_sale_product_minimal_price: Forward port
of improvements of 12.0
Forward port adapting the minimal price computing to the new way added on version 13.0.
With the changes added the price takes care on the website selected pricelist and it's added the grid of price scale for each product.variant.
TT24175
---
.../controllers/main.py | 76 +++++++++++----
website_sale_product_minimal_price/i18n/ca.po | 16 +++-
website_sale_product_minimal_price/i18n/es.po | 15 ++-
website_sale_product_minimal_price/i18n/nl.po | 16 +++-
.../website_sale_product_minimal_price.pot | 11 ++-
.../models/product_template.py | 92 +++++++++++++------
.../readme/CONFIGURE.rst | 2 +
.../readme/CONTRIBUTORS.rst | 1 +
.../js/website_sale_product_price_scale.js | 84 +++++++++++++++++
.../xml/website_sale_product_price_scale.xml | 18 ++++
.../views/assets.xml | 4 +
11 files changed, 274 insertions(+), 61 deletions(-)
create mode 100644 website_sale_product_minimal_price/readme/CONFIGURE.rst
create mode 100644 website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js
create mode 100644 website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml
diff --git a/website_sale_product_minimal_price/controllers/main.py b/website_sale_product_minimal_price/controllers/main.py
index 0c49321796..e962470d6b 100644
--- a/website_sale_product_minimal_price/controllers/main.py
+++ b/website_sale_product_minimal_price/controllers/main.py
@@ -1,4 +1,4 @@
-# Copyright 2020 Tecnativa - Carlos Roca
+# Copyright 2021 Tecnativa - Carlos Roca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import http
@@ -19,30 +19,70 @@ def get_combination_info_minimal_price(self, product_template_ids, **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.
"""
-
res = []
templates = request.env["product.template"].sudo().browse(product_template_ids)
+ pricelist = request.env["website"].get_current_website().get_current_pricelist()
for template in templates.filtered(lambda t: t.is_published):
- cheaper_variant = template.product_variant_ids.sorted(
- key=lambda p: p._get_combination_info_variant().get("price")
- )[:1]
+ product_id, add_qty, has_distinct_price = template._get_cheapest_info(
+ pricelist
+ )
+ combination = template._get_combination_info(
+ product_id=product_id, add_qty=add_qty, pricelist=pricelist
+ )
res.append(
{
"id": template.id,
- "price": cheaper_variant._get_combination_info_variant().get(
- "price"
- ),
- "distinct_prices": self._compute_has_distinct_variant_price(
- template
- ),
+ "price": combination.get("price"),
+ "distinct_prices": has_distinct_price,
}
)
-
return res
- def _compute_has_distinct_variant_price(self, template):
- if template.product_variant_count > 1:
- prices = template.product_variant_ids.mapped("price")
- if len(prices) > 1:
- return True
- return False
+ @http.route(
+ ["/sale/get_combination_info_pricelist_atributes"],
+ type="json",
+ auth="public",
+ website=True,
+ )
+ def get_combination_info_pricelist_atributes(self, product_id, **kwargs):
+ """Special route to use website logic in get_combination_info override.
+ This route is called in JS by appending _website to the base route.
+ """
+ product = request.env["product.product"].browse(product_id)
+ pricelist = request.env["website"].get_current_website().get_current_pricelist()
+ # Getting all min_quantity of the current product to compute the possible
+ # price scale.
+ qty_list = request.env["product.pricelist.item"].search(
+ [
+ "|",
+ ("product_id", "=", product.id),
+ "|",
+ ("product_tmpl_id", "=", product.product_tmpl_id.id),
+ (
+ "categ_id",
+ "in",
+ list(map(int, product.categ_id.parent_path.split("/")[0:-1])),
+ ),
+ ("min_quantity", ">", 0),
+ ]
+ )
+ qty_list = sorted(set(qty_list.mapped("min_quantity")))
+ res = []
+ ctx = dict(request.env.context, pricelist=pricelist.id, quantity=0)
+ last_price = product.with_context(ctx).price
+ for min_qty in qty_list:
+ ctx["quantity"] = min_qty
+ new_price = product.with_context(ctx).price
+ if new_price != last_price:
+ res.append(
+ {
+ "min_qty": min_qty,
+ "price": new_price,
+ "currency": {
+ "position": product.currency_id.position,
+ "symbol": product.currency_id.symbol,
+ },
+ }
+ )
+ last_price = new_price
+ return (res, product.uom_name)
diff --git a/website_sale_product_minimal_price/i18n/ca.po b/website_sale_product_minimal_price/i18n/ca.po
index 8a464abfb1..8a23302600 100644
--- a/website_sale_product_minimal_price/i18n/ca.po
+++ b/website_sale_product_minimal_price/i18n/ca.po
@@ -6,15 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2021-02-25 17:46+0000\n"
-"Last-Translator: claudiagn \n"
+"POT-Creation-Date: 2021-05-17 14:53+0000\n"
+"PO-Revision-Date: 2021-05-17 16:54+0200\n"
+"Last-Translator: Carlos \n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.3.2\n"
+"X-Generator: Poedit 2.0.6\n"
#. module: website_sale_product_minimal_price
#. openerp-web
@@ -23,6 +24,13 @@ msgstr ""
msgid "From"
msgstr "De"
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
+#, python-format
+msgid "Prices per quantity ("
+msgstr "Preus per quantitat ("
+
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
diff --git a/website_sale_product_minimal_price/i18n/es.po b/website_sale_product_minimal_price/i18n/es.po
index 60a377827c..49b9e64e5a 100644
--- a/website_sale_product_minimal_price/i18n/es.po
+++ b/website_sale_product_minimal_price/i18n/es.po
@@ -6,16 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0+e\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-06-08 10:44+0000\n"
-"PO-Revision-Date: 2021-02-25 17:45+0000\n"
-"Last-Translator: claudiagn \n"
+"POT-Creation-Date: 2021-05-17 14:53+0000\n"
+"PO-Revision-Date: 2021-05-17 16:54+0200\n"
+"Last-Translator: Carlos \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: Weblate 4.3.2\n"
+"X-Generator: Poedit 2.0.6\n"
#. module: website_sale_product_minimal_price
#. openerp-web
@@ -24,6 +24,13 @@ msgstr ""
msgid "From"
msgstr "Desde"
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
+#, python-format
+msgid "Prices per quantity ("
+msgstr "Precios por cantidad ("
+
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
diff --git a/website_sale_product_minimal_price/i18n/nl.po b/website_sale_product_minimal_price/i18n/nl.po
index f0cdc668cb..e3b6248e8b 100644
--- a/website_sale_product_minimal_price/i18n/nl.po
+++ b/website_sale_product_minimal_price/i18n/nl.po
@@ -6,15 +6,16 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2020-12-15 13:19+0000\n"
-"Last-Translator: Bosd \n"
+"POT-Creation-Date: 2021-05-17 14:53+0000\n"
+"PO-Revision-Date: 2021-05-17 16:55+0200\n"
+"Last-Translator: Carlos \n"
"Language-Team: none\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.3.2\n"
+"X-Generator: Poedit 2.0.6\n"
#. module: website_sale_product_minimal_price
#. openerp-web
@@ -23,6 +24,13 @@ msgstr ""
msgid "From"
msgstr "Van"
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
+#, python-format
+msgid "Prices per quantity ("
+msgstr ""
+
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index 44fa895198..11a4b49669 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -4,8 +4,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 13.0+e\n"
"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-05-17 14:53+0000\n"
+"PO-Revision-Date: 2021-05-17 14:53+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -20,6 +22,13 @@ msgstr ""
msgid "From"
msgstr ""
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
+#, python-format
+msgid "Prices per quantity ("
+msgstr ""
+
#. module: website_sale_product_minimal_price
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index 66fb3caab6..516d5adf17 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -1,4 +1,6 @@
# Copyright 2019 Tecnativa - Sergio Teruel
+# Copyright 2020 Tecnativa - Pedro M. Baeza
+# Copyright 2021 Tecnativa - Carlos Roca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import models
@@ -6,38 +8,68 @@
class ProductTemplate(models.Model):
_inherit = "product.template"
+ def _get_cheapest_info(self, pricelist):
+ """Helper method for getting the variant with lowest price."""
+ # TODO: Cache this method for getting better performance
+ self.ensure_one()
+ context = dict(self.env.context, pricelist=pricelist.id)
+ min_price = 99999999
+ product_id = False
+ add_qty = 0
+ has_distinct_price = False
+ # Variants with extra price
+ variants_extra_price = self.product_variant_ids.filtered("price_extra")
+ variants_without_extra_price = self.product_variant_ids - variants_extra_price
+ # Avoid compute prices when pricelist has not item variants defined
+ variant_items = pricelist.item_ids.filtered(
+ lambda i: i.product_id in self.product_variant_ids
+ )
+ if variant_items:
+ # Take into account only the variants defined in pricelist and one
+ # variant not defined to compute prices defined at template or
+ # category level. Maybe there is any definition on template that
+ # has cheaper price.
+ variants = variant_items.mapped("product_id")
+ products = variants + (self.product_variant_ids - variants)[:1]
+ else:
+ products = variants_without_extra_price[:1]
+ products |= variants_extra_price
+ for product in products:
+ for qty in [1, 99999999]:
+ context = dict(context, quantity=qty)
+ product_price = product.with_context(context).price
+ if product_price != min_price and min_price != 99999999:
+ # Mark if there are different prices iterating over
+ # variants and comparing qty 1 and maximum qty
+ has_distinct_price = True
+ if product_price < min_price:
+ min_price = product_price
+ add_qty = qty
+ product_id = product.id
+ return product_id, add_qty, has_distinct_price
+
def _get_first_possible_combination(
self, parent_combination=None, necessary_values=None
):
- """
- Get the cheaper product combination for the product for website view.
- We only take into account attributes that generate variants and
- products with more than one variant.
- """
- combination = super()._get_first_possible_combination(
+ """Get the cheaper product combination for the website view."""
+ res = super()._get_first_possible_combination(
parent_combination=parent_combination, necessary_values=necessary_values
)
- if self.env.context.get("website_id") and self.product_variant_count > 1:
- ptav_obj = self.env["product.template.attribute.value"]
- ptav = self.product_variant_ids.sorted(
- key=lambda p: p._get_combination_info_variant().get("price")
- )[:1].product_template_attribute_value_ids
- cheaper_combination = ptav_obj.search(
- [
- ("product_tmpl_id", "=", self.id),
- (
- "product_attribute_value_id",
- "in",
- ptav.product_attribute_value_id.ids,
- ),
- ]
- )
- variant_combination = combination.filtered(
- lambda x: x.attribute_id.create_variant == "always"
- )
- combination_returned = cheaper_combination + (
- combination - variant_combination
- )
- # Keep order to avoid This combination does not exist message
- return combination_returned.sorted(lambda x: x.attribute_id.sequence)
- return combination
+ context = self.env.context
+ if (
+ context.get("website_id")
+ and context.get("pricelist")
+ and self.product_variant_count > 1
+ ):
+ # It only makes sense to change the default one when there are
+ # more than one variants and we know the pricelist
+ pricelist = self.env["product.pricelist"].browse(context["pricelist"])
+ product_id = self._get_cheapest_info(pricelist)[0]
+ product = self.env["product.product"].browse(product_id)
+ ptavs = product.product_template_attribute_value_ids
+ variant_attributes = ptavs.mapped("attribute_id")
+ # remove returned values that are variant specific
+ res.filtered(lambda x: x.attribute_id not in variant_attributes)
+ # and inject cheapest variant ones
+ res += ptavs
+ return res
diff --git a/website_sale_product_minimal_price/readme/CONFIGURE.rst b/website_sale_product_minimal_price/readme/CONFIGURE.rst
new file mode 100644
index 0000000000..e8d2aabc0d
--- /dev/null
+++ b/website_sale_product_minimal_price/readme/CONFIGURE.rst
@@ -0,0 +1,2 @@
+#. Go to *Settings > General Settings > Website* and active the option *Multiple Sales
+ Prices per Product* with the second option, for use the pricelists.
diff --git a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
index 3fde901979..a237df2186 100644
--- a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
+++ b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
@@ -2,3 +2,4 @@
* Sergio Teruel
* Carlos Roca
+ * Pedro M. Baeza
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js
new file mode 100644
index 0000000000..ddda43e481
--- /dev/null
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js
@@ -0,0 +1,84 @@
+odoo.define("website_sale_product_minimal_price.load", function(require) {
+ "use strict";
+ const ajax = require("web.ajax");
+ const core = require("web.core");
+ const field_utils = require("web.field_utils");
+ const publicWidget = require("web.public.widget");
+ const VariantMixin = require("sale.VariantMixin");
+ const QWeb = core.qweb;
+ const load_xml = ajax.loadXML(
+ "/website_sale_product_minimal_price/static/src/xml/" +
+ "website_sale_product_price_scale.xml",
+ QWeb
+ );
+
+ VariantMixin._onChangeQtyWebsiteSale = function(ev, $parent, combination) {
+ if (!this.isWebsite) {
+ return;
+ }
+ ajax.jsonRpc("/sale/get_combination_info_pricelist_atributes", "call", {
+ product_id: combination.product_id,
+ }).then(function(vals) {
+ const unit_prices = vals[0];
+ const uom_name = vals[1];
+ $(".temporal").remove();
+ if (unit_prices.length > 0) {
+ load_xml.then(function() {
+ const $form = $('form[action*="/shop/cart/update"]');
+ $form.append('
');
+ $form.append(
+ QWeb.render("website_sale_product_minimal_price.title", {
+ uom: uom_name,
+ })
+ );
+ // We define a limit of displayed columns as 4
+ const limit_col = 4;
+ let $div; // eslint-disable-line init-declarations
+ for (const i in unit_prices) {
+ if (unit_prices[i].price === 0) {
+ continue;
+ }
+ if (i % limit_col === 0) {
+ const id = i / limit_col;
+ $form.append(
+ ''
+ );
+ $div = $("#row_" + id);
+ }
+ let monetary_u = field_utils.format.monetary(
+ unit_prices[i].price,
+ {},
+ {currency: unit_prices[i].currency}
+ );
+ monetary_u = monetary_u.replace(" ", " ");
+ $div.append(
+ QWeb.render(
+ "website_sale_product_minimal_price.pricelist",
+ {
+ quantity: unit_prices[i].min_qty,
+ price: monetary_u,
+ }
+ )
+ );
+ }
+ $div = $('div[id*="row_"]');
+ for (let i = 0; i < $div.length - 1; i++) {
+ $($div[i]).addClass("border-bottom");
+ }
+ });
+ }
+ });
+ };
+ publicWidget.registry.WebsiteSale.include({
+ /**
+ * Add _onChangeQtyWebsiteSale to _onChangeCombination method.
+ *
+ * @override
+ */
+ _onChangeCombination: function() {
+ VariantMixin._onChangeQtyWebsiteSale.apply(this, arguments);
+ return this._super.apply(this, arguments);
+ },
+ });
+ return VariantMixin;
+});
diff --git a/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml b/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml
new file mode 100644
index 0000000000..fe85987314
--- /dev/null
+++ b/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ Prices per quantity ( )
+
+
+
+
+
+
diff --git a/website_sale_product_minimal_price/views/assets.xml b/website_sale_product_minimal_price/views/assets.xml
index 0d3da66e7d..e55a437f1f 100644
--- a/website_sale_product_minimal_price/views/assets.xml
+++ b/website_sale_product_minimal_price/views/assets.xml
@@ -10,6 +10,10 @@
type="text/javascript"
src="/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js"
/>
+
From 35520c076db938820b377e8c6ec52a241f15c16a Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Mon, 12 Jul 2021 11:28:50 +0200
Subject: [PATCH 12/25] [FIX] website_sale_product_minimal_price: Take into
account all pricelist item
When the product has a sales price = 0, his variants has no extra price and a pricelist depends on other pricelists to compute the prices, the algorithm takes a random variant.
Doing this changes we take care all pricelists that depends on the main to compute the prices asociated to the product.
This changes are forward ported and addapted to 13.0 version from this commit https://github.com/OCA/e-commerce/commit/fe99a35ae3a49bce24362c8b4e14aa152e2ae210#diff-d3f954ac4904966e21fd42f7b88212a43b229ad5c025afc848408a4127215ebe
---
website_sale_product_minimal_price/README.rst | 7 ++
.../__manifest__.py | 3 +-
.../controllers/main.py | 4 +
.../demo/assets.xml | 11 --
.../website_sale_product_minimal_price.pot | 4 +-
.../models/product_template.py | 57 ++++++++--
.../static/description/index.html | 33 +++---
.../js/test_product_with_no_prices_tour.js | 36 +++++++
.../js/website_sale_product_minimal_price.js | 32 ++++--
.../tests/__init__.py | 1 +
.../tests/test_product_with_no_prices.py | 102 ++++++++++++++++++
.../views/assets.xml | 12 +++
12 files changed, 259 insertions(+), 43 deletions(-)
delete mode 100644 website_sale_product_minimal_price/demo/assets.xml
create mode 100644 website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js
create mode 100644 website_sale_product_minimal_price/tests/test_product_with_no_prices.py
diff --git a/website_sale_product_minimal_price/README.rst b/website_sale_product_minimal_price/README.rst
index 6086355998..66710adb25 100644
--- a/website_sale_product_minimal_price/README.rst
+++ b/website_sale_product_minimal_price/README.rst
@@ -34,6 +34,12 @@ price and set order by minimal price in product's view.
.. contents::
:local:
+Configuration
+=============
+
+#. Go to *Settings > General Settings > Website* and active the option *Multiple Sales
+ Prices per Product* with the second option, for use the pricelists.
+
Usage
=====
@@ -69,6 +75,7 @@ Contributors
* Sergio Teruel
* Carlos Roca
+ * Pedro M. Baeza
Maintainers
~~~~~~~~~~~
diff --git a/website_sale_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index 2894718f5d..af744521ff 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Product Minimal Price",
"summary": "Display minimal price for products that has variants",
- "version": "13.0.1.0.2",
+ "version": "13.0.1.1.0",
"development_status": "Production/Stable",
"maintainers": ["sergio-teruel"],
"category": "Website",
@@ -14,5 +14,4 @@
"installable": True,
"depends": ["website_sale"],
"data": ["views/assets.xml", "views/templates.xml"],
- "demo": ["demo/assets.xml"],
}
diff --git a/website_sale_product_minimal_price/controllers/main.py b/website_sale_product_minimal_price/controllers/main.py
index e962470d6b..acee408b7f 100644
--- a/website_sale_product_minimal_price/controllers/main.py
+++ b/website_sale_product_minimal_price/controllers/main.py
@@ -34,6 +34,10 @@ def get_combination_info_minimal_price(self, product_template_ids, **kw):
"id": template.id,
"price": combination.get("price"),
"distinct_prices": has_distinct_price,
+ "currency": {
+ "position": template.currency_id.position,
+ "symbol": template.currency_id.symbol,
+ },
}
)
return res
diff --git a/website_sale_product_minimal_price/demo/assets.xml b/website_sale_product_minimal_price/demo/assets.xml
deleted file mode 100644
index e51644c980..0000000000
--- a/website_sale_product_minimal_price/demo/assets.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index 11a4b49669..45d544ebd2 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -4,10 +4,8 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 13.0+e\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-05-17 14:53+0000\n"
-"PO-Revision-Date: 2021-05-17 14:53+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index 516d5adf17..55f689293a 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -8,6 +8,44 @@
class ProductTemplate(models.Model):
_inherit = "product.template"
+ def _get_product_subpricelists(self, pricelist_id):
+ return pricelist_id.item_ids.filtered(
+ lambda i: (
+ i.applied_on == "3_global"
+ or (
+ i.applied_on == "2_product_category" and i.categ_id == self.categ_id
+ )
+ or (i.applied_on == "1_product" and i.product_tmpl_id == self)
+ or (
+ i.applied_on == "0_product_variant"
+ and i.product_id in self.product_variant_ids
+ )
+ )
+ and i.compute_price == "formula"
+ and i.base == "pricelist"
+ ).mapped("base_pricelist_id")
+
+ def _get_variants_from_pricelist(self, pricelist_ids):
+ return pricelist_ids.mapped("item_ids").filtered(
+ lambda i: i.product_id in self.product_variant_ids
+ )
+
+ def _get_pricelist_variant_items(self, pricelist_id):
+ res = self._get_variants_from_pricelist(pricelist_id)
+ next_pricelists = self._get_product_subpricelists(pricelist_id)
+ res |= self._get_variants_from_pricelist(next_pricelists)
+ visited_pricelists = pricelist_id
+ while next_pricelists:
+ pricelist = next_pricelists[0]
+ if pricelist not in visited_pricelists:
+ res |= self._get_variants_from_pricelist(pricelist)
+ next_pricelists |= self._get_product_subpricelists(pricelist)
+ next_pricelists -= pricelist
+ visited_pricelists |= pricelist
+ else:
+ next_pricelists -= pricelist
+ return res
+
def _get_cheapest_info(self, pricelist):
"""Helper method for getting the variant with lowest price."""
# TODO: Cache this method for getting better performance
@@ -21,9 +59,7 @@ def _get_cheapest_info(self, pricelist):
variants_extra_price = self.product_variant_ids.filtered("price_extra")
variants_without_extra_price = self.product_variant_ids - variants_extra_price
# Avoid compute prices when pricelist has not item variants defined
- variant_items = pricelist.item_ids.filtered(
- lambda i: i.product_id in self.product_variant_ids
- )
+ variant_items = self._get_pricelist_variant_items(pricelist)
if variant_items:
# Take into account only the variants defined in pricelist and one
# variant not defined to compute prices defined at template or
@@ -66,10 +102,13 @@ def _get_first_possible_combination(
pricelist = self.env["product.pricelist"].browse(context["pricelist"])
product_id = self._get_cheapest_info(pricelist)[0]
product = self.env["product.product"].browse(product_id)
- ptavs = product.product_template_attribute_value_ids
- variant_attributes = ptavs.mapped("attribute_id")
- # remove returned values that are variant specific
- res.filtered(lambda x: x.attribute_id not in variant_attributes)
- # and inject cheapest variant ones
- res += ptavs
+ # Rebuild the combination in the expected order
+ res = self.env["product.template.attribute.value"]
+ for line in product.valid_product_template_attribute_line_ids:
+ value = product.product_template_attribute_value_ids.filtered(
+ lambda x: x in line.product_template_value_ids
+ )
+ if not value:
+ value = line.product_template_value_ids[:1]
+ res += value
return res
diff --git a/website_sale_product_minimal_price/static/description/index.html b/website_sale_product_minimal_price/static/description/index.html
index 32f8dbb9ae..6e231d1a54 100644
--- a/website_sale_product_minimal_price/static/description/index.html
+++ b/website_sale_product_minimal_price/static/description/index.html
@@ -374,18 +374,26 @@ Website Sale Product Minimal Price
Table of contents
+
+
+
+- Go to Settings > General Settings > Website and active the option Multiple Sales
+Prices per Product with the second option, for use the pricelists.
+
+
-
+
- Go to backend and set a product with variants and extra price by attribute
value or define a distinct prices in public price list for this variant.
@@ -396,7 +404,7 @@
-
+
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 smashing it by providing a detailed and welcomed
@@ -404,28 +412,29 @@
Do not contact contributors directly about support or help with technical issues.
-
+
-
+
Tecnativa:
- Sergio Teruel
- Carlos Roca
+- Pedro M. Baeza
-
+
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
diff --git a/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js b/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js
new file mode 100644
index 0000000000..fd2ba126aa
--- /dev/null
+++ b/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js
@@ -0,0 +1,36 @@
+/* Copyright 2021 Carlos Roca
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+odoo.define("test_product_with_no_prices.tour", function(require) {
+ "use strict";
+
+ var tour = require("web_tour.tour");
+ var base = require("web_editor.base");
+
+ var steps = [
+ {
+ trigger: "a:contains('My product test with no prices')",
+ extra_trigger: ".product_price:has(span:contains('From'))",
+ },
+ {
+ trigger: "a[href='/shop']",
+ extra_trigger: ".product_price:has(span:contains('10.00'))",
+ },
+ {
+ trigger: "a:contains('My product test')",
+ extra_trigger: ".product_price:has(span:contains('10.00'))",
+ },
+ ];
+ tour.register(
+ "test_product_with_no_prices",
+ {
+ url: "/shop",
+ test: true,
+ wait_for: base.ready(),
+ },
+ steps
+ );
+ return {
+ steps: steps,
+ };
+});
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
index b9850ed385..b8a9b4a91a 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
@@ -41,24 +41,44 @@ odoo.define("website_sale_product_minimal_price.shop_min_price", function(requir
)
).get(0)
);
- $(product_dic[product.id])
- .find(".product_price .oe_currency_value")
- .replaceWith(
+ const $price = $(product_dic[product.id]).find(
+ ".product_price span .oe_currency_value"
+ );
+ if ($price.length) {
+ $price.replaceWith(
$(
core.qweb.render(
"website_sale_product_minimal_price.product_minimal_price",
{
- price: this.widgetMonetary(product.price),
+ price: this.widgetMonetary(product.price, {}),
}
)
).get(0)
);
+ } else {
+ let price = this.widgetMonetary(product.price, {
+ currency: product.currency,
+ });
+ price = price.replace(" ", " ");
+ $(product_dic[product.id])
+ .find(".product_price")
+ .append(
+ $(
+ core.qweb.render(
+ "website_sale_product_minimal_price.product_minimal_price",
+ {
+ price: price,
+ }
+ )
+ ).get(0)
+ );
+ }
}
return products_min_price;
});
},
- widgetMonetary: function(value) {
- return field_utils.format.monetary(value);
+ widgetMonetary: function(amount, format_options) {
+ return field_utils.format.monetary(amount, {}, format_options);
},
});
});
diff --git a/website_sale_product_minimal_price/tests/__init__.py b/website_sale_product_minimal_price/tests/__init__.py
index 3feff797da..9b4e19e20f 100644
--- a/website_sale_product_minimal_price/tests/__init__.py
+++ b/website_sale_product_minimal_price/tests/__init__.py
@@ -1 +1,2 @@
from . import test_website_sale_product_minimal_price
+from . import test_product_with_no_prices
diff --git a/website_sale_product_minimal_price/tests/test_product_with_no_prices.py b/website_sale_product_minimal_price/tests/test_product_with_no_prices.py
new file mode 100644
index 0000000000..c86f783366
--- /dev/null
+++ b/website_sale_product_minimal_price/tests/test_product_with_no_prices.py
@@ -0,0 +1,102 @@
+# Copyright 2021 Tecnativa - Carlos Roca
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo.tests.common import HttpCase
+
+
+class TestProductWithNoPrices(HttpCase):
+ """ With this test we are checking that the minimal price is set
+ when the product has not a price defined and the price of
+ variants depend on a subpricelist.
+ """
+
+ def setUp(self):
+ super().setUp()
+ ProductAttribute = self.env["product.attribute"]
+ ProductAttributeValue = self.env["product.attribute.value"]
+ self.category = self.env["product.category"].create({"name": "Test category"})
+ self.product_attribute = ProductAttribute.create(
+ {"name": "Test", "create_variant": "always"}
+ )
+ self.product_attribute_value_test_1 = ProductAttributeValue.create(
+ {"name": "Test v1", "attribute_id": self.product_attribute.id}
+ )
+ self.product_attribute_value_test_2 = ProductAttributeValue.create(
+ {"name": "Test v2", "attribute_id": self.product_attribute.id}
+ )
+ self.product_template = self.env["product.template"].create(
+ {
+ "name": "My product test with no prices",
+ "is_published": True,
+ "type": "consu",
+ "website_sequence": 1,
+ "categ_id": self.category.id,
+ "attribute_line_ids": [
+ (
+ 0,
+ 0,
+ {
+ "attribute_id": self.product_attribute.id,
+ "value_ids": [
+ (4, self.product_attribute_value_test_1.id),
+ (4, self.product_attribute_value_test_2.id),
+ ],
+ },
+ ),
+ ],
+ }
+ )
+ self.variant_1 = self.product_template.product_variant_ids[0]
+ self.variant_2 = self.product_template.product_variant_ids[1]
+ self.pricelist_aux = self.env["product.pricelist"].create(
+ {
+ "name": "Test pricelist Aux",
+ "selectable": True,
+ "item_ids": [
+ (
+ 0,
+ 0,
+ {
+ "applied_on": "0_product_variant",
+ "product_id": self.variant_1.id,
+ "compute_price": "fixed",
+ "fixed_price": 10,
+ },
+ ),
+ (
+ 0,
+ 0,
+ {
+ "applied_on": "0_product_variant",
+ "product_id": self.variant_2.id,
+ "compute_price": "fixed",
+ "fixed_price": 11,
+ },
+ ),
+ ],
+ }
+ )
+ self.pricelist_main = self.env["product.pricelist"].create(
+ {
+ "name": "Test pricelist Main",
+ "selectable": True,
+ "item_ids": [
+ (
+ 0,
+ 0,
+ {
+ "applied_on": "2_product_category",
+ "categ_id": self.category.id,
+ "compute_price": "formula",
+ "base": "pricelist",
+ "base_pricelist_id": self.pricelist_aux.id,
+ },
+ )
+ ],
+ }
+ )
+ user = self.env.ref("base.user_admin")
+ user.property_product_pricelist = self.pricelist_main
+
+ def test_ui_website(self):
+ """Test frontend tour."""
+ self.start_tour("/", "test_product_with_no_prices", login="admin")
diff --git a/website_sale_product_minimal_price/views/assets.xml b/website_sale_product_minimal_price/views/assets.xml
index e55a437f1f..4402201c56 100644
--- a/website_sale_product_minimal_price/views/assets.xml
+++ b/website_sale_product_minimal_price/views/assets.xml
@@ -16,4 +16,16 @@
/>
+
+
+
+
+
+
From c058c76ac5049a75c69702fe22717c7d25f7b4ba Mon Sep 17 00:00:00 2001
From: miguels73 <55379877+miguels73@users.noreply.github.com>
Date: Wed, 14 Jul 2021 17:21:05 +0200
Subject: [PATCH 13/25] [IMP] website_sale_product_minimal_price: black, isort,
prettier
---
.../src/js/test_product_with_no_prices_tour.js | 2 +-
.../static/src/js/tour.js | 2 +-
.../src/js/website_sale_product_minimal_price.js | 12 ++++++------
.../src/js/website_sale_product_price_scale.js | 10 +++++-----
.../tests/test_product_with_no_prices.py | 6 +++---
5 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js b/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js
index fd2ba126aa..fa8b1fcb69 100644
--- a/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js
+++ b/website_sale_product_minimal_price/static/src/js/test_product_with_no_prices_tour.js
@@ -1,7 +1,7 @@
/* Copyright 2021 Carlos Roca
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define("test_product_with_no_prices.tour", function(require) {
+odoo.define("test_product_with_no_prices.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
diff --git a/website_sale_product_minimal_price/static/src/js/tour.js b/website_sale_product_minimal_price/static/src/js/tour.js
index e882629145..1fa44e9d7e 100644
--- a/website_sale_product_minimal_price/static/src/js/tour.js
+++ b/website_sale_product_minimal_price/static/src/js/tour.js
@@ -1,7 +1,7 @@
/* Copyright 2019 Sergio Teruel
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define("website_sale_product_minimal_price.tour", function(require) {
+odoo.define("website_sale_product_minimal_price.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
index b8a9b4a91a..4a162cc0a0 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_minimal_price.js
@@ -1,4 +1,4 @@
-odoo.define("website_sale_product_minimal_price.shop_min_price", function(require) {
+odoo.define("website_sale_product_minimal_price.shop_min_price", function (require) {
"use strict";
const publicWidget = require("web.public.widget");
@@ -11,23 +11,23 @@ odoo.define("website_sale_product_minimal_price.shop_min_price", function(requir
"/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml",
],
- start: function() {
+ start: function () {
return Promise.all([
this._super.apply(this, arguments),
this.render_price(),
]);
},
- render_price: function() {
+ render_price: function () {
const $products = $(".o_wsale_product_grid_wrapper");
const product_dic = {};
- $products.each(function() {
+ $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_combination_info_minimal_price/",
params: {product_template_ids: product_ids},
- }).then(products_min_price => {
+ }).then((products_min_price) => {
for (const product of products_min_price) {
if (!product.distinct_prices) {
continue;
@@ -77,7 +77,7 @@ odoo.define("website_sale_product_minimal_price.shop_min_price", function(requir
return products_min_price;
});
},
- widgetMonetary: function(amount, format_options) {
+ widgetMonetary: function (amount, format_options) {
return field_utils.format.monetary(amount, {}, format_options);
},
});
diff --git a/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js b/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js
index ddda43e481..2d01af272f 100644
--- a/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js
+++ b/website_sale_product_minimal_price/static/src/js/website_sale_product_price_scale.js
@@ -1,4 +1,4 @@
-odoo.define("website_sale_product_minimal_price.load", function(require) {
+odoo.define("website_sale_product_minimal_price.load", function (require) {
"use strict";
const ajax = require("web.ajax");
const core = require("web.core");
@@ -12,18 +12,18 @@ odoo.define("website_sale_product_minimal_price.load", function(require) {
QWeb
);
- VariantMixin._onChangeQtyWebsiteSale = function(ev, $parent, combination) {
+ VariantMixin._onChangeQtyWebsiteSale = function (ev, $parent, combination) {
if (!this.isWebsite) {
return;
}
ajax.jsonRpc("/sale/get_combination_info_pricelist_atributes", "call", {
product_id: combination.product_id,
- }).then(function(vals) {
+ }).then(function (vals) {
const unit_prices = vals[0];
const uom_name = vals[1];
$(".temporal").remove();
if (unit_prices.length > 0) {
- load_xml.then(function() {
+ load_xml.then(function () {
const $form = $('form[action*="/shop/cart/update"]');
$form.append('
');
$form.append(
@@ -75,7 +75,7 @@ odoo.define("website_sale_product_minimal_price.load", function(require) {
*
* @override
*/
- _onChangeCombination: function() {
+ _onChangeCombination: function () {
VariantMixin._onChangeQtyWebsiteSale.apply(this, arguments);
return this._super.apply(this, arguments);
},
diff --git a/website_sale_product_minimal_price/tests/test_product_with_no_prices.py b/website_sale_product_minimal_price/tests/test_product_with_no_prices.py
index c86f783366..88504087b7 100644
--- a/website_sale_product_minimal_price/tests/test_product_with_no_prices.py
+++ b/website_sale_product_minimal_price/tests/test_product_with_no_prices.py
@@ -4,9 +4,9 @@
class TestProductWithNoPrices(HttpCase):
- """ With this test we are checking that the minimal price is set
- when the product has not a price defined and the price of
- variants depend on a subpricelist.
+ """With this test we are checking that the minimal price is set
+ when the product has not a price defined and the price of
+ variants depend on a subpricelist.
"""
def setUp(self):
From f89014accfb3b4a75e8d7b84bd571ddf6fd52713 Mon Sep 17 00:00:00 2001
From: miguels73 <55379877+miguels73@users.noreply.github.com>
Date: Thu, 15 Jul 2021 10:24:56 +0200
Subject: [PATCH 14/25] [MIG] website_sale_product_minimal_price: Migration to
14.0
---
website_sale_product_minimal_price/README.rst | 10 +++++-----
.../__manifest__.py | 2 +-
.../i18n/website_sale_product_minimal_price.pot | 17 ++++++++++++++++-
.../static/description/index.html | 6 +++---
4 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/website_sale_product_minimal_price/README.rst b/website_sale_product_minimal_price/README.rst
index 66710adb25..2bbcbf7110 100644
--- a/website_sale_product_minimal_price/README.rst
+++ b/website_sale_product_minimal_price/README.rst
@@ -14,13 +14,13 @@ Website Sale Product Minimal Price
: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/13.0/website_sale_product_minimal_price
+ :target: https://github.com/OCA/e-commerce/tree/14.0/website_sale_product_minimal_price
: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-13-0/e-commerce-13-0-website_sale_product_minimal_price
+ :target: https://translation.odoo-community.org/projects/e-commerce-14-0/e-commerce-14-0-website_sale_product_minimal_price
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/113/13.0
+ :target: https://runbot.odoo-community.org/runbot/113/14.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -56,7 +56,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 smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -98,6 +98,6 @@ Current `maintainer `__:
|maintainer-sergio-teruel|
-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_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index af744521ff..c5ee20d6a6 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Product Minimal Price",
"summary": "Display minimal price for products that has variants",
- "version": "13.0.1.1.0",
+ "version": "14.0.1.0.0",
"development_status": "Production/Stable",
"maintainers": ["sergio-teruel"],
"category": "Website",
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index 45d544ebd2..5e48100f30 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -13,6 +13,11 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__display_name
+msgid "Display Name"
+msgstr ""
+
#. module: website_sale_product_minimal_price
#. openerp-web
#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
@@ -20,6 +25,16 @@ msgstr ""
msgid "From"
msgstr ""
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__id
+msgid "ID"
+msgstr ""
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template____last_update
+msgid "Last Modified on"
+msgstr ""
+
#. module: website_sale_product_minimal_price
#. openerp-web
#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
diff --git a/website_sale_product_minimal_price/static/description/index.html b/website_sale_product_minimal_price/static/description/index.html
index 6e231d1a54..2c1101a0a0 100644
--- a/website_sale_product_minimal_price/static/description/index.html
+++ b/website_sale_product_minimal_price/static/description/index.html
@@ -367,7 +367,7 @@ Website Sale Product Minimal Price
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of website sale module to allow to
display the minimal price in ‘/shop’ view when product has distinct variants
price and set order by minimal price in product’s view.
@@ -408,7 +408,7 @@
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 smashing it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
From eeeb6f03a593aa3dec17a5da81f94b0f17cddf3f Mon Sep 17 00:00:00 2001
From: Pedro Castro Silva
Date: Mon, 22 Aug 2022 12:04:28 +0000
Subject: [PATCH 15/25] Added translation using Weblate (Portuguese)
---
website_sale_product_minimal_price/i18n/pt.po | 51 +++++++++++++++++++
1 file changed, 51 insertions(+)
create mode 100644 website_sale_product_minimal_price/i18n/pt.po
diff --git a/website_sale_product_minimal_price/i18n/pt.po b/website_sale_product_minimal_price/i18n/pt.po
new file mode 100644
index 0000000000..7d9432f533
--- /dev/null
+++ b/website_sale_product_minimal_price/i18n/pt.po
@@ -0,0 +1,51 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_product_minimal_price
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2022-08-22 14:07+0000\n"
+"Last-Translator: Pedro Castro Silva \n"
+"Language-Team: none\n"
+"Language: pt\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 4.3.2\n"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__display_name
+msgid "Display Name"
+msgstr "Nome a Exibir"
+
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
+#, python-format
+msgid "From"
+msgstr "A partir de"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__id
+msgid "ID"
+msgstr "ID"
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template____last_update
+msgid "Last Modified on"
+msgstr "Modific. pela última vez em"
+
+#. module: website_sale_product_minimal_price
+#. openerp-web
+#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
+#, python-format
+msgid "Prices per quantity ("
+msgstr "Preços por quantidade ("
+
+#. module: website_sale_product_minimal_price
+#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
+msgid "Product Template"
+msgstr "Modelo de Produto"
From 982a693a3e3e9ad6b7b474a30a7e0d95628a096f Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa
Date: Fri, 24 Feb 2023 14:20:01 +0100
Subject: [PATCH 16/25] [MIG] website_sale_product_minimal_price: Migration to
version 15.0
TT37015
---
website_sale_product_minimal_price/README.rst | 28 ++++++----
.../__manifest__.py | 18 +++++-
.../controllers/main.py | 12 ++--
website_sale_product_minimal_price/i18n/pt.po | 24 +++-----
.../website_sale_product_minimal_price.pot | 17 +-----
.../models/product_template.py | 6 +-
.../readme/CONFIGURE.rst | 4 +-
.../readme/CONTRIBUTORS.rst | 1 +
.../static/description/index.html | 55 ++++++++++---------
.../js/test_product_with_no_prices_tour.js | 2 -
.../static/src/js/tour.js | 2 -
.../js/website_sale_product_price_scale.js | 18 +++---
.../tests/test_product_with_no_prices.py | 2 +
...test_website_sale_product_minimal_price.py | 2 +
.../views/assets.xml | 31 -----------
15 files changed, 99 insertions(+), 123 deletions(-)
delete mode 100644 website_sale_product_minimal_price/views/assets.xml
diff --git a/website_sale_product_minimal_price/README.rst b/website_sale_product_minimal_price/README.rst
index 2bbcbf7110..9247f6496e 100644
--- a/website_sale_product_minimal_price/README.rst
+++ b/website_sale_product_minimal_price/README.rst
@@ -2,10 +2,13 @@
Website Sale Product Minimal Price
==================================
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:c15e23fa98ac00dafdd930866f49ca5ae4c2dd6a66eaa55b531f83eb06f69cea
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
@@ -14,16 +17,16 @@ Website Sale Product Minimal Price
: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/14.0/website_sale_product_minimal_price
+ :target: https://github.com/OCA/e-commerce/tree/15.0/website_sale_product_minimal_price
: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-14-0/e-commerce-14-0-website_sale_product_minimal_price
+ :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_product_minimal_price
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/113/14.0
- :alt: Try me on Runbot
+.. |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|
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module extends the functionality of website sale module to allow to
display the minimal price in '/shop' view when product has distinct variants
@@ -37,8 +40,8 @@ price and set order by minimal price in product's view.
Configuration
=============
-#. Go to *Settings > General Settings > Website* and active the option *Multiple Sales
- Prices per Product* with the second option, for use the pricelists.
+#. Go to *Website > Configuration > Settings > Pricing > Pricelist* and active the option *Multiple
+ Prices per Product*, for use the pricelists.
Usage
=====
@@ -55,8 +58,8 @@ 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 smashing it by providing a detailed and welcomed
-`feedback `_.
+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.
@@ -76,6 +79,7 @@ Contributors
* Sergio Teruel
* Carlos Roca
* Pedro M. Baeza
+ * Pilar Vargas
Maintainers
~~~~~~~~~~~
@@ -98,6 +102,6 @@ Current `maintainer `__:
|maintainer-sergio-teruel|
-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_product_minimal_price/__manifest__.py b/website_sale_product_minimal_price/__manifest__.py
index c5ee20d6a6..f135044bb3 100644
--- a/website_sale_product_minimal_price/__manifest__.py
+++ b/website_sale_product_minimal_price/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Product Minimal Price",
"summary": "Display minimal price for products that has variants",
- "version": "14.0.1.0.0",
+ "version": "15.0.1.0.0",
"development_status": "Production/Stable",
"maintainers": ["sergio-teruel"],
"category": "Website",
@@ -13,5 +13,19 @@
"application": False,
"installable": True,
"depends": ["website_sale"],
- "data": ["views/assets.xml", "views/templates.xml"],
+ "data": ["views/templates.xml"],
+ "assets": {
+ "web.assets_frontend": [
+ "/web/static/src/legacy/js/fields/field_utils.js",
+ "/website_sale_product_minimal_price/static/src/js"
+ "/website_sale_product_minimal_price.js",
+ "/website_sale_product_minimal_price/static/src/js"
+ "/website_sale_product_price_scale.js",
+ ],
+ "web.assets_tests": [
+ "/website_sale_product_minimal_price/static/src/js/tour.js",
+ "/website_sale_product_minimal_price/static/src/js"
+ "/test_product_with_no_prices_tour.js",
+ ],
+ },
}
diff --git a/website_sale_product_minimal_price/controllers/main.py b/website_sale_product_minimal_price/controllers/main.py
index acee408b7f..5c9db94df6 100644
--- a/website_sale_product_minimal_price/controllers/main.py
+++ b/website_sale_product_minimal_price/controllers/main.py
@@ -52,8 +52,12 @@ def get_combination_info_pricelist_atributes(self, product_id, **kwargs):
"""Special route to use website logic in get_combination_info override.
This route is called in JS by appending _website to the base route.
"""
- product = request.env["product.product"].browse(product_id)
pricelist = request.env["website"].get_current_website().get_current_pricelist()
+ product = (
+ request.env["product.product"]
+ .browse(product_id)
+ .with_context(pricelist=pricelist.id)
+ )
# Getting all min_quantity of the current product to compute the possible
# price scale.
qty_list = request.env["product.pricelist.item"].search(
@@ -72,11 +76,9 @@ def get_combination_info_pricelist_atributes(self, product_id, **kwargs):
)
qty_list = sorted(set(qty_list.mapped("min_quantity")))
res = []
- ctx = dict(request.env.context, pricelist=pricelist.id, quantity=0)
- last_price = product.with_context(ctx).price
+ last_price = product.with_context(quantity=0).price
for min_qty in qty_list:
- ctx["quantity"] = min_qty
- new_price = product.with_context(ctx).price
+ new_price = product.with_context(quantity=min_qty).price
if new_price != last_price:
res.append(
{
diff --git a/website_sale_product_minimal_price/i18n/pt.po b/website_sale_product_minimal_price/i18n/pt.po
index 7d9432f533..8191be7ea2 100644
--- a/website_sale_product_minimal_price/i18n/pt.po
+++ b/website_sale_product_minimal_price/i18n/pt.po
@@ -16,11 +16,6 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__display_name
-msgid "Display Name"
-msgstr "Nome a Exibir"
-
#. module: website_sale_product_minimal_price
#. openerp-web
#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
@@ -28,16 +23,6 @@ msgstr "Nome a Exibir"
msgid "From"
msgstr "A partir de"
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__id
-msgid "ID"
-msgstr "ID"
-
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template____last_update
-msgid "Last Modified on"
-msgstr "Modific. pela última vez em"
-
#. module: website_sale_product_minimal_price
#. openerp-web
#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
@@ -49,3 +34,12 @@ msgstr "Preços por quantidade ("
#: model:ir.model,name:website_sale_product_minimal_price.model_product_template
msgid "Product Template"
msgstr "Modelo de Produto"
+
+#~ msgid "Display Name"
+#~ msgstr "Nome a Exibir"
+
+#~ msgid "ID"
+#~ msgstr "ID"
+
+#~ msgid "Last Modified on"
+#~ msgstr "Modific. pela última vez em"
diff --git a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
index 5e48100f30..71db1616df 100644
--- a/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
+++ b/website_sale_product_minimal_price/i18n/website_sale_product_minimal_price.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 14.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -13,11 +13,6 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__display_name
-msgid "Display Name"
-msgstr ""
-
#. module: website_sale_product_minimal_price
#. openerp-web
#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_minimal_price.xml:0
@@ -25,16 +20,6 @@ msgstr ""
msgid "From"
msgstr ""
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template__id
-msgid "ID"
-msgstr ""
-
-#. module: website_sale_product_minimal_price
-#: model:ir.model.fields,field_description:website_sale_product_minimal_price.field_product_template____last_update
-msgid "Last Modified on"
-msgstr ""
-
#. module: website_sale_product_minimal_price
#. openerp-web
#: code:addons/website_sale_product_minimal_price/static/src/xml/website_sale_product_price_scale.xml:0
diff --git a/website_sale_product_minimal_price/models/product_template.py b/website_sale_product_minimal_price/models/product_template.py
index 55f689293a..c85ed7a954 100644
--- a/website_sale_product_minimal_price/models/product_template.py
+++ b/website_sale_product_minimal_price/models/product_template.py
@@ -50,7 +50,6 @@ def _get_cheapest_info(self, pricelist):
"""Helper method for getting the variant with lowest price."""
# TODO: Cache this method for getting better performance
self.ensure_one()
- context = dict(self.env.context, pricelist=pricelist.id)
min_price = 99999999
product_id = False
add_qty = 0
@@ -72,8 +71,9 @@ def _get_cheapest_info(self, pricelist):
products |= variants_extra_price
for product in products:
for qty in [1, 99999999]:
- context = dict(context, quantity=qty)
- product_price = product.with_context(context).price
+ product_price = product.with_context(
+ quantity=qty, pricelist=pricelist.id
+ ).price
if product_price != min_price and min_price != 99999999:
# Mark if there are different prices iterating over
# variants and comparing qty 1 and maximum qty
diff --git a/website_sale_product_minimal_price/readme/CONFIGURE.rst b/website_sale_product_minimal_price/readme/CONFIGURE.rst
index e8d2aabc0d..d30a9630e5 100644
--- a/website_sale_product_minimal_price/readme/CONFIGURE.rst
+++ b/website_sale_product_minimal_price/readme/CONFIGURE.rst
@@ -1,2 +1,2 @@
-#. Go to *Settings > General Settings > Website* and active the option *Multiple Sales
- Prices per Product* with the second option, for use the pricelists.
+#. Go to *Website > Configuration > Settings > Pricing > Pricelist* and active the option *Multiple
+ Prices per Product*, for use the pricelists.
diff --git a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
index a237df2186..1d6ad429a6 100644
--- a/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
+++ b/website_sale_product_minimal_price/readme/CONTRIBUTORS.rst
@@ -3,3 +3,4 @@
* Sergio Teruel
* Carlos Roca
* Pedro M. Baeza
+ * Pilar Vargas
diff --git a/website_sale_product_minimal_price/static/description/index.html b/website_sale_product_minimal_price/static/description/index.html
index 2c1101a0a0..6810c3002f 100644
--- a/website_sale_product_minimal_price/static/description/index.html
+++ b/website_sale_product_minimal_price/static/description/index.html
@@ -1,20 +1,20 @@
-
+
-
+
Website Sale Product Minimal Price