From b81b0951965b5d7200f05a7b6e1a0717a7005bc6 Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Wed, 23 Sep 2020 16:18:11 -0400
Subject: [PATCH 001/173] [ADD] website_sale_stock_provisioning_date: new
module.
Show the future provisioning date closest to the current date
for a product in the eCommerce.
---
.../README.rst | 101 ++++
.../__init__.py | 2 +
.../__manifest__.py | 21 +
.../i18n/es.po | 55 +++
.../website_sale_stock_provisioning_date.pot | 44 ++
.../models/__init__.py | 3 +
.../models/product_product.py | 23 +
.../models/product_template.py | 41 ++
.../readme/CONTRIBUTORS.rst | 5 +
.../readme/DESCRIPTION.rst | 4 +
.../readme/USAGE.rst | 17 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 447 ++++++++++++++++++
.../website_sale_stock_provisioning_date.js | 15 +
...bsite_sale_stock_provisioning_date_tour.js | 39 ++
...ebsite_sale_stock_product_availability.xml | 16 +
.../tests/__init__.py | 2 +
...st_website_sale_stock_provisioning_date.py | 51 ++
.../views/assets.xml | 13 +
.../views/product_template_views.xml | 14 +
20 files changed, 913 insertions(+)
create mode 100644 website_sale_stock_provisioning_date/README.rst
create mode 100644 website_sale_stock_provisioning_date/__init__.py
create mode 100644 website_sale_stock_provisioning_date/__manifest__.py
create mode 100644 website_sale_stock_provisioning_date/i18n/es.po
create mode 100644 website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
create mode 100644 website_sale_stock_provisioning_date/models/__init__.py
create mode 100644 website_sale_stock_provisioning_date/models/product_product.py
create mode 100644 website_sale_stock_provisioning_date/models/product_template.py
create mode 100644 website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst
create mode 100644 website_sale_stock_provisioning_date/readme/DESCRIPTION.rst
create mode 100644 website_sale_stock_provisioning_date/readme/USAGE.rst
create mode 100644 website_sale_stock_provisioning_date/static/description/icon.png
create mode 100644 website_sale_stock_provisioning_date/static/description/index.html
create mode 100644 website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
create mode 100644 website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
create mode 100644 website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
create mode 100644 website_sale_stock_provisioning_date/tests/__init__.py
create mode 100644 website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py
create mode 100644 website_sale_stock_provisioning_date/views/assets.xml
create mode 100644 website_sale_stock_provisioning_date/views/product_template_views.xml
diff --git a/website_sale_stock_provisioning_date/README.rst b/website_sale_stock_provisioning_date/README.rst
new file mode 100644
index 0000000000..f90bab17af
--- /dev/null
+++ b/website_sale_stock_provisioning_date/README.rst
@@ -0,0 +1,101 @@
+====================================
+Website Sale Stock Provisioning Date
+====================================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! 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/12.0/website_sale_stock_provisioning_date
+ :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_stock_provisioning_date
+ :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
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module extends the functionality of website to show you the
+future provisioning date closest to the current date for a product
+in the eCommerce.
+
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To use this module, you need to:
+
+#. Go to *Sales > Products > Products*, create a new product or edit an
+ existing one.
+#. Check 'Show Next Provisioning Date' field under eCommerce tab.
+#. Go to Website Shop.
+#. Click on a product that have 'Show Next Provisioning Date' checked.
+#. If it is true for that product that
+ `'quantity on hand' - 'outgoing quantity' <= 0`,
+ then you will see the future provisioning date closest to
+ the current date for this product under the 'Add to Cart' button
+ (If there is such a date).
+
+Note: The closest future provisioning date is the date of the future
+stock movement and the closest to the current date. This can be
+generated after confirming a purchase order to receive the product on
+a date after the current date.
+
+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 `_:
+
+ * Ernesto Tejeda
+ * Pedro M. Baeza
+ * 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_stock_provisioning_date/__init__.py b/website_sale_stock_provisioning_date/__init__.py
new file mode 100644
index 0000000000..3275ac2adf
--- /dev/null
+++ b/website_sale_stock_provisioning_date/__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_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py
new file mode 100644
index 0000000000..1404b23d34
--- /dev/null
+++ b/website_sale_stock_provisioning_date/__manifest__.py
@@ -0,0 +1,21 @@
+# Copyright 2020 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+ 'name': 'Website Sale Stock Provisioning Date',
+ 'summary': 'Display provisioning date for a product in shop online',
+ 'version': '12.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_stock',
+ ],
+ 'data': [
+ 'views/assets.xml',
+ 'views/product_template_views.xml',
+ ],
+}
diff --git a/website_sale_stock_provisioning_date/i18n/es.po b/website_sale_stock_provisioning_date/i18n/es.po
new file mode 100644
index 0000000000..ef2bb4b338
--- /dev/null
+++ b/website_sale_stock_provisioning_date/i18n/es.po
@@ -0,0 +1,55 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_stock_provisioning_date
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-09-23 20:14+0000\n"
+"PO-Revision-Date: 2020-09-23 16:17-0400\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: \n"
+"X-Generator: Poedit 2.0.6\n"
+
+#. module: website_sale_stock_provisioning_date
+#. openerp-web
+#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:10
+#, python-format
+msgid "Next provisioning date:"
+msgstr "Fecha de aprovisionamiento:"
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_product
+msgid "Product"
+msgstr "Producto"
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_template
+msgid "Product Template"
+msgstr "Plantilla de producto"
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date
+msgid "Show Next Provisioning Date"
+msgstr "Mostrar fecha de aprovisionamiento"
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date
+#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date
+msgid ""
+"Shows the next provisioning date in the website shop if the product is out "
+"of stock. This option may not make sense if you don't select an "
+"'Availability' option that shows the inventory of the product in the website "
+"shop."
+msgstr ""
+"Muestra en la tienda online la fecha de aprovisionamiento prevista si el "
+"producto está sin existencias. Esta opción puede no tener sentido si usted "
+"no selecciona una opción de disponibilidad que muestre el inventario del "
+"producto en la tienda online."
diff --git a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
new file mode 100644
index 0000000000..53e5ae50f9
--- /dev/null
+++ b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
@@ -0,0 +1,44 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * website_sale_stock_provisioning_date
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.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_stock_provisioning_date
+#. openerp-web
+#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:10
+#, python-format
+msgid "Next provisioning date:"
+msgstr ""
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_product
+msgid "Product"
+msgstr ""
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model,name:website_sale_stock_provisioning_date.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date
+msgid "Show Next Provisioning Date"
+msgstr ""
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date
+#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date
+msgid "Shows the next provisioning date in the website shop if the product is out of stock. This option may not make sense if you don't select an 'Availability' option that shows the inventory of the product in the website shop."
+msgstr ""
+
diff --git a/website_sale_stock_provisioning_date/models/__init__.py b/website_sale_stock_provisioning_date/models/__init__.py
new file mode 100644
index 0000000000..4218bd2646
--- /dev/null
+++ b/website_sale_stock_provisioning_date/models/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import product_product
+from . import product_template
diff --git a/website_sale_stock_provisioning_date/models/product_product.py b/website_sale_stock_provisioning_date/models/product_product.py
new file mode 100644
index 0000000000..24f9a834cb
--- /dev/null
+++ b/website_sale_stock_provisioning_date/models/product_product.py
@@ -0,0 +1,23 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import fields, models
+
+
+class ProductProduct(models.Model):
+ _inherit = 'product.product'
+
+ def _get_next_provisioning_date(self):
+ domain = [
+ ("company_id", "=", self.env.user.company_id.id),
+ ("product_id", "in", self.ids),
+ ("state", "not in", ["draft", "done", "cancel"]),
+ ("location_id.usage", "=", "supplier"),
+ ("location_dest_id.usage", "=", "internal"),
+ ("date_expected", ">=", fields.Datetime.now()),
+ ]
+ move = (
+ self.env["stock.move"]
+ .sudo()
+ .search(domain, order="date_expected", limit=1)
+ )
+ return move and move.date_expected.date() or False
diff --git a/website_sale_stock_provisioning_date/models/product_template.py b/website_sale_stock_provisioning_date/models/product_template.py
new file mode 100644
index 0000000000..5f5adbc955
--- /dev/null
+++ b/website_sale_stock_provisioning_date/models/product_template.py
@@ -0,0 +1,41 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import api, fields, models
+
+
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
+ show_next_provisioning_date = fields.Boolean(
+ help="Shows the next provisioning date in the website shop "
+ "if the product is out of stock. This option may not make "
+ "sense if you don't select an 'Availability' option that "
+ "shows the inventory of the product in the website shop."
+ )
+
+ def _get_next_provisioning_date(self):
+ return self.product_variant_ids._get_next_provisioning_date()
+
+ @api.multi
+ def _get_combination_info(self, combination=False, product_id=False,
+ add_qty=1, pricelist=False,
+ parent_combination=False, only_template=False):
+ 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 combination_info['product_id']:
+ product = self.env['product.product'].sudo().browse(
+ combination_info['product_id'])
+ else:
+ product = self.sudo()
+ provisioning_date = False
+ if (product.show_next_provisioning_date
+ and product.qty_available - product.outgoing_qty <= 0):
+ provisioning_date = product._get_next_provisioning_date()
+ combination_info.update(provisioning_date=provisioning_date)
+ return combination_info
diff --git a/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst b/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..0c71102569
--- /dev/null
+++ b/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst
@@ -0,0 +1,5 @@
+* `Tecnativa `_:
+
+ * Ernesto Tejeda
+ * Pedro M. Baeza
+ * Sergio Teruel
diff --git a/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst b/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..6e0e80d192
--- /dev/null
+++ b/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst
@@ -0,0 +1,4 @@
+This module extends the functionality of website to show you the
+future provisioning date closest to the current date for a product
+in the eCommerce.
+
diff --git a/website_sale_stock_provisioning_date/readme/USAGE.rst b/website_sale_stock_provisioning_date/readme/USAGE.rst
new file mode 100644
index 0000000000..ba38632717
--- /dev/null
+++ b/website_sale_stock_provisioning_date/readme/USAGE.rst
@@ -0,0 +1,17 @@
+To use this module, you need to:
+
+#. Go to *Sales > Products > Products*, create a new product or edit an
+ existing one.
+#. Check 'Show Next Provisioning Date' field under eCommerce tab.
+#. Go to Website Shop.
+#. Click on a product that have 'Show Next Provisioning Date' checked.
+#. If it is true for that product that
+ `'quantity on hand' - 'outgoing quantity' <= 0`,
+ then you will see the future provisioning date closest to
+ the current date for this product under the 'Add to Cart' button
+ (If there is such a date).
+
+Note: The closest future provisioning date is the date of the future
+stock movement and the closest to the current date. This can be
+generated after confirming a purchase order to receive the product on
+a date after the current date.
diff --git a/website_sale_stock_provisioning_date/static/description/icon.png b/website_sale_stock_provisioning_date/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_stock_provisioning_date/static/description/index.html b/website_sale_stock_provisioning_date/static/description/index.html
new file mode 100644
index 0000000000..8275f9e2c9
--- /dev/null
+++ b/website_sale_stock_provisioning_date/static/description/index.html
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+Website Sale Stock Provisioning Date
+
+
+
+
+
Website Sale Stock Provisioning Date
+
+
+

+
This module extends the functionality of website to show you the
+future provisioning date closest to the current date for a product
+in the eCommerce.
+
Table of contents
+
+
+
+
To use this module, you need to:
+
+- Go to Sales > Products > Products, create a new product or edit an
+existing one.
+- Check ‘Show Next Provisioning Date’ field under eCommerce tab.
+- Go to Website Shop.
+- Click on a product that have ‘Show Next Provisioning Date’ checked.
+- If it is true for that product that
+‘quantity on hand’ - ‘outgoing quantity’ <= 0,
+then you will see the future provisioning date closest to
+the current date for this product under the ‘Add to Cart’ button
+(If there is such a date).
+
+
Note: The closest future provisioning date is the date of the future
+stock movement and the closest to the current date. This can be
+generated after confirming a purchase order to receive the product on
+a date after the current date.
+
+
+
+
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.
+
+
+
+
+
+
+
+- Tecnativa:
+- Ernesto Tejeda
+- Pedro M. Baeza
+- Sergio Teruel
+
+
+
+
+
+
+
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_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
new file mode 100644
index 0000000000..b5c0c25928
--- /dev/null
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
@@ -0,0 +1,15 @@
+/* Copyright 2020 Tecnativa - Ernesto Tejeda
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+odoo.define('website_sale_stock_provisioning_date.load', function (require) {
+ 'use strict';
+ var ajax = require('web.ajax');
+ var core = require('web.core');
+ var QWeb = core.qweb;
+ var load_xml = ajax.loadXML(
+ '/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml',
+ QWeb
+ );
+ load_xml.then(function() {
+ $('.oe_website_sale').find('input[name="add_qty"]').trigger('change');
+ });
+});
diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
new file mode 100644
index 0000000000..55561944b0
--- /dev/null
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
@@ -0,0 +1,39 @@
+/* Copyright 2020 Tecnativa - Ernesto Tejeda
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+odoo.define("website_sale_stock_provisioning_date.tour", function (require) {
+ "use strict";
+
+ var tour = require("web_tour.tour");
+ var base = require("web_editor.base");
+
+ var steps = [
+ {
+ content: "search provisioning date",
+ trigger: 'form input[name="search"]',
+ run: "text provisioning date",
+ },
+ {
+ content: "search provisioning date",
+ trigger: 'form:has(input[name="search"]) .oe_search_button',
+ },
+ {
+ content: "click on product test",
+ trigger: '.oe_product_cart a:contains("provisioning date")',
+ },
+ {
+ trigger: "a#add_to_cart",
+ extra_trigger: ".availability_messages:has(span:contains('Next provisioning date:'))",
+ },
+ ];
+ tour.register("website_sale_stock_provisioning_date",
+ {
+ url: "/shop",
+ test: true,
+ wait_for: base.ready(),
+ },
+ steps
+ );
+ return {
+ steps: steps,
+ };
+});
diff --git a/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
new file mode 100644
index 0000000000..36dc818de2
--- /dev/null
+++ b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ Next provisioning date:
+
+
+
+
+
diff --git a/website_sale_stock_provisioning_date/tests/__init__.py b/website_sale_stock_provisioning_date/tests/__init__.py
new file mode 100644
index 0000000000..871b1f4cdc
--- /dev/null
+++ b/website_sale_stock_provisioning_date/tests/__init__.py
@@ -0,0 +1,2 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import test_website_sale_stock_provisioning_date
diff --git a/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py b/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py
new file mode 100644
index 0000000000..84b7cd1bdf
--- /dev/null
+++ b/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py
@@ -0,0 +1,51 @@
+# Copyright 2020 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from datetime import datetime, timedelta
+from odoo.tests.common import Form, HttpCase
+
+
+class WebsiteSaleStockProvisioningDate(HttpCase):
+
+ def setUp(self):
+ super().setUp()
+ product = self.env['product.product'].create({
+ 'name': 'product test - provisioning date',
+ 'type': 'product',
+ 'website_published': True,
+ 'show_next_provisioning_date': True,
+ })
+ incoming_picking_type = self.env['stock.picking.type'].search(
+ [
+ ('code', '=', 'incoming'),
+ '|',
+ ('warehouse_id.company_id', '=', self.env.user.company_id.id),
+ ('warehouse_id', '=', False)
+ ],
+ limit=1,
+ )
+ picking_form = Form(
+ recordp=self.env['stock.picking'].with_context(
+ default_picking_type_id=incoming_picking_type.id),
+ view="stock.view_picking_form",
+ )
+ with picking_form.move_ids_without_package.new() as move:
+ move.product_id = product
+ move.product_uom_qty = 10
+ picking = picking_form.save()
+ picking_form = Form(picking)
+ picking_form.scheduled_date = datetime.now() + timedelta(days=2)
+ picking = picking_form.save()
+ picking.action_confirm()
+
+ def test_ui_website(self):
+ """Test frontend tour."""
+ tour = (
+ "odoo.__DEBUG__.services['web_tour.tour']",
+ "website_sale_stock_provisioning_date",
+ )
+ self.browser_js(
+ url_path="/shop",
+ code="%s.run('%s')" % tour,
+ ready="%s.tours['%s'].ready" % tour,
+ login="admin"
+ )
diff --git a/website_sale_stock_provisioning_date/views/assets.xml b/website_sale_stock_provisioning_date/views/assets.xml
new file mode 100644
index 0000000000..4ad4cd6ac7
--- /dev/null
+++ b/website_sale_stock_provisioning_date/views/assets.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/website_sale_stock_provisioning_date/views/product_template_views.xml b/website_sale_stock_provisioning_date/views/product_template_views.xml
new file mode 100644
index 0000000000..cbd34af472
--- /dev/null
+++ b/website_sale_stock_provisioning_date/views/product_template_views.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ product.template
+
+
+
+
+
+
+
+
From 3958173e3f64f2ea48706064ecc9ee878e561477 Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Thu, 8 Apr 2021 12:29:31 -0400
Subject: [PATCH 002/173] [IMP] website_sale_stock_provisioning_date: black,
isort, prettier
---
.../__manifest__.py | 29 +++++++--------
.../models/product_product.py | 6 ++--
.../models/product_template.py | 35 ++++++++++++-------
.../readme/DESCRIPTION.rst | 1 -
.../website_sale_stock_provisioning_date.js | 16 +++++----
...bsite_sale_stock_provisioning_date_tour.js | 8 +++--
...ebsite_sale_stock_product_availability.xml | 12 +++++--
...st_website_sale_stock_provisioning_date.py | 33 +++++++++--------
.../views/assets.xml | 14 +++++---
.../views/product_template_views.xml | 9 +++--
10 files changed, 93 insertions(+), 70 deletions(-)
diff --git a/website_sale_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py
index 1404b23d34..c75887dead 100644
--- a/website_sale_stock_provisioning_date/__manifest__.py
+++ b/website_sale_stock_provisioning_date/__manifest__.py
@@ -1,21 +1,16 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
- 'name': 'Website Sale Stock Provisioning Date',
- 'summary': 'Display provisioning date for a product in shop online',
- 'version': '12.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_stock',
- ],
- 'data': [
- 'views/assets.xml',
- 'views/product_template_views.xml',
- ],
+ "name": "Website Sale Stock Provisioning Date",
+ "summary": "Display provisioning date for a product in shop online",
+ "version": "12.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_stock",],
+ "data": ["views/assets.xml", "views/product_template_views.xml",],
}
diff --git a/website_sale_stock_provisioning_date/models/product_product.py b/website_sale_stock_provisioning_date/models/product_product.py
index 24f9a834cb..8a0d88d493 100644
--- a/website_sale_stock_provisioning_date/models/product_product.py
+++ b/website_sale_stock_provisioning_date/models/product_product.py
@@ -4,7 +4,7 @@
class ProductProduct(models.Model):
- _inherit = 'product.product'
+ _inherit = "product.product"
def _get_next_provisioning_date(self):
domain = [
@@ -16,8 +16,6 @@ def _get_next_provisioning_date(self):
("date_expected", ">=", fields.Datetime.now()),
]
move = (
- self.env["stock.move"]
- .sudo()
- .search(domain, order="date_expected", limit=1)
+ self.env["stock.move"].sudo().search(domain, order="date_expected", limit=1)
)
return move and move.date_expected.date() or False
diff --git a/website_sale_stock_provisioning_date/models/product_template.py b/website_sale_stock_provisioning_date/models/product_template.py
index 5f5adbc955..0d19816ba8 100644
--- a/website_sale_stock_provisioning_date/models/product_template.py
+++ b/website_sale_stock_provisioning_date/models/product_template.py
@@ -4,22 +4,28 @@
class ProductTemplate(models.Model):
- _inherit = 'product.template'
+ _inherit = "product.template"
show_next_provisioning_date = fields.Boolean(
help="Shows the next provisioning date in the website shop "
- "if the product is out of stock. This option may not make "
- "sense if you don't select an 'Availability' option that "
- "shows the inventory of the product in the website shop."
+ "if the product is out of stock. This option may not make "
+ "sense if you don't select an 'Availability' option that "
+ "shows the inventory of the product in the website shop."
)
def _get_next_provisioning_date(self):
return self.product_variant_ids._get_next_provisioning_date()
@api.multi
- def _get_combination_info(self, combination=False, product_id=False,
- add_qty=1, pricelist=False,
- parent_combination=False, only_template=False):
+ def _get_combination_info(
+ self,
+ combination=False,
+ product_id=False,
+ add_qty=1,
+ pricelist=False,
+ parent_combination=False,
+ only_template=False,
+ ):
combination_info = super()._get_combination_info(
combination=combination,
product_id=product_id,
@@ -28,14 +34,19 @@ def _get_combination_info(self, combination=False, product_id=False,
parent_combination=parent_combination,
only_template=only_template,
)
- if combination_info['product_id']:
- product = self.env['product.product'].sudo().browse(
- combination_info['product_id'])
+ if combination_info["product_id"]:
+ product = (
+ self.env["product.product"]
+ .sudo()
+ .browse(combination_info["product_id"])
+ )
else:
product = self.sudo()
provisioning_date = False
- if (product.show_next_provisioning_date
- and product.qty_available - product.outgoing_qty <= 0):
+ if (
+ product.show_next_provisioning_date
+ and product.qty_available - product.outgoing_qty <= 0
+ ):
provisioning_date = product._get_next_provisioning_date()
combination_info.update(provisioning_date=provisioning_date)
return combination_info
diff --git a/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst b/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst
index 6e0e80d192..d4f76b6486 100644
--- a/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst
+++ b/website_sale_stock_provisioning_date/readme/DESCRIPTION.rst
@@ -1,4 +1,3 @@
This module extends the functionality of website to show you the
future provisioning date closest to the current date for a product
in the eCommerce.
-
diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
index b5c0c25928..258790e4bf 100644
--- a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
@@ -1,15 +1,17 @@
/* Copyright 2020 Tecnativa - Ernesto Tejeda
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define('website_sale_stock_provisioning_date.load', function (require) {
- 'use strict';
- var ajax = require('web.ajax');
- var core = require('web.core');
+odoo.define("website_sale_stock_provisioning_date.load", function(require) {
+ "use strict";
+ var ajax = require("web.ajax");
+ var core = require("web.core");
var QWeb = core.qweb;
var load_xml = ajax.loadXML(
- '/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml',
- QWeb
+ "/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml",
+ QWeb
);
load_xml.then(function() {
- $('.oe_website_sale').find('input[name="add_qty"]').trigger('change');
+ $(".oe_website_sale")
+ .find('input[name="add_qty"]')
+ .trigger("change");
});
});
diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
index 55561944b0..8a5b5030e0 100644
--- a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
@@ -1,6 +1,6 @@
/* Copyright 2020 Tecnativa - Ernesto Tejeda
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define("website_sale_stock_provisioning_date.tour", function (require) {
+odoo.define("website_sale_stock_provisioning_date.tour", function(require) {
"use strict";
var tour = require("web_tour.tour");
@@ -22,10 +22,12 @@ odoo.define("website_sale_stock_provisioning_date.tour", function (require) {
},
{
trigger: "a#add_to_cart",
- extra_trigger: ".availability_messages:has(span:contains('Next provisioning date:'))",
+ extra_trigger:
+ ".availability_messages:has(span:contains('Next provisioning date:'))",
},
];
- tour.register("website_sale_stock_provisioning_date",
+ tour.register(
+ "website_sale_stock_provisioning_date",
{
url: "/shop",
test: true,
diff --git a/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
index 36dc818de2..ec6dce8573 100644
--- a/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
+++ b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
@@ -1,12 +1,18 @@
-
+
-
+
-
+
Next provisioning date:
diff --git a/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py b/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py
index 84b7cd1bdf..1ca258bd06 100644
--- a/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py
+++ b/website_sale_stock_provisioning_date/tests/test_website_sale_stock_provisioning_date.py
@@ -1,31 +1,34 @@
# Copyright 2020 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from datetime import datetime, timedelta
+
from odoo.tests.common import Form, HttpCase
class WebsiteSaleStockProvisioningDate(HttpCase):
-
def setUp(self):
super().setUp()
- product = self.env['product.product'].create({
- 'name': 'product test - provisioning date',
- 'type': 'product',
- 'website_published': True,
- 'show_next_provisioning_date': True,
- })
- incoming_picking_type = self.env['stock.picking.type'].search(
+ product = self.env["product.product"].create(
+ {
+ "name": "product test - provisioning date",
+ "type": "product",
+ "website_published": True,
+ "show_next_provisioning_date": True,
+ }
+ )
+ incoming_picking_type = self.env["stock.picking.type"].search(
[
- ('code', '=', 'incoming'),
- '|',
- ('warehouse_id.company_id', '=', self.env.user.company_id.id),
- ('warehouse_id', '=', False)
+ ("code", "=", "incoming"),
+ "|",
+ ("warehouse_id.company_id", "=", self.env.user.company_id.id),
+ ("warehouse_id", "=", False),
],
limit=1,
)
picking_form = Form(
- recordp=self.env['stock.picking'].with_context(
- default_picking_type_id=incoming_picking_type.id),
+ recordp=self.env["stock.picking"].with_context(
+ default_picking_type_id=incoming_picking_type.id
+ ),
view="stock.view_picking_form",
)
with picking_form.move_ids_without_package.new() as move:
@@ -47,5 +50,5 @@ def test_ui_website(self):
url_path="/shop",
code="%s.run('%s')" % tour,
ready="%s.tours['%s'].ready" % tour,
- login="admin"
+ login="admin",
)
diff --git a/website_sale_stock_provisioning_date/views/assets.xml b/website_sale_stock_provisioning_date/views/assets.xml
index 4ad4cd6ac7..135e69c271 100644
--- a/website_sale_stock_provisioning_date/views/assets.xml
+++ b/website_sale_stock_provisioning_date/views/assets.xml
@@ -1,13 +1,17 @@
-
+
-
-
+
+
diff --git a/website_sale_stock_provisioning_date/views/product_template_views.xml b/website_sale_stock_provisioning_date/views/product_template_views.xml
index cbd34af472..fc854e7e32 100644
--- a/website_sale_stock_provisioning_date/views/product_template_views.xml
+++ b/website_sale_stock_provisioning_date/views/product_template_views.xml
@@ -1,13 +1,16 @@
-
+
product.template
-
+
-
+
From 21d5d135a4c6a54b337d2ec7218c26bd7b41f81e Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Thu, 8 Apr 2021 12:31:50 -0400
Subject: [PATCH 003/173] [MIG] website_sale_stock_provisioning_date: Migration
to 13.0
---
website_sale_stock_provisioning_date/README.rst | 11 +++++------
.../__manifest__.py | 6 +++---
website_sale_stock_provisioning_date/i18n/es.po | 2 +-
.../i18n/website_sale_stock_provisioning_date.pot | 15 +++++++++------
.../models/product_product.py | 4 ++--
.../models/product_template.py | 11 ++++++-----
.../static/description/index.html | 6 +++---
7 files changed, 29 insertions(+), 26 deletions(-)
diff --git a/website_sale_stock_provisioning_date/README.rst b/website_sale_stock_provisioning_date/README.rst
index f90bab17af..3e073ed0e7 100644
--- a/website_sale_stock_provisioning_date/README.rst
+++ b/website_sale_stock_provisioning_date/README.rst
@@ -14,13 +14,13 @@ Website Sale Stock Provisioning Date
: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_stock_provisioning_date
+ :target: https://github.com/OCA/e-commerce/tree/13.0/website_sale_stock_provisioning_date
: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_stock_provisioning_date
+ :target: https://translation.odoo-community.org/projects/e-commerce-13-0/e-commerce-13-0-website_sale_stock_provisioning_date
: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|
@@ -29,7 +29,6 @@ This module extends the functionality of website to show you the
future provisioning date closest to the current date for a product
in the eCommerce.
-
**Table of contents**
.. contents::
@@ -62,7 +61,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.
@@ -96,6 +95,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/e-commerce `_ project on GitHub.
+This module is part of the `OCA/e-commerce `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py
index c75887dead..f43e167177 100644
--- a/website_sale_stock_provisioning_date/__manifest__.py
+++ b/website_sale_stock_provisioning_date/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Stock Provisioning Date",
"summary": "Display provisioning date for a product in shop online",
- "version": "12.0.1.0.0",
+ "version": "13.0.1.0.0",
"development_status": "Beta",
"category": "Website",
"website": "https://github.com/OCA/e-commerce",
@@ -11,6 +11,6 @@
"license": "AGPL-3",
"application": False,
"installable": True,
- "depends": ["website_sale_stock",],
- "data": ["views/assets.xml", "views/product_template_views.xml",],
+ "depends": ["website_sale_stock"],
+ "data": ["views/assets.xml", "views/product_template_views.xml"],
}
diff --git a/website_sale_stock_provisioning_date/i18n/es.po b/website_sale_stock_provisioning_date/i18n/es.po
index ef2bb4b338..d422a1dda6 100644
--- a/website_sale_stock_provisioning_date/i18n/es.po
+++ b/website_sale_stock_provisioning_date/i18n/es.po
@@ -19,7 +19,7 @@ msgstr ""
#. module: website_sale_stock_provisioning_date
#. openerp-web
-#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:10
+#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:0
#, python-format
msgid "Next provisioning date:"
msgstr "Fecha de aprovisionamiento:"
diff --git a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
index 53e5ae50f9..c603fc0b97 100644
--- a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
+++ b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
@@ -1,12 +1,12 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * website_sale_stock_provisioning_date
+# * website_sale_stock_provisioning_date
#
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"
@@ -15,7 +15,7 @@ msgstr ""
#. module: website_sale_stock_provisioning_date
#. openerp-web
-#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:10
+#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:0
#, python-format
msgid "Next provisioning date:"
msgstr ""
@@ -39,6 +39,9 @@ msgstr ""
#. module: website_sale_stock_provisioning_date
#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_product__show_next_provisioning_date
#: model:ir.model.fields,help:website_sale_stock_provisioning_date.field_product_template__show_next_provisioning_date
-msgid "Shows the next provisioning date in the website shop if the product is out of stock. This option may not make sense if you don't select an 'Availability' option that shows the inventory of the product in the website shop."
+msgid ""
+"Shows the next provisioning date in the website shop if the product is out "
+"of stock. This option may not make sense if you don't select an "
+"'Availability' option that shows the inventory of the product in the website"
+" shop."
msgstr ""
-
diff --git a/website_sale_stock_provisioning_date/models/product_product.py b/website_sale_stock_provisioning_date/models/product_product.py
index 8a0d88d493..e5a0fa6208 100644
--- a/website_sale_stock_provisioning_date/models/product_product.py
+++ b/website_sale_stock_provisioning_date/models/product_product.py
@@ -6,9 +6,9 @@
class ProductProduct(models.Model):
_inherit = "product.product"
- def _get_next_provisioning_date(self):
+ def _get_next_provisioning_date(self, company):
domain = [
- ("company_id", "=", self.env.user.company_id.id),
+ ("company_id", "=", company.id),
("product_id", "in", self.ids),
("state", "not in", ["draft", "done", "cancel"]),
("location_id.usage", "=", "supplier"),
diff --git a/website_sale_stock_provisioning_date/models/product_template.py b/website_sale_stock_provisioning_date/models/product_template.py
index 0d19816ba8..2ae274275c 100644
--- a/website_sale_stock_provisioning_date/models/product_template.py
+++ b/website_sale_stock_provisioning_date/models/product_template.py
@@ -1,6 +1,6 @@
# Copyright 2019 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import api, fields, models
+from odoo import fields, models
class ProductTemplate(models.Model):
@@ -13,10 +13,9 @@ class ProductTemplate(models.Model):
"shows the inventory of the product in the website shop."
)
- def _get_next_provisioning_date(self):
- return self.product_variant_ids._get_next_provisioning_date()
+ def _get_next_provisioning_date(self, company):
+ return self.product_variant_ids._get_next_provisioning_date(company)
- @api.multi
def _get_combination_info(
self,
combination=False,
@@ -47,6 +46,8 @@ def _get_combination_info(
product.show_next_provisioning_date
and product.qty_available - product.outgoing_qty <= 0
):
- provisioning_date = product._get_next_provisioning_date()
+ website_id = self.env.context.get("website_id")
+ company = self.env["website"].browse(website_id).company_id
+ provisioning_date = product._get_next_provisioning_date(company)
combination_info.update(provisioning_date=provisioning_date)
return combination_info
diff --git a/website_sale_stock_provisioning_date/static/description/index.html b/website_sale_stock_provisioning_date/static/description/index.html
index 8275f9e2c9..dbccbafeb4 100644
--- a/website_sale_stock_provisioning_date/static/description/index.html
+++ b/website_sale_stock_provisioning_date/static/description/index.html
@@ -367,7 +367,7 @@ Website Sale Stock Provisioning Date
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of website to show you the
future provisioning date closest to the current date for a product
in the eCommerce.
@@ -409,7 +409,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.
@@ -438,7 +438,7 @@
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/e-commerce project on GitHub.
+
This module is part of the OCA/e-commerce project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
From 3bd2b2a59f1c00bbd2da199b86e3adffa9ca1118 Mon Sep 17 00:00:00 2001
From: miguels73 <55379877+miguels73@users.noreply.github.com>
Date: Tue, 27 Jul 2021 12:17:54 +0200
Subject: [PATCH 004/173] [IMP] website_sale_stock_provisioning_date: black,
isort, prettier
---
.../static/src/js/website_sale_stock_provisioning_date.js | 8 +++-----
.../src/js/website_sale_stock_provisioning_date_tour.js | 2 +-
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
index 258790e4bf..7200086051 100644
--- a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date.js
@@ -1,6 +1,6 @@
/* Copyright 2020 Tecnativa - Ernesto Tejeda
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define("website_sale_stock_provisioning_date.load", function(require) {
+odoo.define("website_sale_stock_provisioning_date.load", function (require) {
"use strict";
var ajax = require("web.ajax");
var core = require("web.core");
@@ -9,9 +9,7 @@ odoo.define("website_sale_stock_provisioning_date.load", function(require) {
"/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml",
QWeb
);
- load_xml.then(function() {
- $(".oe_website_sale")
- .find('input[name="add_qty"]')
- .trigger("change");
+ load_xml.then(function () {
+ $(".oe_website_sale").find('input[name="add_qty"]').trigger("change");
});
});
diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
index 8a5b5030e0..8cf5f071be 100644
--- a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.js
@@ -1,6 +1,6 @@
/* Copyright 2020 Tecnativa - Ernesto Tejeda
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
-odoo.define("website_sale_stock_provisioning_date.tour", function(require) {
+odoo.define("website_sale_stock_provisioning_date.tour", function (require) {
"use strict";
var tour = require("web_tour.tour");
From eae0e1acfe426b2c3531b1666943e2e360a5c4de Mon Sep 17 00:00:00 2001
From: miguels73 <55379877+miguels73@users.noreply.github.com>
Date: Tue, 27 Jul 2021 12:18:10 +0200
Subject: [PATCH 005/173] [MIG][14.0] website_sale_stock_provisioning_date:
Migration to 14.0
---
website_sale_stock_provisioning_date/__manifest__.py | 2 +-
.../models/product_product.py | 8 +++-----
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/website_sale_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py
index f43e167177..6d31afeb1a 100644
--- a/website_sale_stock_provisioning_date/__manifest__.py
+++ b/website_sale_stock_provisioning_date/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Stock Provisioning Date",
"summary": "Display provisioning date for a product in shop online",
- "version": "13.0.1.0.0",
+ "version": "14.0.1.0.0",
"development_status": "Beta",
"category": "Website",
"website": "https://github.com/OCA/e-commerce",
diff --git a/website_sale_stock_provisioning_date/models/product_product.py b/website_sale_stock_provisioning_date/models/product_product.py
index e5a0fa6208..64e0495972 100644
--- a/website_sale_stock_provisioning_date/models/product_product.py
+++ b/website_sale_stock_provisioning_date/models/product_product.py
@@ -13,9 +13,7 @@ def _get_next_provisioning_date(self, company):
("state", "not in", ["draft", "done", "cancel"]),
("location_id.usage", "=", "supplier"),
("location_dest_id.usage", "=", "internal"),
- ("date_expected", ">=", fields.Datetime.now()),
+ ("date", ">=", fields.Datetime.now()),
]
- move = (
- self.env["stock.move"].sudo().search(domain, order="date_expected", limit=1)
- )
- return move and move.date_expected.date() or False
+ move = self.env["stock.move"].sudo().search(domain, order="date", limit=1)
+ return move and move.date.date() or False
From 391d7cb2ceb431439155ac5ebb7d87c901c8ddf9 Mon Sep 17 00:00:00 2001
From: miguels73 <55379877+miguels73@users.noreply.github.com>
Date: Thu, 4 Nov 2021 18:17:40 +0100
Subject: [PATCH 006/173] [IMP] website_sale_stock_provisioning_date: format
date
The provisioning date was always showing in the same format without
respecting the date format defined in the language settings.
It is added in function `_get_combination_info` instead of in function
`_get_next_provisioning_date` so that the date is still formatted even
if function `_get_next_provisioning_date` is inherited.
---
.../README.rst | 10 +++++-----
.../website_sale_stock_provisioning_date.pot | 20 ++++++++++++++++++-
.../models/product_template.py | 2 ++
.../static/description/index.html | 6 +++---
4 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/website_sale_stock_provisioning_date/README.rst b/website_sale_stock_provisioning_date/README.rst
index 3e073ed0e7..559c86f316 100644
--- a/website_sale_stock_provisioning_date/README.rst
+++ b/website_sale_stock_provisioning_date/README.rst
@@ -14,13 +14,13 @@ Website Sale Stock Provisioning Date
: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_stock_provisioning_date
+ :target: https://github.com/OCA/e-commerce/tree/14.0/website_sale_stock_provisioning_date
: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_stock_provisioning_date
+ :target: https://translation.odoo-community.org/projects/e-commerce-14-0/e-commerce-14-0-website_sale_stock_provisioning_date
: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|
@@ -61,7 +61,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.
@@ -95,6 +95,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/e-commerce `_ project on GitHub.
+This module is part of the `OCA/e-commerce `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
index c603fc0b97..129463216d 100644
--- a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
+++ b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.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,24 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__display_name
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__id
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__id
+msgid "ID"
+msgstr ""
+
+#. module: website_sale_stock_provisioning_date
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product____last_update
+#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template____last_update
+msgid "Last Modified on"
+msgstr ""
+
#. module: website_sale_stock_provisioning_date
#. openerp-web
#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:0
diff --git a/website_sale_stock_provisioning_date/models/product_template.py b/website_sale_stock_provisioning_date/models/product_template.py
index 2ae274275c..84c41acd43 100644
--- a/website_sale_stock_provisioning_date/models/product_template.py
+++ b/website_sale_stock_provisioning_date/models/product_template.py
@@ -1,6 +1,7 @@
# Copyright 2019 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo import fields, models
+from odoo.tools.misc import format_date
class ProductTemplate(models.Model):
@@ -49,5 +50,6 @@ def _get_combination_info(
website_id = self.env.context.get("website_id")
company = self.env["website"].browse(website_id).company_id
provisioning_date = product._get_next_provisioning_date(company)
+ provisioning_date = format_date(self.env, provisioning_date)
combination_info.update(provisioning_date=provisioning_date)
return combination_info
diff --git a/website_sale_stock_provisioning_date/static/description/index.html b/website_sale_stock_provisioning_date/static/description/index.html
index dbccbafeb4..fcfcd43e61 100644
--- a/website_sale_stock_provisioning_date/static/description/index.html
+++ b/website_sale_stock_provisioning_date/static/description/index.html
@@ -367,7 +367,7 @@ Website Sale Stock Provisioning Date
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of website to show you the
future provisioning date closest to the current date for a product
in the eCommerce.
@@ -409,7 +409,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.
@@ -438,7 +438,7 @@
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/e-commerce project on GitHub.
+
This module is part of the OCA/e-commerce project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
From 476047b17ed10dd7689bdf6ca96da73f61b4daa8 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Thu, 12 Jan 2023 17:19:12 +0100
Subject: [PATCH 007/173] [MIG] website_sale_stock_provisioning_date: Migration
to 15.0
---
.../README.rst | 28 ++++++------
.../__manifest__.py | 16 +++++--
.../website_sale_stock_provisioning_date.pot | 20 +--------
.../readme/CONTRIBUTORS.rst | 1 +
.../static/description/index.html | 43 ++++++++++---------
...ebsite_sale_stock_product_availability.xml | 2 +-
.../views/assets.xml | 17 --------
.../views/product_template_views.xml | 2 +-
8 files changed, 56 insertions(+), 73 deletions(-)
delete mode 100644 website_sale_stock_provisioning_date/views/assets.xml
diff --git a/website_sale_stock_provisioning_date/README.rst b/website_sale_stock_provisioning_date/README.rst
index 559c86f316..2833115dfa 100644
--- a/website_sale_stock_provisioning_date/README.rst
+++ b/website_sale_stock_provisioning_date/README.rst
@@ -2,28 +2,31 @@
Website Sale Stock Provisioning Date
====================================
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:4d0f7881857f436ace0ad4b0face6a3276c1afcefa6205c18dbd638545113f6b
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-.. |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/14.0/website_sale_stock_provisioning_date
+ :target: https://github.com/OCA/e-commerce/tree/15.0/website_sale_stock_provisioning_date
: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_stock_provisioning_date
+ :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_stock_provisioning_date
: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 to show you the
future provisioning date closest to the current date for a product
@@ -60,8 +63,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.
@@ -81,6 +84,7 @@ Contributors
* Ernesto Tejeda
* Pedro M. Baeza
* Sergio Teruel
+ * Carlos Roca
Maintainers
~~~~~~~~~~~
@@ -95,6 +99,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/e-commerce `_ project on GitHub.
+This module is part of the `OCA/e-commerce `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py
index 6d31afeb1a..c4102aabf2 100644
--- a/website_sale_stock_provisioning_date/__manifest__.py
+++ b/website_sale_stock_provisioning_date/__manifest__.py
@@ -3,8 +3,8 @@
{
"name": "Website Sale Stock Provisioning Date",
"summary": "Display provisioning date for a product in shop online",
- "version": "14.0.1.0.0",
- "development_status": "Beta",
+ "version": "15.0.1.0.0",
+ "development_status": "Production/Stable",
"category": "Website",
"website": "https://github.com/OCA/e-commerce",
"author": "Tecnativa, Odoo Community Association (OCA)",
@@ -12,5 +12,15 @@
"application": False,
"installable": True,
"depends": ["website_sale_stock"],
- "data": ["views/assets.xml", "views/product_template_views.xml"],
+ "data": ["views/product_template_views.xml"],
+ "assets": {
+ "web.assets_frontend": [
+ "/website_sale_stock_provisioning_date/static/src/js/"
+ "website_sale_stock_provisioning_date.js",
+ ],
+ "web.assets_tests": [
+ "/website_sale_stock_provisioning_date/static/src/js/"
+ "website_sale_stock_provisioning_date_tour.js",
+ ],
+ },
}
diff --git a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
index 129463216d..7aafd40681 100644
--- a/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.pot
+++ b/website_sale_stock_provisioning_date/i18n/website_sale_stock_provisioning_date.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,24 +13,6 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
-#. module: website_sale_stock_provisioning_date
-#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__display_name
-#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__display_name
-msgid "Display Name"
-msgstr ""
-
-#. module: website_sale_stock_provisioning_date
-#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product__id
-#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template__id
-msgid "ID"
-msgstr ""
-
-#. module: website_sale_stock_provisioning_date
-#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_product____last_update
-#: model:ir.model.fields,field_description:website_sale_stock_provisioning_date.field_product_template____last_update
-msgid "Last Modified on"
-msgstr ""
-
#. module: website_sale_stock_provisioning_date
#. openerp-web
#: code:addons/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml:0
diff --git a/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst b/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst
index 0c71102569..21e014c788 100644
--- a/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst
+++ b/website_sale_stock_provisioning_date/readme/CONTRIBUTORS.rst
@@ -3,3 +3,4 @@
* Ernesto Tejeda
* Pedro M. Baeza
* Sergio Teruel
+ * Carlos Roca
diff --git a/website_sale_stock_provisioning_date/static/description/index.html b/website_sale_stock_provisioning_date/static/description/index.html
index fcfcd43e61..ff6564496d 100644
--- a/website_sale_stock_provisioning_date/static/description/index.html
+++ b/website_sale_stock_provisioning_date/static/description/index.html
@@ -1,20 +1,20 @@
-
+
-
+
Website Sale Stock Provisioning Date
-
-
Website Sale Stock Provisioning Date
+
+
+
+
+
+
+
Website Sale Stock Provisioning Date
-

+

This module extends the functionality of website to show you the future
provisioning date closest to the current date for a product in the
eCommerce.
@@ -387,7 +392,7 @@
Website Sale Stock Provisioning Date
-
+
To use this module, you need to:
- Go to Sales > Products > Products, create a new product or edit an
@@ -406,7 +411,7 @@
date after the current date.
-
+
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -414,15 +419,15 @@
Do not contact contributors directly about support or help with technical issues.
+
From 39a20e34461e7d2f9499b4ae3b5a2940c1d19e61 Mon Sep 17 00:00:00 2001
From: AlexGarS73
Date: Tue, 10 Mar 2026 17:41:47 +0100
Subject: [PATCH 021/173] [MIG] website_sale_stock_provisioning_date: Migration
to 19.0
---
website_sale_stock_provisioning_date/README.rst | 14 +++++++++-----
.../__manifest__.py | 10 +++-------
.../models/product_template.py | 4 ++--
.../static/description/index.html | 6 +++---
...ebsite_sale_stock_provisioning_date_tour.esm.js | 11 ++++++-----
.../website_sale_stock_product_availability.xml | 2 +-
.../test_website_sale_stock_provisioning_date.py | 2 +-
7 files changed, 25 insertions(+), 24 deletions(-)
diff --git a/website_sale_stock_provisioning_date/README.rst b/website_sale_stock_provisioning_date/README.rst
index 4980b97f4b..7d8860dd84 100644
--- a/website_sale_stock_provisioning_date/README.rst
+++ b/website_sale_stock_provisioning_date/README.rst
@@ -21,13 +21,13 @@ Website Sale Stock Provisioning Date
: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/18.0/website_sale_stock_provisioning_date
+ :target: https://github.com/OCA/e-commerce/tree/19.0/website_sale_stock_provisioning_date
: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-18-0/e-commerce-18-0-website_sale_stock_provisioning_date
+ :target: https://translation.odoo-community.org/projects/e-commerce-19-0/e-commerce-19-0-website_sale_stock_provisioning_date
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=18.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=19.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -67,7 +67,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -89,6 +89,10 @@ Contributors
- Sergio Teruel
- Carlos Roca
+- `Studio73 `__:
+
+ - Alex Garcia
+
Maintainers
-----------
@@ -102,6 +106,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/e-commerce `_ project on GitHub.
+This module is part of the `OCA/e-commerce `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_stock_provisioning_date/__manifest__.py b/website_sale_stock_provisioning_date/__manifest__.py
index d44ff7b60a..f2404d2a02 100644
--- a/website_sale_stock_provisioning_date/__manifest__.py
+++ b/website_sale_stock_provisioning_date/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Website Sale Stock Provisioning Date",
"summary": "Display provisioning date for a product in shop online",
- "version": "18.0.1.0.0",
+ "version": "19.0.1.0.0",
"development_status": "Production/Stable",
"category": "Website",
"website": "https://github.com/OCA/e-commerce",
@@ -15,12 +15,8 @@
"data": ["views/product_template_views.xml"],
"assets": {
"web.assets_frontend": [
- "website_sale_stock_provisioning_date/static/src/xml/"
- "website_sale_stock_product_availability.xml",
- ],
- "web.assets_tests": [
- "/website_sale_stock_provisioning_date/static/src/js/"
- "website_sale_stock_provisioning_date_tour.esm.js",
+ "website_sale_stock_provisioning_date/static/src/xml/*"
],
+ "web.assets_tests": ["/website_sale_stock_provisioning_date/static/src/js/*"],
},
}
diff --git a/website_sale_stock_provisioning_date/models/product_template.py b/website_sale_stock_provisioning_date/models/product_template.py
index cdcb4eb821..fe0b8278cf 100644
--- a/website_sale_stock_provisioning_date/models/product_template.py
+++ b/website_sale_stock_provisioning_date/models/product_template.py
@@ -56,14 +56,14 @@ def _get_combination_info(
combination=False,
product_id=False,
add_qty=1,
- parent_combination=False,
+ uom_id=False,
only_template=False,
):
combination_info = super()._get_combination_info(
combination=combination,
product_id=product_id,
add_qty=add_qty,
- parent_combination=parent_combination,
+ uom_id=uom_id,
only_template=only_template,
)
if combination_info["product_id"]:
diff --git a/website_sale_stock_provisioning_date/static/description/index.html b/website_sale_stock_provisioning_date/static/description/index.html
index 3b178f2f2a..964fb92e6e 100644
--- a/website_sale_stock_provisioning_date/static/description/index.html
+++ b/website_sale_stock_provisioning_date/static/description/index.html
@@ -374,7 +374,7 @@ Website Sale Stock Provisioning Date
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:6ad91e74a2710e63412aa1b23673baccbeb953e2e281cef39bb22e9cdee59120
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module extends the functionality of website to show you the future
provisioning date closest to the current date for a product in the
eCommerce.
@@ -415,7 +415,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 to smash it by providing a detailed and welcomed
-feedback.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -447,7 +447,7 @@
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/e-commerce project on GitHub.
+
This module is part of the OCA/e-commerce project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.esm.js b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.esm.js
index 4db0539502..674d9c4710 100644
--- a/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.esm.js
+++ b/website_sale_stock_provisioning_date/static/src/js/website_sale_stock_provisioning_date_tour.esm.js
@@ -3,17 +3,18 @@
import {registry} from "@web/core/registry";
import {searchProduct} from "@website_sale/js/tours/tour_utils";
-import {clickOnElement} from "@website/js/tours/tour_utils";
registry.category("web_tour.tours").add("website_sale_stock_provisioning_date", {
test: true,
url: "/shop",
steps: () => [
...searchProduct("provisioning date"),
- clickOnElement(
- "click on product test",
- '.oe_product_cart a:contains("provisioning date")'
- ),
+ {
+ content: "click on product test",
+ trigger: '.oe_product_cart a:contains("provisioning date")',
+ run: "click",
+ expectUnloadPage: true,
+ },
{
trigger:
".availability_messages:has(span:contains('Next provisioning date:'))",
diff --git a/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
index 9388b591c4..beb17459d6 100644
--- a/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
+++ b/website_sale_stock_provisioning_date/static/src/xml/website_sale_stock_product_availability.xml
@@ -3,7 +3,7 @@
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
-
+
Date: Tue, 28 May 2019 18:38:57 +0200
Subject: [PATCH 022/173] [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 23b3fb8102b3c38b825968de852261a7d5f8dd25 Mon Sep 17 00:00:00 2001
From: Sergio Teruel
Date: Thu, 12 Dec 2019 00:25:49 +0100
Subject: [PATCH 023/173] [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 7594795deea1da80abf8cb1c550d96fe1b7db6d2 Mon Sep 17 00:00:00 2001
From: Sergio Teruel
Date: Mon, 13 Jan 2020 23:21:41 +0100
Subject: [PATCH 024/173] [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 0ad413fec9b89ee1f37f4171ffdf97ab13d3e3e6 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Thu, 4 Jun 2020 10:01:58 +0200
Subject: [PATCH 025/173] [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 0e4c7623ecbfd5c681a34216abb9b0ba60aeb419 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Fri, 5 Jun 2020 13:33:22 +0200
Subject: [PATCH 026/173] [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 1181843db050f270b3e9aa7e625fe0614408a3de Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Mon, 29 Jun 2020 13:30:52 +0200
Subject: [PATCH 027/173] [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 c55f9369686dd0ef529ae409fa293ca68f4a537d Mon Sep 17 00:00:00 2001
From: Bosd
Date: Tue, 15 Dec 2020 10:30:49 +0000
Subject: [PATCH 028/173] 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 d94c8fad2027d0e8baa9add7be6782f10cd9cf52 Mon Sep 17 00:00:00 2001
From: claudiagn
Date: Thu, 25 Feb 2021 15:54:17 +0000
Subject: [PATCH 029/173] 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 346501bca25480bde8a6e7a772cffbedbe552502 Mon Sep 17 00:00:00 2001
From: claudiagn
Date: Thu, 25 Feb 2021 15:54:33 +0000
Subject: [PATCH 030/173] 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 9dffab29f5dd4804deef9856ce6016874a2996d1 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 031/173] [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 3c121534b90c97e85422f54c07c6613b548b4163 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Mon, 17 May 2021 16:39:50 +0200
Subject: [PATCH 032/173] [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 b527b48d504c5e65fee7397b0c682df323fd7c80 Mon Sep 17 00:00:00 2001
From: Carlos Roca
Date: Mon, 12 Jul 2021 11:28:50 +0200
Subject: [PATCH 033/173] [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 5475c777e2dcc94306156f4d31cb4a6c8d776fb4 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 034/173] [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 861dfa08cd4c9a29108ff15c481021716ce0e40c 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 035/173] [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 039567e79887fc7f5fd965b43193ccb14fd697e3 Mon Sep 17 00:00:00 2001
From: Pedro Castro Silva
Date: Mon, 22 Aug 2022 12:04:28 +0000
Subject: [PATCH 036/173] 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 73c26dc696e51aa3e201c1ffd170d16019a93d7f Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa
Date: Fri, 24 Feb 2023 14:20:01 +0100
Subject: [PATCH 037/173] [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
-
-
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.
@@ -387,7 +392,7 @@
Website Sale Product Minimal Price
-
+
- 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
@@ -399,23 +404,23 @@
-
+
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback.
+
feedback.
Do not contact contributors directly about support or help with technical issues.
+
From a1171d009132f53448f99ae5e94ebf5b95ff9cf6 Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa
Date: Fri, 18 Jul 2025 17:13:21 +0200
Subject: [PATCH 048/173] [ADD] website_sale_acquirer_confirm_order: New module
TT57241
---
.../README.rst | 95 ++++
.../__init__.py | 2 +
.../__manifest__.py | 18 +
.../controllers/__init__.py | 1 +
.../controllers/main.py | 30 ++
.../models/__init__.py | 1 +
.../models/payment_acquirer.py | 13 +
.../readme/CONTRIBUTORS.rst | 3 +
.../readme/DESCRIPTION.rst | 2 +
.../readme/USAGE.rst | 4 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 439 ++++++++++++++++++
...ebsite_sale_acquirer_confirm_order_tour.js | 44 ++
.../tests/__init__.py | 1 +
...est_website_sale_acquirer_confirm_order.py | 61 +++
.../views/assets.xml | 11 +
.../views/payment_acquirer.xml | 15 +
17 files changed, 740 insertions(+)
create mode 100644 website_sale_acquirer_confirm_order/README.rst
create mode 100644 website_sale_acquirer_confirm_order/__init__.py
create mode 100644 website_sale_acquirer_confirm_order/__manifest__.py
create mode 100644 website_sale_acquirer_confirm_order/controllers/__init__.py
create mode 100644 website_sale_acquirer_confirm_order/controllers/main.py
create mode 100644 website_sale_acquirer_confirm_order/models/__init__.py
create mode 100644 website_sale_acquirer_confirm_order/models/payment_acquirer.py
create mode 100644 website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst
create mode 100644 website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst
create mode 100644 website_sale_acquirer_confirm_order/readme/USAGE.rst
create mode 100644 website_sale_acquirer_confirm_order/static/description/icon.png
create mode 100644 website_sale_acquirer_confirm_order/static/description/index.html
create mode 100644 website_sale_acquirer_confirm_order/static/src/js/website_sale_acquirer_confirm_order_tour.js
create mode 100644 website_sale_acquirer_confirm_order/tests/__init__.py
create mode 100644 website_sale_acquirer_confirm_order/tests/test_website_sale_acquirer_confirm_order.py
create mode 100644 website_sale_acquirer_confirm_order/views/assets.xml
create mode 100644 website_sale_acquirer_confirm_order/views/payment_acquirer.xml
diff --git a/website_sale_acquirer_confirm_order/README.rst b/website_sale_acquirer_confirm_order/README.rst
new file mode 100644
index 0000000000..9eb41230fd
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/README.rst
@@ -0,0 +1,95 @@
+===========================================
+eCommerce Confirm Order By Payment Acquirer
+===========================================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:2f6faca81e348f9315a05c36ea728290539bfcf1818fc2f4d054d1dfa504d30d
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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/14.0/website_sale_acquirer_confirm_order
+ :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_acquirer_confirm_order
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=14.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This module allows you to automatically confirm orders generated from the Odoo online
+store when using a payment method with the option enabled.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+1. Go to **Payment Methods** in the admin panel.
+2. Enable the *Confirm Order Automatically* option for the desired payment method.
+3. When a customer completes a sale using that payment method, the order will be
+ automatically confirmed after payment validation.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* `Tecnativa `_:
+
+ * Pilar Vargas
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+.. |maintainer-pilarvargas-tecnativa| image:: https://github.com/pilarvargas-tecnativa.png?size=40px
+ :target: https://github.com/pilarvargas-tecnativa
+ :alt: pilarvargas-tecnativa
+
+Current `maintainer `__:
+
+|maintainer-pilarvargas-tecnativa|
+
+This module is part of the `OCA/e-commerce `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_acquirer_confirm_order/__init__.py b/website_sale_acquirer_confirm_order/__init__.py
new file mode 100644
index 0000000000..91c5580fed
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/__init__.py
@@ -0,0 +1,2 @@
+from . import controllers
+from . import models
diff --git a/website_sale_acquirer_confirm_order/__manifest__.py b/website_sale_acquirer_confirm_order/__manifest__.py
new file mode 100644
index 0000000000..eddea3f72a
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/__manifest__.py
@@ -0,0 +1,18 @@
+# Copyright 2025 Tecnativa - Pilar Vargas
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+{
+ "name": "eCommerce Confirm Order By Payment Acquirer",
+ "summary": "eCommerce Confirm Order By Payment Acquirer",
+ "author": "Tecnativa, Odoo Community Association (OCA)",
+ "version": "14.0.1.0.0",
+ "category": "Website/Website",
+ "website": "https://github.com/OCA/e-commerce",
+ "maintainers": ["pilarvargas-tecnativa"],
+ "license": "AGPL-3",
+ "depends": ["payment", "website_sale"],
+ "data": [
+ "views/assets.xml",
+ "views/payment_acquirer.xml",
+ ],
+ "installable": True,
+}
diff --git a/website_sale_acquirer_confirm_order/controllers/__init__.py b/website_sale_acquirer_confirm_order/controllers/__init__.py
new file mode 100644
index 0000000000..12a7e529b6
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/controllers/__init__.py
@@ -0,0 +1 @@
+from . import main
diff --git a/website_sale_acquirer_confirm_order/controllers/main.py b/website_sale_acquirer_confirm_order/controllers/main.py
new file mode 100644
index 0000000000..ed9e2049ed
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/controllers/main.py
@@ -0,0 +1,30 @@
+# Copyright 2025 Tecnativa - Pilar Vargas
+# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
+
+from odoo import http
+from odoo.http import request
+
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+
+
+class WebsiteSale(WebsiteSale):
+ @http.route()
+ def payment_confirmation(self, **post):
+ res = super().payment_confirmation(**post)
+ last_tx = (
+ request.env["payment.transaction"]
+ .browse(request.session.get("__website_sale_last_tx_id"))
+ .sudo()
+ .exists()
+ )
+ if not last_tx or not last_tx.acquirer_id.confirm_order:
+ return res
+ order = (
+ request.env["sale.order"]
+ .sudo()
+ .browse(request.session.get("sale_last_order_id"))
+ )
+ if order:
+ order.action_confirm()
+ request.website.sale_reset()
+ return res
diff --git a/website_sale_acquirer_confirm_order/models/__init__.py b/website_sale_acquirer_confirm_order/models/__init__.py
new file mode 100644
index 0000000000..14289a55ab
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/models/__init__.py
@@ -0,0 +1 @@
+from . import payment_acquirer
diff --git a/website_sale_acquirer_confirm_order/models/payment_acquirer.py b/website_sale_acquirer_confirm_order/models/payment_acquirer.py
new file mode 100644
index 0000000000..2fe957563c
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/models/payment_acquirer.py
@@ -0,0 +1,13 @@
+# Copyright 2025 Tecnativa - Pilar Vargas
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class AcquirerRedsys(models.Model):
+ _inherit = "payment.acquirer"
+
+ confirm_order = fields.Boolean(
+ string="Confirm Order Automatically",
+ help="If enabled, orders paid with this method will be automatically confirmed.",
+ )
diff --git a/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst b/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..44075b9f25
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst
@@ -0,0 +1,3 @@
+* `Tecnativa `_:
+
+ * Pilar Vargas
diff --git a/website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst b/website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..8699cfde09
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst
@@ -0,0 +1,2 @@
+This module allows you to automatically confirm orders generated from the Odoo online
+store when using a payment method with the option enabled.
diff --git a/website_sale_acquirer_confirm_order/readme/USAGE.rst b/website_sale_acquirer_confirm_order/readme/USAGE.rst
new file mode 100644
index 0000000000..33baebc8d9
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/USAGE.rst
@@ -0,0 +1,4 @@
+1. Go to **Payment Methods** in the admin panel.
+2. Enable the *Confirm Order Automatically* option for the desired payment method.
+3. When a customer completes a sale using that payment method, the order will be
+ automatically confirmed after payment validation.
diff --git a/website_sale_acquirer_confirm_order/static/description/icon.png b/website_sale_acquirer_confirm_order/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~!
zVpnB`o+K7|Al`Q_U;eD$B
zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA
z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__
zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_
zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I
z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U
z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)(
z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH
zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW
z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx
zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h
zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9
zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz#
z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA
zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K=
z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS
zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C
zuVl&0duN<;uOsB3%T9Fp8t{ED108)`y_~Hnd9AUX7h-H?jVuU|}My+C=TjH(jKz
zqMVr0re3S$H@t{zI95qa)+Crz*5Zj}Ao%4Z><+W(nOZd?gDnfNBC3>M8WE61$So|P
zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO
z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1
zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_
zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8
zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ>
zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN
z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h
zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d
zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB
zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz
z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I
zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X
zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD
z#z-)AXwSRY?OPefw^iI+
z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd
z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs
z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I
z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$
z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV
z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s
zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6
zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u
zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q
zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH
zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c
zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT
zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+
z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ
zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy
zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC)
zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a
zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x!
zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X
zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8
z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A
z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H
zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n=
z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK
z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z
zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h
z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD
z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW
zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@
zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz
z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y<
zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X
zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6
zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6%
z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(|
z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ
z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H
zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6
z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d}
z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A
zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/website_sale_acquirer_confirm_order/static/description/index.html b/website_sale_acquirer_confirm_order/static/description/index.html
new file mode 100644
index 0000000000..de98b92ec1
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/static/description/index.html
@@ -0,0 +1,439 @@
+
+
+
+
+
+eCommerce Confirm Order By Payment Acquirer
+
+
+
+
+
eCommerce Confirm Order By Payment Acquirer
+
+
+

+
This module allows you to automatically confirm orders generated from the Odoo online
+store when using a payment method with the option enabled.
+
Table of contents
+
+
+
+
+- Go to Payment Methods in the admin panel.
+- Enable the Confirm Order Automatically option for the desired payment method.
+- When a customer completes a sale using that payment method, the order will be
+automatically confirmed after payment validation.
+
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
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.
+
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_acquirer_confirm_order/static/src/js/website_sale_acquirer_confirm_order_tour.js b/website_sale_acquirer_confirm_order/static/src/js/website_sale_acquirer_confirm_order_tour.js
new file mode 100644
index 0000000000..b135714386
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/static/src/js/website_sale_acquirer_confirm_order_tour.js
@@ -0,0 +1,44 @@
+/* Copyright 2025 Tecnativa - Pilar Vargas
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+odoo.define("website_sale_acquirer_confirm_order.tour", function (require) {
+ "use strict";
+
+ var tour = require("web_tour.tour");
+ var base = require("web_editor.base");
+
+ var steps = [
+ {
+ trigger: "a:contains('Customizable Desk')",
+ },
+ {
+ trigger: "a:contains('Add to Cart')",
+ },
+ {
+ trigger: ".btn-primary:contains('Process Checkout')",
+ },
+ {
+ content: "Select `Wire Transfer` payment method",
+ trigger: '#payment_method label:contains("Wire Transfer")',
+ },
+ {
+ trigger: "#o_payment_form_pay:contains('Pay Now')",
+ extra_trigger: "#shipping_and_billing",
+ },
+ {
+ trigger: "h3:contains('Payment Information')",
+ },
+ ];
+ tour.register(
+ "website_sale_acquirer_confirm_order",
+ {
+ url: "/shop",
+ test: true,
+ wait_for: base.ready(),
+ },
+ steps
+ );
+ return {
+ steps: steps,
+ };
+});
diff --git a/website_sale_acquirer_confirm_order/tests/__init__.py b/website_sale_acquirer_confirm_order/tests/__init__.py
new file mode 100644
index 0000000000..fe6a7541b2
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_website_sale_acquirer_confirm_order
diff --git a/website_sale_acquirer_confirm_order/tests/test_website_sale_acquirer_confirm_order.py b/website_sale_acquirer_confirm_order/tests/test_website_sale_acquirer_confirm_order.py
new file mode 100644
index 0000000000..313e8b9b85
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/tests/test_website_sale_acquirer_confirm_order.py
@@ -0,0 +1,61 @@
+# Copyright 2025 Tecnativa - Pilar Vargas
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo.tests import tagged
+from odoo.tests.common import HttpCase
+
+
+@tagged("post_install", "-at_install")
+class WebsiteSaleHttpCase(HttpCase):
+ def setUp(self):
+ super().setUp()
+ self.journal_bank = self.env["account.journal"].create(
+ {
+ "name": "Test WSACO",
+ "code": "WSACO",
+ "type": "bank",
+ }
+ )
+ self.acquirer = self.env.ref("payment.payment_acquirer_transfer")
+ self.acquirer.write(
+ {
+ "journal_id": self.journal_bank.id,
+ }
+ )
+
+ def test_ui_website(self):
+ """Test frontend tour."""
+ self.start_tour(
+ "/shop",
+ "website_sale_acquirer_confirm_order",
+ login="admin",
+ step_delay=100,
+ )
+ partner = self.env.ref("base.partner_admin")
+ last_order_sent = self.env["sale.order"].search(
+ [
+ ("partner_id", "=", partner.id),
+ ],
+ order="date_order desc",
+ limit=1,
+ )
+ self.assertEqual(last_order_sent.state, "sent")
+ self.acquirer.write(
+ {
+ "confirm_order": True,
+ }
+ )
+ self.start_tour(
+ "/shop",
+ "website_sale_acquirer_confirm_order",
+ login="admin",
+ step_delay=100,
+ )
+ partner = self.env.ref("base.partner_admin")
+ last_order_confirm = self.env["sale.order"].search(
+ [
+ ("partner_id", "=", partner.id),
+ ],
+ order="date_order desc",
+ limit=1,
+ )
+ self.assertEqual(last_order_confirm.state, "sale")
diff --git a/website_sale_acquirer_confirm_order/views/assets.xml b/website_sale_acquirer_confirm_order/views/assets.xml
new file mode 100644
index 0000000000..ef305660b1
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/views/assets.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/website_sale_acquirer_confirm_order/views/payment_acquirer.xml b/website_sale_acquirer_confirm_order/views/payment_acquirer.xml
new file mode 100644
index 0000000000..75ba9fdb6b
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/views/payment_acquirer.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ acquirer.form.inherit.website
+ payment.acquirer
+
+
+
+
+
+
+
+
+
From 044bbdf3570864ab56b2ca456466ffd7e8401096 Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa
Date: Mon, 27 Oct 2025 16:24:48 +0100
Subject: [PATCH 049/173] [IMP] website_sale_acquirer_confirm_order: pre-commit
auto fixes
---
.../README.rst | 32 ++++++++++---------
.../pyproject.toml | 3 ++
.../readme/CONTRIBUTORS.md | 2 ++
.../readme/CONTRIBUTORS.rst | 3 --
.../readme/DESCRIPTION.md | 3 ++
.../readme/DESCRIPTION.rst | 2 --
.../readme/USAGE.md | 5 +++
.../readme/USAGE.rst | 4 ---
.../static/description/index.html | 18 ++++++-----
9 files changed, 40 insertions(+), 32 deletions(-)
create mode 100644 website_sale_acquirer_confirm_order/pyproject.toml
create mode 100644 website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.md
delete mode 100644 website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst
create mode 100644 website_sale_acquirer_confirm_order/readme/DESCRIPTION.md
delete mode 100644 website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst
create mode 100644 website_sale_acquirer_confirm_order/readme/USAGE.md
delete mode 100644 website_sale_acquirer_confirm_order/readme/USAGE.rst
diff --git a/website_sale_acquirer_confirm_order/README.rst b/website_sale_acquirer_confirm_order/README.rst
index 9eb41230fd..584ccefe7d 100644
--- a/website_sale_acquirer_confirm_order/README.rst
+++ b/website_sale_acquirer_confirm_order/README.rst
@@ -17,19 +17,20 @@ eCommerce Confirm Order By Payment Acquirer
: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_acquirer_confirm_order
+ :target: https://github.com/OCA/e-commerce/tree/18.0/website_sale_acquirer_confirm_order
: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_acquirer_confirm_order
+ :target: https://translation.odoo-community.org/projects/e-commerce-18-0/e-commerce-18-0-website_sale_acquirer_confirm_order
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=14.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module allows you to automatically confirm orders generated from the Odoo online
-store when using a payment method with the option enabled.
+This module allows you to automatically confirm orders generated from
+the Odoo online store when using a payment method with the option
+enabled.
**Table of contents**
@@ -40,9 +41,10 @@ Usage
=====
1. Go to **Payment Methods** in the admin panel.
-2. Enable the *Confirm Order Automatically* option for the desired payment method.
-3. When a customer completes a sale using that payment method, the order will be
- automatically confirmed after payment validation.
+2. Enable the *Confirm Order Automatically* option for the desired
+ payment method.
+3. When a customer completes a sale using that payment method, the order
+ will be automatically confirmed after payment validation.
Bug Tracker
===========
@@ -50,7 +52,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -58,19 +60,19 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Tecnativa
Contributors
-~~~~~~~~~~~~
+------------
-* `Tecnativa `_:
+- `Tecnativa `__:
- * Pilar Vargas
+ - Pilar Vargas
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
@@ -90,6 +92,6 @@ Current `maintainer `__:
|maintainer-pilarvargas-tecnativa|
-This module is part of the `OCA/e-commerce `_ project on GitHub.
+This module is part of the `OCA/e-commerce `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_acquirer_confirm_order/pyproject.toml b/website_sale_acquirer_confirm_order/pyproject.toml
new file mode 100644
index 0000000000..4231d0cccb
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.md b/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.md
new file mode 100644
index 0000000000..df940da7c6
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.md
@@ -0,0 +1,2 @@
+- [Tecnativa](https://www.tecnativa.com):
+ - Pilar Vargas
diff --git a/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst b/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 44075b9f25..0000000000
--- a/website_sale_acquirer_confirm_order/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,3 +0,0 @@
-* `Tecnativa `_:
-
- * Pilar Vargas
diff --git a/website_sale_acquirer_confirm_order/readme/DESCRIPTION.md b/website_sale_acquirer_confirm_order/readme/DESCRIPTION.md
new file mode 100644
index 0000000000..291841e216
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/DESCRIPTION.md
@@ -0,0 +1,3 @@
+This module allows you to automatically confirm orders generated from
+the Odoo online store when using a payment method with the option
+enabled.
diff --git a/website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst b/website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst
deleted file mode 100644
index 8699cfde09..0000000000
--- a/website_sale_acquirer_confirm_order/readme/DESCRIPTION.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-This module allows you to automatically confirm orders generated from the Odoo online
-store when using a payment method with the option enabled.
diff --git a/website_sale_acquirer_confirm_order/readme/USAGE.md b/website_sale_acquirer_confirm_order/readme/USAGE.md
new file mode 100644
index 0000000000..d3051727c0
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/USAGE.md
@@ -0,0 +1,5 @@
+1. Go to **Payment Methods** in the admin panel.
+2. Enable the *Confirm Order Automatically* option for the desired
+ payment method.
+3. When a customer completes a sale using that payment method, the
+ order will be automatically confirmed after payment validation.
diff --git a/website_sale_acquirer_confirm_order/readme/USAGE.rst b/website_sale_acquirer_confirm_order/readme/USAGE.rst
deleted file mode 100644
index 33baebc8d9..0000000000
--- a/website_sale_acquirer_confirm_order/readme/USAGE.rst
+++ /dev/null
@@ -1,4 +0,0 @@
-1. Go to **Payment Methods** in the admin panel.
-2. Enable the *Confirm Order Automatically* option for the desired payment method.
-3. When a customer completes a sale using that payment method, the order will be
- automatically confirmed after payment validation.
diff --git a/website_sale_acquirer_confirm_order/static/description/index.html b/website_sale_acquirer_confirm_order/static/description/index.html
index de98b92ec1..916416ddfe 100644
--- a/website_sale_acquirer_confirm_order/static/description/index.html
+++ b/website_sale_acquirer_confirm_order/static/description/index.html
@@ -369,9 +369,10 @@ eCommerce Confirm Order By Payment Acquirer
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2f6faca81e348f9315a05c36ea728290539bfcf1818fc2f4d054d1dfa504d30d
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

-This module allows you to automatically confirm orders generated from the Odoo online
-store when using a payment method with the option enabled.
+

+This module allows you to automatically confirm orders generated from
+the Odoo online store when using a payment method with the option
+enabled.
Table of contents
@@ -389,9 +390,10 @@ eCommerce Confirm Order By Payment Acquirer
- Go to Payment Methods in the admin panel.
-- Enable the Confirm Order Automatically option for the desired payment method.
-- When a customer completes a sale using that payment method, the order will be
-automatically confirmed after payment validation.
+- Enable the Confirm Order Automatically option for the desired
+payment method.
+- When a customer completes a sale using that payment method, the order
+will be automatically confirmed after payment validation.
@@ -399,7 +401,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 to smash it by providing a detailed and welcomed
-feedback.
+
feedback.
Do not contact contributors directly about support or help with technical issues.
From b41e41877d88beb4daa2cea23cdd00caaac02f10 Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa
Date: Mon, 27 Oct 2025 16:28:37 +0100
Subject: [PATCH 050/173] [MIG] website_sale_acquirer_confirm_order: Migration
to version 18.0
TT58470
---
.../README.rst | 19 +++++++-
.../__manifest__.py | 14 +++---
.../controllers/main.py | 34 +++++++-------
.../models/__init__.py | 2 +-
...ayment_acquirer.py => payment_provider.py} | 7 +--
.../readme/CONTEXT.md | 6 +++
.../static/description/index.html | 45 ++++++++++++-------
...te_sale_acquirer_confirm_order_tour.esm.js | 34 ++++++++++++++
...ebsite_sale_acquirer_confirm_order_tour.js | 44 ------------------
...est_website_sale_acquirer_confirm_order.py | 28 ++++++------
.../views/assets.xml | 11 -----
.../views/payment_acquirer.xml | 15 -------
.../views/payment_provider_views.xml | 16 +++++++
13 files changed, 148 insertions(+), 127 deletions(-)
rename website_sale_acquirer_confirm_order/models/{payment_acquirer.py => payment_provider.py} (73%)
create mode 100644 website_sale_acquirer_confirm_order/readme/CONTEXT.md
create mode 100644 website_sale_acquirer_confirm_order/static/src/js/website_sale_acquirer_confirm_order_tour.esm.js
delete mode 100644 website_sale_acquirer_confirm_order/static/src/js/website_sale_acquirer_confirm_order_tour.js
delete mode 100644 website_sale_acquirer_confirm_order/views/assets.xml
delete mode 100644 website_sale_acquirer_confirm_order/views/payment_acquirer.xml
create mode 100644 website_sale_acquirer_confirm_order/views/payment_provider_views.xml
diff --git a/website_sale_acquirer_confirm_order/README.rst b/website_sale_acquirer_confirm_order/README.rst
index 584ccefe7d..d206ed1ca1 100644
--- a/website_sale_acquirer_confirm_order/README.rst
+++ b/website_sale_acquirer_confirm_order/README.rst
@@ -1,5 +1,5 @@
===========================================
-eCommerce Confirm Order By Payment Acquirer
+eCommerce Confirm Order By Payment Provider
===========================================
..
@@ -37,6 +37,23 @@ enabled.
.. contents::
:local:
+Use Cases / Context
+===================
+
+This module adds the option “Confirm Order Automatically” to the
+website's payment providers. It is intended only for payment methods
+that require manual confirmation, such as bank transfer or equivalent
+custom methods (e.g., money orders or cash on delivery managed outside
+of Odoo).
+
+When this option is enabled, the sales order is automatically confirmed
+after checkout is completed, without waiting for payment reconciliation.
+
+It should not be enabled for online payment gateways (Stripe, Redsys,
+PayPal, etc.), as these automatically confirm the order when the
+transaction is authorized. Enabling it in these cases could result in
+duplicate or premature confirmations.
+
Usage
=====
diff --git a/website_sale_acquirer_confirm_order/__manifest__.py b/website_sale_acquirer_confirm_order/__manifest__.py
index eddea3f72a..6d17fa485b 100644
--- a/website_sale_acquirer_confirm_order/__manifest__.py
+++ b/website_sale_acquirer_confirm_order/__manifest__.py
@@ -1,18 +1,22 @@
# Copyright 2025 Tecnativa - Pilar Vargas
# License AGPL-3.0 or later (http://www.gnu.org/licenses/lgpl).
{
- "name": "eCommerce Confirm Order By Payment Acquirer",
- "summary": "eCommerce Confirm Order By Payment Acquirer",
+ "name": "eCommerce Confirm Order By Payment Provider",
+ "summary": "eCommerce Confirm Order By Payment Provider",
"author": "Tecnativa, Odoo Community Association (OCA)",
- "version": "14.0.1.0.0",
+ "version": "18.0.1.0.0",
"category": "Website/Website",
"website": "https://github.com/OCA/e-commerce",
"maintainers": ["pilarvargas-tecnativa"],
"license": "AGPL-3",
"depends": ["payment", "website_sale"],
"data": [
- "views/assets.xml",
- "views/payment_acquirer.xml",
+ "views/payment_provider_views.xml",
],
+ "assets": {
+ "web.assets_tests": [
+ "website_sale_acquirer_confirm_order/static/src/js/*",
+ ],
+ },
"installable": True,
}
diff --git a/website_sale_acquirer_confirm_order/controllers/main.py b/website_sale_acquirer_confirm_order/controllers/main.py
index ed9e2049ed..d2a25e1e84 100644
--- a/website_sale_acquirer_confirm_order/controllers/main.py
+++ b/website_sale_acquirer_confirm_order/controllers/main.py
@@ -9,22 +9,22 @@
class WebsiteSale(WebsiteSale):
@http.route()
- def payment_confirmation(self, **post):
- res = super().payment_confirmation(**post)
- last_tx = (
- request.env["payment.transaction"]
- .browse(request.session.get("__website_sale_last_tx_id"))
- .sudo()
- .exists()
- )
- if not last_tx or not last_tx.acquirer_id.confirm_order:
- return res
- order = (
- request.env["sale.order"]
- .sudo()
- .browse(request.session.get("sale_last_order_id"))
- )
- if order:
+ def shop_payment_confirmation(self, **post):
+ res = super().shop_payment_confirmation(**post)
+ sale_order_id = request.session.get("sale_last_order_id")
+ if sale_order_id:
+ order = request.env["sale.order"].sudo().browse(sale_order_id)
+ last_tx = (
+ order.get_portal_last_transaction()
+ if order
+ else order.env["payment.transaction"]
+ )
+ if (
+ not last_tx
+ or not last_tx.provider_id.confirm_order
+ or order.state == "sale"
+ ):
+ return res
order.action_confirm()
- request.website.sale_reset()
+ request.website.sale_reset()
return res
diff --git a/website_sale_acquirer_confirm_order/models/__init__.py b/website_sale_acquirer_confirm_order/models/__init__.py
index 14289a55ab..7070c03b00 100644
--- a/website_sale_acquirer_confirm_order/models/__init__.py
+++ b/website_sale_acquirer_confirm_order/models/__init__.py
@@ -1 +1 @@
-from . import payment_acquirer
+from . import payment_provider
diff --git a/website_sale_acquirer_confirm_order/models/payment_acquirer.py b/website_sale_acquirer_confirm_order/models/payment_provider.py
similarity index 73%
rename from website_sale_acquirer_confirm_order/models/payment_acquirer.py
rename to website_sale_acquirer_confirm_order/models/payment_provider.py
index 2fe957563c..5ac964317c 100644
--- a/website_sale_acquirer_confirm_order/models/payment_acquirer.py
+++ b/website_sale_acquirer_confirm_order/models/payment_provider.py
@@ -4,10 +4,11 @@
from odoo import fields, models
-class AcquirerRedsys(models.Model):
- _inherit = "payment.acquirer"
+class PaymentProvider(models.Model):
+ _inherit = "payment.provider"
confirm_order = fields.Boolean(
string="Confirm Order Automatically",
- help="If enabled, orders paid with this method will be automatically confirmed.",
+ help="If enabled, orders paid with this method will be automatically "
+ "confirmed.",
)
diff --git a/website_sale_acquirer_confirm_order/readme/CONTEXT.md b/website_sale_acquirer_confirm_order/readme/CONTEXT.md
new file mode 100644
index 0000000000..85f2ceb05f
--- /dev/null
+++ b/website_sale_acquirer_confirm_order/readme/CONTEXT.md
@@ -0,0 +1,6 @@
+This module adds the option “Confirm Order Automatically” to the website's payment providers.
+It is intended only for payment methods that require manual confirmation, such as bank transfer or equivalent custom methods (e.g., money orders or cash on delivery managed outside of Odoo).
+
+When this option is enabled, the sales order is automatically confirmed after checkout is completed, without waiting for payment reconciliation.
+
+It should not be enabled for online payment gateways (Stripe, Redsys, PayPal, etc.), as these automatically confirm the order when the transaction is authorized. Enabling it in these cases could result in duplicate or premature confirmations.
diff --git a/website_sale_acquirer_confirm_order/static/description/index.html b/website_sale_acquirer_confirm_order/static/description/index.html
index 916416ddfe..ef0cda4c61 100644
--- a/website_sale_acquirer_confirm_order/static/description/index.html
+++ b/website_sale_acquirer_confirm_order/static/description/index.html
@@ -3,7 +3,7 @@
-eCommerce Confirm Order By Payment Acquirer
+eCommerce Confirm Order By Payment Provider
-
-
eCommerce Confirm Order By Payment Acquirer
+
+
eCommerce Confirm Order By Payment Provider
-

+

This module allows you to automatically confirm orders generated from
the Odoo online store when using a payment method with the option
enabled.
@@ -388,7 +393,7 @@
eCommerce Confirm Order By Payment Provider
-
+
This module adds the option “Confirm Order Automatically” to the
website’s payment providers. It is intended only for payment methods
that require manual confirmation, such as bank transfer or equivalent
@@ -402,7 +407,7 @@
duplicate or premature confirmations.
-
+
- Go to Payment Methods in the admin panel.
- Enable the Confirm Order Automatically option for the desired
@@ -412,7 +417,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 to smash it by providing a detailed and welcomed
@@ -420,15 +425,15 @@
Do not contact contributors directly about support or help with technical issues.
+