From 042c03ea0edb970002b6f86cd7afb0996f7c81d0 Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Mon, 4 Mar 2019 12:51:21 +0100
Subject: [PATCH 01/32] [11.0][ADD] website_sale_secondary_unit: New module

---
 website_sale_secondary_unit/README.rst        |  87 ++++
 website_sale_secondary_unit/__init__.py       |   4 +
 website_sale_secondary_unit/__manifest__.py   |  30 ++
 .../controllers/__init__.py                   |   2 +
 .../controllers/main.py                       |  31 ++
 website_sale_secondary_unit/data/demo.xml     |  26 ++
 website_sale_secondary_unit/hooks.py          |  14 +
 website_sale_secondary_unit/i18n/es.po        |  60 +++
 .../i18n/website_sale_secondary_unit.pot      |  63 +++
 .../models/__init__.py                        |   4 +
 .../models/product_secondary_unit.py          |  10 +
 .../models/product_template.py                |  12 +
 .../models/sale_order.py                      |  98 ++++
 .../readme/CONTRIBUTORS.rst                   |   1 +
 .../readme/DESCRIPTION.rst                    |   2 +
 website_sale_secondary_unit/readme/USAGE.rst  |   9 +
 .../security/ir.model.access.csv              |   5 +
 .../security/website_sale_secondary_unit.xml  |  15 +
 .../static/description/icon.png               | Bin 0 -> 9455 bytes
 .../static/description/index.html             | 434 ++++++++++++++++++
 .../src/js/website_sale_secondary_unit.js     |  88 ++++
 .../js/website_sale_secondary_unit_tour.js    |  62 +++
 .../src/less/website_sale_secondary_unit.less |   3 +
 website_sale_secondary_unit/tests/__init__.py |   1 +
 .../tests/test_website_sale_secondary_unit.py |  18 +
 website_sale_secondary_unit/views/assets.xml  |  13 +
 .../views/product_secondary_unit_views.xml    |  16 +
 .../views/product_template_views.xml          |  17 +
 .../views/templates.xml                       | 156 +++++++
 29 files changed, 1281 insertions(+)
 create mode 100644 website_sale_secondary_unit/README.rst
 create mode 100644 website_sale_secondary_unit/__init__.py
 create mode 100644 website_sale_secondary_unit/__manifest__.py
 create mode 100644 website_sale_secondary_unit/controllers/__init__.py
 create mode 100644 website_sale_secondary_unit/controllers/main.py
 create mode 100644 website_sale_secondary_unit/data/demo.xml
 create mode 100644 website_sale_secondary_unit/hooks.py
 create mode 100644 website_sale_secondary_unit/i18n/es.po
 create mode 100644 website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
 create mode 100644 website_sale_secondary_unit/models/__init__.py
 create mode 100644 website_sale_secondary_unit/models/product_secondary_unit.py
 create mode 100644 website_sale_secondary_unit/models/product_template.py
 create mode 100644 website_sale_secondary_unit/models/sale_order.py
 create mode 100644 website_sale_secondary_unit/readme/CONTRIBUTORS.rst
 create mode 100644 website_sale_secondary_unit/readme/DESCRIPTION.rst
 create mode 100644 website_sale_secondary_unit/readme/USAGE.rst
 create mode 100644 website_sale_secondary_unit/security/ir.model.access.csv
 create mode 100644 website_sale_secondary_unit/security/website_sale_secondary_unit.xml
 create mode 100644 website_sale_secondary_unit/static/description/icon.png
 create mode 100644 website_sale_secondary_unit/static/description/index.html
 create mode 100644 website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
 create mode 100644 website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
 create mode 100644 website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less
 create mode 100644 website_sale_secondary_unit/tests/__init__.py
 create mode 100644 website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
 create mode 100644 website_sale_secondary_unit/views/assets.xml
 create mode 100755 website_sale_secondary_unit/views/product_secondary_unit_views.xml
 create mode 100755 website_sale_secondary_unit/views/product_template_views.xml
 create mode 100755 website_sale_secondary_unit/views/templates.xml

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
new file mode 100644
index 0000000000..9e44e6218b
--- /dev/null
+++ b/website_sale_secondary_unit/README.rst
@@ -0,0 +1,87 @@
+===========================
+Website Sale Secondary Unit
+===========================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   !! 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_secondary_unit
+    :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_secondary_unit
+    :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 sale_order_secondary_unit module to
+allow sell products in online store in secondary units defined.
+
+**Table of contents**
+
+.. contents::
+   :local:
+
+Usage
+=====
+
+To use this module you need to:
+
+* Go to *'Sales > Catalog > Products'*.
+* Create secondary units for a product.
+* Go to Website Shop and buy this product, you will see a selectable option
+  with all secondary units defined in the product and visible in website.
+* If you do not want to sell in a base product unit and only allow sell in a
+  secondary unit you can disable the option *'Allow to sell in unit of
+  measure'* in a product sale tab.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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 <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* Sergio Teruel <sergio.teruel@tecnativa.com>
+
+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 <https://github.com/OCA/e-commerce/tree/11.0/website_sale_secondary_unit>`_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_secondary_unit/__init__.py b/website_sale_secondary_unit/__init__.py
new file mode 100644
index 0000000000..b754b9b624
--- /dev/null
+++ b/website_sale_secondary_unit/__init__.py
@@ -0,0 +1,4 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import controllers
+from . import models
+from .hooks import post_init_hook
diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
new file mode 100644
index 0000000000..b9fbb39de0
--- /dev/null
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -0,0 +1,30 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+    'name': 'Website Sale Secondary Unit',
+    'summary': 'Allow manage secondary units in website shop',
+    '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',
+        'sale_order_secondary_unit',
+    ],
+    'data': [
+        'security/ir.model.access.csv',
+        'security/website_sale_secondary_unit.xml',
+        'views/assets.xml',
+        'views/product_template_views.xml',
+        'views/product_secondary_unit_views.xml',
+        'views/templates.xml',
+    ],
+    'demo': [
+        'data/demo.xml',
+    ],
+    'post_init_hook': 'post_init_hook',
+}
diff --git a/website_sale_secondary_unit/controllers/__init__.py b/website_sale_secondary_unit/controllers/__init__.py
new file mode 100644
index 0000000000..dea930adca
--- /dev/null
+++ b/website_sale_secondary_unit/controllers/__init__.py
@@ -0,0 +1,2 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import main
diff --git a/website_sale_secondary_unit/controllers/main.py b/website_sale_secondary_unit/controllers/main.py
new file mode 100644
index 0000000000..0140df3e0c
--- /dev/null
+++ b/website_sale_secondary_unit/controllers/main.py
@@ -0,0 +1,31 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+from odoo import http
+from odoo.http import request
+
+
+class WebsiteSaleSecondaryUnit(WebsiteSale):
+
+    @http.route()
+    def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
+        # Add secondary uom info to session
+        request.session.pop('secondary_uom_id', None)
+        if 'secondary_uom_id' in kw:
+            secondary_uom = request.env['product.secondary.unit'].browse(
+                int(kw['secondary_uom_id']))
+            request.session['secondary_uom_id'] = secondary_uom.id
+        return super(WebsiteSaleSecondaryUnit, self).cart_update(
+            product_id, add_qty=add_qty, set_qty=set_qty, **kw)
+
+    @http.route()
+    def cart_update_json(self, product_id, line_id=None, add_qty=None,
+                         set_qty=None, display=True):
+        so_line = request.env['sale.order.line'].browse(line_id)
+        request.session.pop('secondary_uom_id', None)
+        if so_line.sudo().secondary_uom_id:
+            request.session['secondary_uom_id'] = \
+                so_line.sudo().secondary_uom_id.id
+        return super(WebsiteSaleSecondaryUnit, self).cart_update_json(
+            product_id, line_id=line_id, add_qty=add_qty, set_qty=set_qty,
+            display=display)
diff --git a/website_sale_secondary_unit/data/demo.xml b/website_sale_secondary_unit/data/demo.xml
new file mode 100644
index 0000000000..84873676c2
--- /dev/null
+++ b/website_sale_secondary_unit/data/demo.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo noupdate="0">
+
+        <record id="secondary_unit_box_5" model="product.secondary.unit">
+            <field name="name">Box</field>
+            <field name="uom_id" ref="product.product_uom_unit"/>
+            <field name="factor">5.0</field>
+            <field name="product_tmpl_id" ref="product.product_product_11_product_template"/>
+            <field name="website_published">True</field>
+        </record>
+
+        <record id="secondary_unit_box_10" model="product.secondary.unit">
+            <field name="name">Box</field>
+            <field name="uom_id" ref="product.product_uom_unit"/>
+            <field name="factor">10.0</field>
+            <field name="product_tmpl_id" ref="product.product_product_11_product_template"/>
+            <field name="website_published">True</field>
+        </record>
+
+         <record id="product.product_product_11" model="product.product">
+            <field name="secondary_uom_ids" eval="[(6, 0, [ref('website_sale_secondary_unit.secondary_unit_box_5'),
+                                                           ref('website_sale_secondary_unit.secondary_unit_box_10')]),]"/>
+            <field name="allow_uom_sell" eval="True"/>
+        </record>
+
+</odoo>
diff --git a/website_sale_secondary_unit/hooks.py b/website_sale_secondary_unit/hooks.py
new file mode 100644
index 0000000000..63727480e5
--- /dev/null
+++ b/website_sale_secondary_unit/hooks.py
@@ -0,0 +1,14 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+
+def post_init_hook(cr, registry):
+    """
+    At installation time, set allow_uom_sell field as true for all products
+    that have already been created.
+    """
+    cr.execute("""
+        UPDATE product_template
+        SET allow_uom_sell=true
+        WHERE allow_uom_sell IS NULL;
+    """)
diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
new file mode 100644
index 0000000000..47f94e9cd7
--- /dev/null
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -0,0 +1,60 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* website_sale_secondary_unit
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-03-13 16:54+0000\n"
+"PO-Revision-Date: 2019-03-13 17:56+0100\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 2.0.6\n"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product_allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template_allow_uom_sell
+msgid "Allow to sell in unit of measure"
+msgstr "Permitir vender en la unidad de medida"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_template
+msgid "Product Template"
+msgstr "Plantilla de producto"
+
+#. module: website_sale_secondary_unit
+#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+msgid "Qty:"
+msgstr "Ctdad."
+
+#. module: website_sale_secondary_unit
+#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model:ir.ui.view,arch_db:website_sale_secondary_unit.payment
+msgid "Quantity"
+msgstr "Cantidad"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Quotation"
+msgstr "Presupuesto"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línea de pedido"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit_website_published
+msgid "Visible in Website"
+msgstr "Visible en website"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "product.secondary.unit"
+msgstr ""
diff --git a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
new file mode 100644
index 0000000000..c3463815ea
--- /dev/null
+++ b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
@@ -0,0 +1,63 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#	* website_sale_secondary_unit
+#
+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_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product_allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template_allow_uom_sell
+msgid "Allow to sell in unit of measure"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+msgid "Qty:"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model:ir.ui.view,arch_db:website_sale_secondary_unit.payment
+msgid "Quantity"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Quotation"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit_website_published
+msgid "Visible in Website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "product.secondary.unit"
+msgstr ""
+
diff --git a/website_sale_secondary_unit/models/__init__.py b/website_sale_secondary_unit/models/__init__.py
new file mode 100644
index 0000000000..b4c2be4f9d
--- /dev/null
+++ b/website_sale_secondary_unit/models/__init__.py
@@ -0,0 +1,4 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from . import product_template
+from . import product_secondary_unit
+from . import sale_order
diff --git a/website_sale_secondary_unit/models/product_secondary_unit.py b/website_sale_secondary_unit/models/product_secondary_unit.py
new file mode 100644
index 0000000000..dd2b1f9f56
--- /dev/null
+++ b/website_sale_secondary_unit/models/product_secondary_unit.py
@@ -0,0 +1,10 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import models, fields
+
+
+class ProductSecondaryUnit(models.Model):
+    _inherit = ['product.secondary.unit', 'website.published.mixin']
+    _name = 'product.secondary.unit'
+
+    website_published = fields.Boolean(default=True)
diff --git a/website_sale_secondary_unit/models/product_template.py b/website_sale_secondary_unit/models/product_template.py
new file mode 100644
index 0000000000..c60e43e2f9
--- /dev/null
+++ b/website_sale_secondary_unit/models/product_template.py
@@ -0,0 +1,12 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import models, fields
+
+
+class ProductTemplate(models.Model):
+    _inherit = 'product.template'
+
+    allow_uom_sell = fields.Boolean(
+        string='Allow to sell in unit of measure',
+        default=True,
+    )
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
new file mode 100644
index 0000000000..8607c7d4ea
--- /dev/null
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -0,0 +1,98 @@
+# Copyright 2019 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import api, models
+from odoo.http import request
+from odoo.tools.float_utils import float_round
+
+
+class SaleOrder(models.Model):
+    _inherit = "sale.order"
+
+    @api.multi
+    def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs):
+        """
+        Search sale order lines with secondary units
+        """
+        so_lines = super()._cart_find_product_line(
+            product_id=product_id, line_id=line_id, **kwargs)
+        if so_lines:
+            if line_id:
+                sol = self.env['sale.order.line'].browse(line_id)
+                secondary_uom_id = sol.secondary_uom_id.id
+            else:
+                secondary_uom_id = self.env.context.get(
+                    'secondary_uom_id', False)
+            so_lines = so_lines.filtered(
+                lambda x: x.secondary_uom_id.id == secondary_uom_id)
+        return so_lines
+
+    @api.multi
+    def _website_product_id_change(self, order_id, product_id, qty=0):
+        res = super()._website_product_id_change(
+            order_id, product_id, qty=qty)
+        secondary_uom_id = self.env.context.get('secondary_uom_id', False)
+        res['secondary_uom_id'] = secondary_uom_id
+        return res
+
+    @api.multi
+    def _cart_update(self, product_id=None, line_id=None, add_qty=0, set_qty=0,
+                     attributes=None, **kwargs):
+        if line_id:
+            sol = self.env['sale.order.line'].browse(line_id)
+            secondary_uom_id = sol.secondary_uom_id.id
+        else:
+            secondary_uom_id = request.session.get('secondary_uom_id', False)
+        ctx = self.env.context.copy()
+        if secondary_uom_id:
+            ctx['secondary_uom_id'] = secondary_uom_id
+        res = super(SaleOrder, self.with_context(ctx))._cart_update(
+            product_id=product_id,
+            line_id=line_id,
+            add_qty=add_qty,
+            set_qty=set_qty,
+            attributes=attributes, **kwargs)
+        return res
+
+    def _compute_cart_info(self):
+        super(SaleOrder, self)._compute_cart_info()
+        for order in self:
+            secondary_unit_lines = order.website_order_line.filtered(
+                'secondary_uom_id')
+            if secondary_unit_lines:
+                cart_secondary_quantity = int(sum(
+                    secondary_unit_lines.mapped('secondary_uom_qty')))
+                so_lines = order.website_order_line - secondary_unit_lines
+                cart_quantity = int(sum(so_lines.mapped('product_uom_qty')))
+                order.cart_quantity = cart_quantity + cart_secondary_quantity
+
+
+class SaleOrderLine(models.Model):
+    _inherit = "sale.order.line"
+
+    def create(self, vals):
+        SecondaryUom = self.env['product.secondary.unit']
+        secondary_uom = SecondaryUom.browse(
+            vals.get('secondary_uom_id', False))
+        product_uom = self.env['product.uom'].browse(vals['product_uom'])
+        if secondary_uom:
+            factor = secondary_uom.factor * product_uom.factor
+            vals['secondary_uom_qty'] = float_round(
+                vals['product_uom_qty'] / (factor or 1.0),
+                precision_rounding=secondary_uom.uom_id.rounding
+            )
+        return super(SaleOrderLine, self).create(vals)
+
+    def write(self, vals):
+        SecondaryUom = self.env['product.secondary.unit']
+        for line in self:
+            secondary_uom = ('secondary_uom_id' in vals and
+                             SecondaryUom.browse(vals['secondary_uom_id']) or
+                             line.secondary_uom_id)
+            if 'product_uom_qty' in vals and secondary_uom:
+                factor = secondary_uom.factor * vals.get(
+                    'product_uom', line.product_uom.factor)
+                vals['secondary_uom_qty'] = float_round(
+                    vals['product_uom_qty'] / (factor or 1.0),
+                    precision_rounding=secondary_uom.uom_id.rounding
+                )
+        return super(SaleOrderLine, self).write(vals)
diff --git a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..f24a0b0dc7
--- /dev/null
+++ b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Sergio Teruel <sergio.teruel@tecnativa.com>
diff --git a/website_sale_secondary_unit/readme/DESCRIPTION.rst b/website_sale_secondary_unit/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..9c64f39cc2
--- /dev/null
+++ b/website_sale_secondary_unit/readme/DESCRIPTION.rst
@@ -0,0 +1,2 @@
+This module extends the functionality of sale_order_secondary_unit module to
+allow sell products in online store in secondary units defined.
diff --git a/website_sale_secondary_unit/readme/USAGE.rst b/website_sale_secondary_unit/readme/USAGE.rst
new file mode 100644
index 0000000000..a7114cb809
--- /dev/null
+++ b/website_sale_secondary_unit/readme/USAGE.rst
@@ -0,0 +1,9 @@
+To use this module you need to:
+
+* Go to *'Sales > Catalog > Products'*.
+* Create secondary units for a product.
+* Go to Website Shop and buy this product, you will see a selectable option
+  with all secondary units defined in the product and visible in website.
+* If you do not want to sell in a base product unit and only allow sell in a
+  secondary unit you can disable the option *'Allow to sell in unit of
+  measure'* in a product sale tab.
diff --git a/website_sale_secondary_unit/security/ir.model.access.csv b/website_sale_secondary_unit/security/ir.model.access.csv
new file mode 100644
index 0000000000..2c3a3e2827
--- /dev/null
+++ b/website_sale_secondary_unit/security/ir.model.access.csv
@@ -0,0 +1,5 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_product_secondary_unit_public,access_product_second_unit_public,product_secondary_unit.model_product_secondary_unit,base.group_public,1,0,0,0
+access_product_secondary_unit_portal,access_product_second_unit_portal,product_secondary_unit.model_product_secondary_unit,base.group_portal,1,0,0,0
+access_product_uom_public,access_product_uom_public,product.model_product_uom,base.group_public,1,0,0,0
+access_product_uom_portal,access_product_uom_portal,product.model_product_uom,base.group_portal,1,0,0,0
diff --git a/website_sale_secondary_unit/security/website_sale_secondary_unit.xml b/website_sale_secondary_unit/security/website_sale_secondary_unit.xml
new file mode 100644
index 0000000000..bed211a681
--- /dev/null
+++ b/website_sale_secondary_unit/security/website_sale_secondary_unit.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo noupdate="1">
+
+    <record id="product_secondary_unit_public" model="ir.rule">
+        <field name="name">Public secondary unit</field>
+        <field name="model_id" ref="product_secondary_unit.model_product_secondary_unit"/>
+        <field name="domain_force">[('website_published', '=', True)]</field>
+        <field name="groups" eval="[(4, ref('base.group_public')), (4, ref('base.group_portal'))]"/>
+        <field name="perm_read" eval="True"/>
+        <field name="perm_write" eval="False"/>
+        <field name="perm_create" eval="False"/>
+        <field name="perm_unlink" eval="False"/>
+    </record>
+
+</odoo>
diff --git a/website_sale_secondary_unit/static/description/icon.png b/website_sale_secondary_unit/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}<C%<R2Kc9faym6aW`f0Dh5$js*d
z_}}Z!;XIG;_cPz`_vag-p{7Ve$Uq1H00~A(?iu(VaQlMefnU3&OozZXm@69d91cGG
z;O61r&je0NdamH#&)mKsXk?Zb_)B^>d0jUxM@u(PQx^-s)6<jB#=*|j%+$$(&(Xyy
zYgd8+09XKwoa}S2?48%%ZU#L~n^g{fE40h%YEx5by;GuJ(K|vI1uO;0m}=J7R4@Bs
z>97TX<v{QF=s?r`z`m$a0ZvrhBU7}{15RN9M`j!kv_Mp+3~{||YNuFzHNvhMYm3=Q
zo!q+OJ5(%-oNM^I^M%*luKMiVL`lo`bcKGymX7i3MIFWj1i|9+CGNvn`cu-RsK0Qh
zoYlwB>`ehR4?GS^qbkof1cslKgk<Uw6DeIxZyT_?=OwX|lwC*A?ac*gHF7jmS080$
z>U)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~!
zVpnB`o+K7|Al`Q_U<UrcmRnh6jExs}l(hZs0%T~Dnpu-NENdhioRv(T{Qmv>;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@>_<D4$IPL<k1zq(*VmlDPer&h1n6`AG;9A!_W=N$JthhQWXZ<i
zGURc6f<i*joK3xSWaOOXxAc8ES>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<Z(Qt1jC2cC|
z6WbMo9YgON{L#ZDl$sV4*<CP(>{=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)<HrC1(%ZOEd8PI?r9b_$Cp-${bh59Z_R7n&YCp
zl8lfMpes*8{FVm;oJH@0LLoWmxD59u?JwHz2iRrAaE0`Hc&g;t5~$P*kdeOZn9OJ3
zRczo@ZkWU)RG+hcfH~{49Vvb3D(W0wRX#|$cA0Iqy^VR~(4hqA2AFI-rK!FM!#fJ_
zGFI@iqJOPXZ!=VjTS3dMuu~9xU3K1&?th;$)cqM#WGxbDEyB$y`#9j%>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`6jGbb7t<dboft~zeDZwK=+l2bFWs5^+|r{J6GO9Cwl
z&SW58BRs?XdFLuhtzl7WLbQ#~z#`jAB3AbSUg6jW6@qVd2Q~9qN(izT1y*>F#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
zVvqH0SNtDTcs<xiU1;=a39$d&&l5EwoIH1db#`S9Kw!YC1jhR)VbCWMptlUUkpfif
zMzi-i8)WL?|C$*Q?iqbS{w<lA9XN(rD)VS<zn>UdzaMDpT=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}a<Xwa$pLotZk<
zsykXwQO37I=aXew7x=}YWiW)^p)|C#g+)an!@j?EcY8C0t)BlK#y{YLtkJ6=D6H-5
zp2*ANf@>RBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN
z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=<bK!vY7J*RP!&i_xU}i*o6o
z?xN*1<rEe1L2HBkCSgiYM3a|4w?Bo7CJL7?Eh;9An1m$1t?h1v92<Xg2(#)bjbL|o
zH_H0}!Og=1dOBynXHu>@hbCRcfT5ji<pmK_U*~T(A$I-*rM$8-BCv{=@=7F)2pdtU
z5==tp!}A*&Xgf{F>gwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h
zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&<KAVm#0W>BE*}XfU|H&(FssBqY=hPCt`d
zH?@s2>I(|;fcW&YM6#V<T#ysvE$@4oRO>#!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<sv-KjYb}UVFjITQ)VAEWu*)Lz7*-f^A*H
z<25#Ynt~-Qh?$wWx4$1=T2`j@bKp!)3IXh(LC@)%WGW$+j(tGz(6#bGw&K0j=Np@B
zt}@t$R`z(>?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X
zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD
z<sX7(ZJc+Q;#xP8uk`jnF@a^|TWw*55if6@@}%7lOBaGo9Ia-e?`RPQc^w^EWfhe}
zHWHTvDA+r}Xf5Yqpr;QU-88%QC9F_>#z-)AXwSRY?<M%E84!g*1GC?E>OPefw^iI+
z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd
z$<h)Fm>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<GYik+VfZene%bm(n6
z`r@rc^TVw7EN{|O7rORMlw)zt(Z#enc3joE#IIk!M)L8gk^go9E9AxiP9o#OqmvV>
z@;rlc*NRK7i3y5BETSKuumEN`Xu_8<BQ)z0!-JuC8x}?$qo8SEko}oUWNI(4h*VHO
zAi!Egy!f(o9aHs2dhSE6ki(be*&w&+WLOB<(b3T_Hide(NvVvLQV{BN|2?UJFaY*@
z9CXA5B_*8i5Bf6sn~d`R>GP1Ri=OK<SGIb#BCTo3qI#UBUg+dkR+2ilUwIg%XFV;l
z+>Q$@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<g6yi=XozU}zReXL{rA%c`$IQAs<ObZ
zep*ITZ0C(~W*`?XH^l1t7&+qigAfY9tVJ5DH!~jY>#ZRj8kg}dS7_V&^%#Do==#`u
zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK<aUZ^OhBu;1e6t#{
zxKehVgz`HT;A`FMivG<tq0OcrXwHUX_<$j<uk%m>#HN`!1vBJHnC+RM&yIh8{gG2q
zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH
zVWo*OwYElb#uyW{Imam6f2<eMTQj#)z8+N&ZY?tSPo%&2eVNU=4=?rlO<*9Twaxco
zEVE=Jh?_x>rGbjR!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#B<pkvWZft^C&
z;+zNo+VJNluxaDF!`gW+F0=MxsCQ~~#CYKa;ULfj5hTa8a6;d*(<eeQ7-ZQgz2et^
zf|7URfj;x*#HiF0wuBCOTEpbeD&kkENqolCm2#cQGHCeEC<&I3j+P6?sX?BPp4~46
zx-S~EJ>oo{AH8n$<d4loB?vL3RqXwK_COrQ6xRoWGOdFnWy(hhzrG8k;2k}8Zj&>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=<GD??Na(2AG`s>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~N<X{IYiJ3k=4u-u*nJEBnJ<OdI8P
zXmK`OYkO5a{YDhI3PL|H4m=p>Bvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK
z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z
zzCR$P#uktu+#!w)cX!<osOkId_HzAT-HD2N`M+v2l+zwdW%GgZbQMuhfE*hHjKXKg
z45hphqVETPDbX6wpTlZqza0gFaRGh`3L~0id)F6#%@9;w(e%PjzuD7@inuToA!B?F
zCMLJc!u{3N)s?lB-!11!GxXsCak8zQomO)gmn02f-5~OkMYnm~#jVwwYNw@LAv!KN
z-n`q1|AXw*TW>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<h953|jk-C&|3)z%
ze&_30-6q1)a0(!xXqA+_t(WC`HA_yYaW@>`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6%
z2(}&uGRF;p9<Q%jdNy1%e7XTzyu7EEQT(5LrnvX~T%K!IuDyHY`ZneVJu#k_1T)xA
z*yxB?y4!pOJ$DTZzBm|8OIQq+AtV25aJ+X5EJjAu><tfuiNClI2BSoMgqLnU-5t95
zEnZ(^g~1RgD=UMB({c;$HujG&%DqGF;5jI~roRT+(rOoS$6f6SsURIuAVkAeIVc~{
z5ZxLN%m%Z*Sg;qYCf3<$dE6~&w_!EBx%yl4YC~LH{FCFNRBc_I>2eS*sE*o<YSPrx
z{M(reV{~jKue#Y6ZOnqJia{fQc!UxV4m)l389OmzR6A3|2!i<P{r82jKw+zq4%@ny
znopi6g!1Vx9Bml#a~KdL2lp2C)qSTKIh43vgycQHfQb_I!kQY&p;X@Bz|{^SXsW1K
zP&Ag1CW_r6u5-4=s(W>R$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(|
z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4<V=<
zfr<*%iOB1EY}w3tF2Cwl7a2OS&~Y-lu<s)T^9=OFU8(CeN|63BiMxf*)5gesGU<eZ
z9DigzL3+quZ1o2T<KAZbCGJx&lrl*e#}Dpv24bZO$B<Yoc5hbeP0y?@P%|Tvw||e%
zV#e^q0D2R_Oq_c+=x5vP&hg4k+df{o7$aNZCM>PdpwWDop%^}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$^W<wsNa}nUDpNk$q{>Yu2u5kubqmwp%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&<F<Z7l=VnwB^RA&^APMi=Tn
zNc}%IJL~xB4OP6bJNwAw)~Ma2=UP0dhr%X=kco(it+@F<#$xrIJ8@|{Buh<)h`xg?
z_U}pe=3#zmDfdqE4`Hyn<!?&CfCp#GTeXo8;AYd1Opd&cXER8cBSOF3iFJ#XPgQVp
zZSiQf7V^Dt?ITs8aMF~e1hq0P@^oB)#byh|6q_7F1B%ST%WL~J?ySn>YOi-3|1QKB
z<?_cUy)V3go%%^l)lRa=dmY_XQG3Z{Q?52d$qG}vIe|EZbYEtrR$rh(iS)O#dU-(>
z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp
zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#<i<Zx(`=7k~{%`w&<EbG}U<
z0%E^8lyw>s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@<TSeYlROCt(gU?O((-qu
zs>QS0TEL_?njX|<LXnSC4TlId(D4W|GQ?L@$3Ue@N8p=l9-sC<=z(lPk;^sT(v2*k
zc~vp#Hp`mXjzhml2NMCh^h5)sqsan+jJ_l<a4w|G&ac02hrz8#6|kFraA~rta0}!q
zB4BE{QWY7MtxHn_xB);Avf#Lf<GG<A?Q3JVyc1p8^H}$8(Gn=_&F1!m8$sKyeue+L
z5&392wm+wO;_oXoTEJ=wxVXk}dt<d~CgUUMW_PPTe(c<7n18#mVaX)vK}-PzZq7<b
zNJbVTFaq(8ZLx|A*G$H3ugT2aVziDEGa66FVt@hr1|D{RWN6yuqlglM!rp^YG;UpG
zrnm?ek079l3VoOU^p%f^A9Yzn8IVX?^rB4LbgJ|PONhzM_0{P?S(V$OI=u5IBjfT#
z0ntLLnhg5$0fAHJaG6HCx4X7;RmvMtE}8C>@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6#
z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f#
zuT7fv<Q3o5LspCx-RPkzLw{VsDE>jSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC
zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv!
zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8<JV*@W33SMHM;w!OmUXar{O;_8j>ul%rG
z-<zwGD)!Y{+(T{%ob~79zpXX%zulyiy1_UHWvu@YqxKAK3e9GO6Os4R0Naujn>wfS
zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9
z^zP;K#|)$`^Rb{rnH<AdQ^(;gQMcF>GH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE#
z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz
zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8<!P
zAOHj?oPbjQ%hh|vE_1IMB)43eQpeLi&)R>etW=xJvni)8eHi`H$%#zn^WJ<U7gogJ
z?A^!2J~rI78JH|Ml2EldmKY5K8;Zx(FGcBdM<5oe#G+nd6dObqz@Af%%M*aBE_pn8
zXQo2`Bw*IwvP3#1Ev<%YocpBodO9+Rw~`5*CY3{L;qf1PxV!r%NI+#Q1f8GU7$~#U
zAA9$4&g-k=8BYi*3i@0^UX}nTQVyOf)8T(}G^Ti?Vqvk~bJRR#EAQ?u`dClPxk@{;
zxvO?%jSX`2{8|^z0*C5DR1Z^>5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t
z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN
zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01F<S%GT3P{Ck&Y*^gWuie`o_g+ZNDNIV|F
z)zEe|Ij*4$H1(<RLz0($;AD3VsUJwI@liw^?fh(V?VC`Sz7h`*Q<VYlhbHJ?&h+!W
zAJC)U;Lx_QRaSNFYbyi|7+MeNTgA+Znh}qFzf>mx5XbRo6+n|pP(&nodMoap^z{~q
ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k
zQ<WB5+u#`K#~J$81)#?BuTOKLk|+S>^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG
z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff
z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1
zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO
zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}2<F#{*|k0E{$&_`~)
zkzDcsi#!7r<a8lPUCMj?{CK;e|9#-xj>6NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$
zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV(<Rzgqw(Ze!7hEGKKx((>
z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb
zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4
z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_N<mojSrG!`
zgkqx4t<XLL6ZUppvjeV9PJ6dG>hT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{
zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*<bTMtKO;_Z)R
zRSOJrd5TFO0aO%#%-sNa{`SiQ^$$1^@oUd&^lB{MKZ>vIg?@fVFSmMpaw0qtTRbx}
z({Pg?#{2`sc9)M5N$*N|4;^t$+Q<Wh^yJ?FzJ*$wiB{j;CMy+?m1MbsJo0ubR==f9
z>P?#mo<zt1E6=Ilm*nbmYmpxfAj7*m*Wh@=7|;!%(-pviW`nuCktLveet9^$*y^>v
zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22
zc2Ix|App^>v6(3L_MCU0d3W##AB<Fxl*nmny6_RsCu%1a)so}}uCXSzwY70Y@uTxK
z=5nu(N*2HDbrIcL)t_*{*84mvmV_Y9<vxHJJ;0gUdNjyW)jDb|@|j*qR8;gsMa5Ir
z02fHv=%xyN9VLv_ZLL4y|F*p$S^^T47m{aok5{rmM{$s7^Xu2!_fo1$IG6kkG_Tgx
zFfjPm3;g>0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq
zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t<
z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k
z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp
z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{}
zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I

literal 0
HcmV?d00001

diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
new file mode 100644
index 0000000000..ddb338b603
--- /dev/null
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
+<title>Website Sale Secondary Unit</title>
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.subscript {
+  vertical-align: sub;
+  font-size: smaller }
+
+.superscript {
+  vertical-align: super;
+  font-size: smaller }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden;
+}
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title, .code .error {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left, table.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right, table.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+table.align-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+.align-top    {
+  vertical-align: top }
+
+.align-middle {
+  vertical-align: middle }
+
+.align-bottom {
+  vertical-align: bottom }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+pre.code .ln { color: grey; } /* line numbers */
+pre.code, code { background-color: #eeeeee }
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+/* "booktabs" style (no vertical lines) */
+table.docutils.booktabs {
+  border: 0px;
+  border-top: 2px solid;
+  border-bottom: 2px solid;
+  border-collapse: collapse;
+}
+table.docutils.booktabs * {
+  border: 0px;
+}
+table.docutils.booktabs th {
+  border-bottom: thin solid;
+  text-align: left;
+}
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="website-sale-secondary-unit">
+<h1 class="title">Website Sale Secondary Unit</h1>
+
+<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! This file is generated by oca-gen-addon-readme !!
+!! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/11.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-11-0/e-commerce-11-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p>This module extends the functionality of sale_order_secondary_unit module to
+allow sell products in online store in secondary units defined.</p>
+<p><strong>Table of contents</strong></p>
+<div class="contents local topic" id="contents">
+<ul class="simple">
+<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="usage">
+<h1><a class="toc-backref" href="#id1">Usage</a></h1>
+<p>To use this module you need to:</p>
+<ul class="simple">
+<li>Go to <em>‘Sales &gt; Catalog &gt; Products’</em>.</li>
+<li>Create secondary units for a product.</li>
+<li>Go to Website Shop and buy this product, you will see a selectable option
+with all secondary units defined in the product and visible in website.</li>
+<li>If you do not want to sell in a base product unit and only allow sell in a
+secondary unit you can disable the option <em>‘Allow to sell in unit of
+measure’</em> in a product sale tab.</li>
+</ul>
+</div>
+<div class="section" id="bug-tracker">
+<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
+<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
+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
+<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<p>Do not contact contributors directly about support or help with technical issues.</p>
+</div>
+<div class="section" id="credits">
+<h1><a class="toc-backref" href="#id3">Credits</a></h1>
+<div class="section" id="authors">
+<h2><a class="toc-backref" href="#id4">Authors</a></h2>
+<ul class="simple">
+<li>Tecnativa</li>
+</ul>
+</div>
+<div class="section" id="contributors">
+<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
+<ul class="simple">
+<li>Sergio Teruel &lt;<a class="reference external" href="mailto:sergio.teruel&#64;tecnativa.com">sergio.teruel&#64;tecnativa.com</a>&gt;</li>
+</ul>
+</div>
+<div class="section" id="maintainers">
+<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
+<p>This module is maintained by the OCA.</p>
+<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
+<p>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.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/11.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
+<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
new file mode 100644
index 0000000000..8265d5b22f
--- /dev/null
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
@@ -0,0 +1,88 @@
+odoo.define('website_sale_secondary_unit.animation', function (require) {
+'use strict';
+
+var core = require('web.core');
+var sAnimation = require('website.content.snippets.animation');
+
+
+sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend({
+    selector: ".secondary-unit",
+    init: function (parent, editableMode) {
+        this._super.apply(this, arguments);
+        this.$secondary_uom = null;
+        this.$secondary_uom_qty = null;
+        this.$product_qty = null;
+        this.secondary_uom_qty = null;
+        this.secondary_uom_factor = null;
+        this.product_uom_factor = null;
+        this.product_qty = null;
+    },
+    start: function () {
+        var self = this;
+        self.$secondary_uom = $('#secondary_uom');
+        self.$secondary_uom_qty = $('.secondary-quantity');
+        self.$product_qty = $('.quantity');
+        self._setValues();
+        this.$target.on('change', '.secondary-quantity', function () {
+            self._onChangeSecondaryUom();
+        });
+        this.$target.on('change', '#secondary_uom', function () {
+            self._onChangeSecondaryUom();
+        });
+        this.$product_qty.on('change', null, function () {
+            self._onChangeProductQty();
+        });
+        if(self.secondary_uom_qty){
+            self._onChangeSecondaryUom();
+        };
+    },
+    _setValues: function(){
+        this.secondary_uom_qty = parseFloat(this.$target.find('.secondary-quantity').val());
+        this.secondary_uom_factor = parseFloat($('option:selected', this.$secondary_uom).data('secondary-uom-factor'));
+        this.product_uom_factor = parseFloat($('option:selected', this.$secondary_uom).data('product-uom-factor'));
+        this.product_qty = parseFloat($('.quantity').val());
+    },
+
+    _onChangeSecondaryUom: function(){
+        this._setValues()
+        var factor = this.secondary_uom_factor * this.product_uom_factor;
+        this.$product_qty.val(this.secondary_uom_qty * factor)
+    },
+    _onChangeProductQty: function(){
+        this._setValues();
+        var factor = this.secondary_uom_factor * this.product_uom_factor;
+        this.$secondary_uom_qty.val(this.product_qty / factor);
+    },
+});
+
+sAnimation.registry.sale_secondary_unit_cart = sAnimation.Class.extend({
+    selector: ".oe_cart",
+    init: function (parent, editableMode) {
+        this._super.apply(this, arguments);
+        this.$product_qty = null;
+        this.secondary_uom_qty = null;
+        this.secondary_uom_factor = null;
+        this.product_uom_factor = null;
+        this.product_qty = null;
+    },
+    start: function () {
+        var self = this;
+        this.$target.on('change', 'input.js_secondary_quantity[data-line-id]', function () {
+            self._onChangeSecondaryUom(this);
+        });
+    },
+    _setValues: function(order_line){
+        this.$product_qty = this.$target.find('.quantity[data-line-id='+ order_line.dataset.lineId +']')
+        this.secondary_uom_qty = parseFloat(order_line.value);
+        this.secondary_uom_factor = parseFloat(order_line.dataset.secondaryUomFactor);
+        this.product_uom_factor = parseFloat(order_line.dataset.productUomFactor);
+    },
+    _onChangeSecondaryUom: function(order_line){
+        this._setValues(order_line);
+        var factor = this.secondary_uom_factor * this.product_uom_factor;
+        this.$product_qty.val(this.secondary_uom_qty * factor);
+        this.$product_qty.trigger('change');
+    },
+});
+
+});
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
new file mode 100644
index 0000000000..d0d8098259
--- /dev/null
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -0,0 +1,62 @@
+/* Copyright 2019 Sergio Teruel
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+odoo.define("website_sale_secondary_unit.tour", function (require) {
+    "use strict";
+
+    var tour = require("web_tour.tour");
+    var base = require("web_editor.base");
+
+    var steps = [
+        {
+            trigger: "a:contains('iPod')",
+        },
+        {
+            trigger: "#secondary_uom",
+            run: "text 1",
+        },
+        {
+            trigger: "#add_to_cart",
+            extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(5))",
+        },
+        {
+            trigger: "a[href='/shop']",
+            extra_trigger: "span:contains(Box 5 Unit(s))"
+        },
+        {
+            trigger: "a:contains('iPod')",
+        },
+        {
+            trigger: "#add_to_cart",
+            extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(1))",
+        },
+        {
+            trigger: "a[href='/shop/checkout']",
+            extra_trigger: "span:containsExact(Unit(s))"
+        },
+        {
+            trigger: "a[href='/shop/confirm_order']",
+        },
+        {
+            trigger: "#o_payment_form_pay",
+            extra_trigger: "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))"
+        },
+        {
+            trigger: "a[href='/shop']",
+            extra_trigger: "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))"
+        },
+    ];
+
+    tour.register("website_sale_secondary_unit",
+        {
+            url: "/shop",
+            test: true,
+            wait_for: base.ready(),
+        },
+        steps
+    );
+
+    return {
+        steps: steps,
+    };
+});
diff --git a/website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less b/website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less
new file mode 100644
index 0000000000..6a89719af7
--- /dev/null
+++ b/website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less
@@ -0,0 +1,3 @@
+.css_secondary_quantity {
+    max-width: 150px;
+}
diff --git a/website_sale_secondary_unit/tests/__init__.py b/website_sale_secondary_unit/tests/__init__.py
new file mode 100644
index 0000000000..e6063c833b
--- /dev/null
+++ b/website_sale_secondary_unit/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_website_sale_secondary_unit
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
new file mode 100644
index 0000000000..c17e0d0b98
--- /dev/null
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.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 WebsiteSaleSecondaryUnitHttpCase(HttpCase):
+
+    def test_ui_website(self):
+        """Test frontend tour."""
+        tour = (
+            "odoo.__DEBUG__.services['web_tour.tour']",
+            "website_sale_secondary_unit",
+        )
+        self.phantom_js(
+            url_path="/",
+            code="%s.run('%s')" % tour,
+            ready="%s.tours['%s'].ready" % tour,
+            login="admin")
diff --git a/website_sale_secondary_unit/views/assets.xml b/website_sale_secondary_unit/views/assets.xml
new file mode 100644
index 0000000000..0af2522c19
--- /dev/null
+++ b/website_sale_secondary_unit/views/assets.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+    <template id="assets_frontend" inherit_id="website.assets_frontend">
+        <xpath expr=".">
+            <script type="text/javascript"
+                    src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js"/>
+            <script type="text/javascript"
+                    src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"/>
+            <link type="text/less" rel="stylesheet"
+                  href="/website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less"/>
+        </xpath>
+    </template>
+</odoo>
diff --git a/website_sale_secondary_unit/views/product_secondary_unit_views.xml b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
new file mode 100755
index 0000000000..565c66413e
--- /dev/null
+++ b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 Tecnativa - Sergio Teruel
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+
+    <record id="product_template_website_publish_form_view" model="ir.ui.view">
+        <field name="model">product.template</field>
+        <field name="inherit_id" ref="product_secondary_unit.product_template_form_view"/>
+        <field name="arch" type="xml">
+            <field name="factor" position="after">
+                <field name="website_published"/>
+            </field>
+        </field>
+    </record>
+
+</odoo>
diff --git a/website_sale_secondary_unit/views/product_template_views.xml b/website_sale_secondary_unit/views/product_template_views.xml
new file mode 100755
index 0000000000..4a1b5e3a17
--- /dev/null
+++ b/website_sale_secondary_unit/views/product_template_views.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 Tecnativa - Sergio Teruel
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+
+    <record id="product_template_form_view" model="ir.ui.view">
+        <field name="name">product.template.website.secondary.unit.form</field>
+        <field name="model">product.template</field>
+        <field name="inherit_id" ref="website_sale.product_template_form_view"/>
+        <field name="arch" type="xml">
+            <field name="website_style_ids" position="after">
+                <field name="allow_uom_sell"/>
+            </field>
+        </field>
+    </record>
+
+</odoo>
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
new file mode 100755
index 0000000000..b5aa022d4b
--- /dev/null
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 Tecnativa - Sergio Teruel
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+
+    <template id="secondary_qty">
+        <div class="css_quantity input-group oe_website_spinner" contenteditable="false">
+            <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json">
+                <i class="fa fa-minus"></i>
+            </a>
+            <input type="text" class="form-control secondary-quantity" data-min="1" name="add_secondary_qty" value="1"/>
+            <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json">
+                <i class="fa fa-plus"></i>
+            </a>
+        </div>
+    </template>
+
+    <template id="second_qty_description">
+        <t t-set="factor" t-value="int(secondary_uom.factor) == secondary_uom.factor and int(secondary_uom.factor) or secondary_uom.factor"/>
+        <span t-esc="'{} {} {}'.format(secondary_uom.name, factor, secondary_uom.product_tmpl_id.uom_id.name)"/>
+    </template>
+
+    <template id="product" inherit_id="website_sale.product" name="Manage secondary units">
+        <xpath expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']" position="after">
+            <t t-if="product.secondary_uom_ids">
+                <div class="mb8 secondary-unit">
+                    <t t-call="website_sale_secondary_unit.secondary_qty"/>
+                    <select class="form-control mt4" id="secondary_uom" name="secondary_uom_id">
+                        <option t-if="product.secondary_uom_ids and product.allow_uom_sell"
+                            value="0"
+                            t-att-selected="'selected' if not product.sale_secondary_uom_id else None"
+                            t-att-data-secondary-uom-factor="1.0"
+                            t-att-data-product-uom-factor="1.0">
+                            <span t-esc="product.uom_id.name"/>
+                        </option>
+                        <t t-foreach="product.secondary_uom_ids" t-as="secondary_uom">
+                            <option t-att-value="secondary_uom.id"
+                                    t-att-selected="'selected' if product.sale_secondary_uom_id.id == secondary_uom.id else None"
+                                    t-att-data-secondary-uom-factor="secondary_uom.factor"
+                                    t-att-data-product-uom-factor="product.uom_id.factor">
+                                <t t-call="website_sale_secondary_unit.second_qty_description"/>
+                            </option>
+                        </t>
+                    </select>
+                </div>
+            </t>
+        </xpath>
+    </template>
+
+    <template id="product_quantity" inherit_id="website_sale.product_quantity">
+        <xpath expr="//input[@name='add_qty']/.." position="attributes">
+            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'hide' if product.secondary_uom_ids else None}</attribute>
+        </xpath>
+    </template>
+
+    <template id="cart_lines" inherit_id="website_sale.cart_lines">
+        <xpath expr="//td[hasclass('td-qty')]/div" position="before">
+            <t t-if="line.secondary_uom_id">
+                <span class="css_secondary_quantity input-group oe_website_spinner">
+                    <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json hidden-xs">
+                        <i class="fa fa-minus"></i>
+                    </a>
+                    <input type="text" class="js_secondary_quantity form-control secondary-quantity"
+                           t-att-data-line-id="line.id"
+                           t-att-data-product-id="line.product_id.id"
+                           t-att-data-secondary-uom-id="line.secondary_uom_id.id"
+                           t-att-data-secondary-uom-factor="line.secondary_uom_id.factor"
+                           t-att-data-product-uom-factor="line.product_uom.factor"
+                           t-att-value="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty" />
+                    <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json hidden-xs">
+                        <i class="fa fa-plus"></i>
+                    </a>
+                </span>
+                <div>
+                    <t t-call="website_sale_secondary_unit.second_qty_description">
+                        <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                    </t>
+                </div>
+            </t>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]" position="attributes">
+            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'hide' if line.secondary_uom_id else None}</attribute>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]" position="after">
+            <t t-if="not line.secondary_uom_id">
+                <span t-esc="line.product_uom.name"/>
+            </t>
+        </xpath>
+        <xpath expr="//th[hasclass('td-qty')]" position="after">
+            <th class="text-center td-qty">Quantity</th>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]" position="after">
+            <td class="text-center td-qty">
+                <span t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"/>
+                <span t-esc="line.product_uom.name"/>
+            </td>
+        </xpath>
+    </template>
+
+    <template id="payment" inherit_id="website_sale.payment">
+        <xpath expr="//td[hasclass('td-qty')]" position="inside">
+            <t t-if="line.secondary_uom_id">
+                <div t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"/>
+                <t t-call="website_sale_secondary_unit.second_qty_description">
+                    <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                </t>
+            </t>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
+            <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]/div" position="after">
+            <t t-if="not line.secondary_uom_id">
+                <span t-esc="line.product_uom.name"/>
+            </t>
+        </xpath>
+        <xpath expr="//th[hasclass('td-qty')]" position="after">
+            <th class="text-center td-qty">Quantity</th>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]" position="after">
+            <td class="text-center td-qty">
+                <span t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"/>
+                <span t-esc="line.product_uom.name"/>
+            </td>
+        </xpath>
+    </template>
+
+    <template id="confirmation" inherit_id="website_sale.confirmation">
+        <xpath expr="//td[hasclass('td-qty')]" position="inside">
+            <t t-if="line.secondary_uom_id">
+                <span t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"/>
+                <t t-call="website_sale_secondary_unit.second_qty_description">
+                    <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                </t>
+            </t>
+        </xpath>
+        <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
+            <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
+        </xpath>
+    </template>
+
+    <template id="cart_popover" inherit_id="website_sale.cart_popover">
+        <xpath expr="//small" position="after">
+            <small t-if="line.secondary_uom_id">
+                Qty: <t t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty" />
+                <t t-call="website_sale_secondary_unit.second_qty_description">
+                    <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                </t>
+            </small>
+        </xpath>
+        <xpath expr="//small" position="attributes">
+            <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
+        </xpath>
+    </template>
+
+</odoo>

From 6983a1ae94ef220fa93d86895d761c6254517cbd Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Tue, 16 Apr 2019 11:02:03 +0200
Subject: [PATCH 02/32] [11.0][FIX] website_sale_secondary_unit: Crash if
 product_uom not come in values

---
 website_sale_secondary_unit/models/sale_order.py | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 8607c7d4ea..39ef484876 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -73,9 +73,11 @@ def create(self, vals):
         SecondaryUom = self.env['product.secondary.unit']
         secondary_uom = SecondaryUom.browse(
             vals.get('secondary_uom_id', False))
-        product_uom = self.env['product.uom'].browse(vals['product_uom'])
+        product_uom = self.env['product.uom'].browse(
+            vals.get('product_uom', False))
         if secondary_uom:
-            factor = secondary_uom.factor * product_uom.factor
+            factor = (secondary_uom.factor * (product_uom and
+                      product_uom.factor or 1.0))
             vals['secondary_uom_qty'] = float_round(
                 vals['product_uom_qty'] / (factor or 1.0),
                 precision_rounding=secondary_uom.uom_id.rounding

From 4783de2f8da9a6a208dcb257d50ed13c70b6c2ce Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Thu, 18 Apr 2019 12:24:49 +0200
Subject: [PATCH 03/32] [11.0][FIX] website_sale_secondary_unit: Fix tour tests

---
 website_sale_secondary_unit/i18n/es.po              |  6 ++++++
 .../src/js/website_sale_secondary_unit_tour.js      | 13 ++++++++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index 47f94e9cd7..1795ecc2ef 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -23,6 +23,12 @@ msgstr ""
 msgid "Allow to sell in unit of measure"
 msgstr "Permitir vender en la unidad de medida"
 
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_template
 msgid "Product Template"
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index d0d8098259..f4c00a671e 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -7,13 +7,24 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
     var tour = require("web_tour.tour");
     var base = require("web_editor.base");
 
+    // Get an option value by its text
+    // HACK https://github.com/odoo/odoo/pull/32718
+    function opt_val (option_text) {
+        return function (action_helper) {
+            var option_id = this.$anchor.children(_.str.sprintf(
+                "option:contains('%s')", option_text
+            )).val();
+            action_helper.text(option_id);
+        };
+    }
+
     var steps = [
         {
             trigger: "a:contains('iPod')",
         },
         {
             trigger: "#secondary_uom",
-            run: "text 1",
+            run: opt_val("Box 5 Unit(s)"),
         },
         {
             trigger: "#add_to_cart",

From db5476c14ee0c503680842f7347a2f0ecb3b20ce Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Fri, 14 Jun 2019 11:40:15 +0200
Subject: [PATCH 04/32] [11.0][IMP] website_sale_secondary_unit: Display
 product uom after price when product has secondary units defined

---
 .../static/description/index.html             |  2 +-
 .../js/website_sale_secondary_unit_tour.js    |  2 +-
 .../views/templates.xml                       | 29 +++++++++++++++++++
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index ddb338b603..0859660391 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
 <title>Website Sale Secondary Unit</title>
 <style type="text/css">
 
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index f4c00a671e..acad9f64c1 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -28,7 +28,7 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
         },
         {
             trigger: "#add_to_cart",
-            extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(5))",
+            extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(5)):has(.price_uom)",
         },
         {
             trigger: "a[href='/shop']",
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index b5aa022d4b..877f52a211 100755
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -47,6 +47,14 @@
         </xpath>
     </template>
 
+    <template id="product_price" inherit_id="website_sale.product_price">
+        <xpath expr="//b[@t-esc='product.website_price']" position="after">
+            <t t-if="product.secondary_uom_ids">
+                / <span class="css_editable_mode_hidden price_uom" t-field="product.uom_id"/>
+            </t>
+        </xpath>
+    </template>
+
     <template id="product_quantity" inherit_id="website_sale.product_quantity">
         <xpath expr="//input[@name='add_qty']/.." position="attributes">
             <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'hide' if product.secondary_uom_ids else None}</attribute>
@@ -95,6 +103,12 @@
                 <span t-esc="line.product_uom.name"/>
             </td>
         </xpath>
+        <!-- Display product uom to price column to clarify that price is per product unit -->
+        <xpath expr="//td[@name='price']" position="inside">
+            <t t-if="line.product_id.secondary_uom_ids">
+                / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
+            </t>
+        </xpath>
     </template>
 
     <template id="payment" inherit_id="website_sale.payment">
@@ -123,6 +137,12 @@
                 <span t-esc="line.product_uom.name"/>
             </td>
         </xpath>
+        <!-- Display product uom to price column to clarify that price is per product unit -->
+        <xpath expr="//td[hasclass('td-price')]" position="inside">
+            <t t-if="line.product_id.secondary_uom_ids">
+                / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
+            </t>
+        </xpath>
     </template>
 
     <template id="confirmation" inherit_id="website_sale.confirmation">
@@ -137,6 +157,15 @@
         <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
             <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
         </xpath>
+        <!-- Display product uom to price column to clarify that price is per product unit -->
+        <xpath expr="//td[hasclass('td-price')]/span/div" position="attributes">
+            <attribute name="class" separator=" " add="pull-left"/>
+        </xpath>
+        <xpath expr="//td[hasclass('td-price')]/span" position="inside">
+            <t t-if="line.product_id.secondary_uom_ids">
+                / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
+            </t>
+        </xpath>
     </template>
 
     <template id="cart_popover" inherit_id="website_sale.cart_popover">

From 7f4006cf7bf8884eb6453d2743d4b5e7473073a3 Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Thu, 24 Oct 2019 12:15:42 +0200
Subject: [PATCH 05/32] [MIG] website_sale_secondary_unit: Migration to v12.0

---
 website_sale_secondary_unit/README.rst        |  10 +-
 website_sale_secondary_unit/__manifest__.py   |   6 +-
 website_sale_secondary_unit/i18n/es.po        |  50 ++++---
 .../i18n/website_sale_secondary_unit.pot      |  46 ++++---
 .../migrations/12.0.1.0.0/pre-migration.py    |  15 +++
 .../models/product_secondary_unit.py          |   2 +-
 .../models/sale_order.py                      |  38 +++---
 .../security/ir.model.access.csv              |   5 -
 .../static/description/index.html             |   6 +-
 .../js/website_sale_secondary_unit_tour.js    |   9 +-
 .../website_sale_secondary_unit.scss}         |   0
 .../tests/test_website_sale_secondary_unit.py |  26 +++-
 website_sale_secondary_unit/views/assets.xml  |   4 +-
 .../views/templates.xml                       | 124 ++++++++----------
 14 files changed, 189 insertions(+), 152 deletions(-)
 create mode 100644 website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
 delete mode 100644 website_sale_secondary_unit/security/ir.model.access.csv
 rename website_sale_secondary_unit/static/src/{less/website_sale_secondary_unit.less => scss/website_sale_secondary_unit.scss} (100%)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index 9e44e6218b..59c8b5ecea 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -14,13 +14,13 @@ Website Sale Secondary Unit
     :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_secondary_unit
+    :target: https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit
     :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_secondary_unit
+    :target: https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_secondary_unit
     :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| 
@@ -52,7 +52,7 @@ Bug Tracker
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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 <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
 
@@ -82,6 +82,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 <https://github.com/OCA/e-commerce/tree/11.0/website_sale_secondary_unit>`_ project on GitHub.
+This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit>`_ project on GitHub.
 
 You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index b9fbb39de0..798b64d786 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     'name': 'Website Sale Secondary Unit',
     'summary': 'Allow manage secondary units in website shop',
-    'version': '11.0.1.0.0',
+    'version': '12.0.1.0.0',
     'development_status': 'Beta',
     'category': 'Website',
     'website': 'https://github.com/OCA/e-commerce',
@@ -16,15 +16,11 @@
         'sale_order_secondary_unit',
     ],
     'data': [
-        'security/ir.model.access.csv',
         'security/website_sale_secondary_unit.xml',
         'views/assets.xml',
         'views/product_template_views.xml',
         'views/product_secondary_unit_views.xml',
         'views/templates.xml',
     ],
-    'demo': [
-        'data/demo.xml',
-    ],
     'post_init_hook': 'post_init_hook',
 }
diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index 1795ecc2ef..aac9e70f40 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -18,15 +18,25 @@ msgstr ""
 "X-Generator: Poedit 2.0.6\n"
 
 #. module: website_sale_secondary_unit
-#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product_allow_uom_sell
-#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template_allow_uom_sell
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Add one"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
 msgid "Allow to sell in unit of measure"
 msgstr "Permitir vender en la unidad de medida"
 
 #. module: website_sale_secondary_unit
-#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
-#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
-msgid "Box"
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
+msgid "Is published"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "Product Secondary Unit"
 msgstr ""
 
 #. module: website_sale_secondary_unit
@@ -35,32 +45,36 @@ msgid "Product Template"
 msgstr "Plantilla de producto"
 
 #. module: website_sale_secondary_unit
-#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
 msgid "Qty:"
 msgstr "Ctdad."
 
 #. module: website_sale_secondary_unit
-#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model:ir.ui.view,arch_db:website_sale_secondary_unit.payment
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr "Cantidad"
 
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Remove one"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Quotation"
-msgstr "Presupuesto"
+#, fuzzy
+#| msgid "Sales Order Line"
+msgid "Sale Order"
+msgstr "Línea de pedido"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr "Línea de pedido"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit_website_published
-msgid "Visible in Website"
-msgstr "Visible en website"
+#~ msgid "Quotation"
+#~ msgstr "Presupuesto"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
-msgid "product.secondary.unit"
-msgstr ""
+#~ msgid "Visible in Website"
+#~ msgstr "Visible en website"
diff --git a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
index c3463815ea..32d49e6daf 100644
--- a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
+++ b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
@@ -4,7 +4,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Odoo Server 11.0\n"
+"Project-Id-Version: Odoo Server 12.0\n"
 "Report-Msgid-Bugs-To: \n"
 "Last-Translator: <>\n"
 "Language-Team: \n"
@@ -14,15 +14,25 @@ msgstr ""
 "Plural-Forms: \n"
 
 #. module: website_sale_secondary_unit
-#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product_allow_uom_sell
-#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template_allow_uom_sell
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Add one"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
 msgid "Allow to sell in unit of measure"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
-#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
-msgid "Box"
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
+msgid "Is published"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "Product Secondary Unit"
 msgstr ""
 
 #. module: website_sale_secondary_unit
@@ -31,33 +41,29 @@ msgid "Product Template"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
 msgid "Qty:"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model:ir.ui.view,arch_db:website_sale_secondary_unit.payment
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Quotation"
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Remove one"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
-msgid "Sales Order Line"
-msgstr ""
-
-#. module: website_sale_secondary_unit
-#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit_website_published
-msgid "Visible in Website"
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sale Order"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
-msgid "product.secondary.unit"
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
 msgstr ""
 
diff --git a/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py b/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
new file mode 100644
index 0000000000..754991bfd0
--- /dev/null
+++ b/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
@@ -0,0 +1,15 @@
+# Copyright 2020 Tecnativa - Sergio Teruel
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from openupgradelib import openupgrade
+
+
+_field_renames = [
+    ('product.secondary.unit', 'product_secondary_unit',
+     'website_published', 'is_published'),
+]
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    openupgrade.rename_fields(env, _field_renames)
diff --git a/website_sale_secondary_unit/models/product_secondary_unit.py b/website_sale_secondary_unit/models/product_secondary_unit.py
index dd2b1f9f56..f86fe793e0 100644
--- a/website_sale_secondary_unit/models/product_secondary_unit.py
+++ b/website_sale_secondary_unit/models/product_secondary_unit.py
@@ -7,4 +7,4 @@ class ProductSecondaryUnit(models.Model):
     _inherit = ['product.secondary.unit', 'website.published.mixin']
     _name = 'product.secondary.unit'
 
-    website_published = fields.Boolean(default=True)
+    is_published = fields.Boolean(default=True)
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 39ef484876..6e7e92c09c 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -45,16 +45,15 @@ def _cart_update(self, product_id=None, line_id=None, add_qty=0, set_qty=0,
         ctx = self.env.context.copy()
         if secondary_uom_id:
             ctx['secondary_uom_id'] = secondary_uom_id
-        res = super(SaleOrder, self.with_context(ctx))._cart_update(
+        return super(SaleOrder, self.with_context(ctx))._cart_update(
             product_id=product_id,
             line_id=line_id,
             add_qty=add_qty,
             set_qty=set_qty,
             attributes=attributes, **kwargs)
-        return res
 
     def _compute_cart_info(self):
-        super(SaleOrder, self)._compute_cart_info()
+        super()._compute_cart_info()
         for order in self:
             secondary_unit_lines = order.website_order_line.filtered(
                 'secondary_uom_id')
@@ -69,30 +68,33 @@ def _compute_cart_info(self):
 class SaleOrderLine(models.Model):
     _inherit = "sale.order.line"
 
-    def create(self, vals):
+    @api.model_create_multi
+    def create(self, vals_list):
         SecondaryUom = self.env['product.secondary.unit']
-        secondary_uom = SecondaryUom.browse(
-            vals.get('secondary_uom_id', False))
-        product_uom = self.env['product.uom'].browse(
-            vals.get('product_uom', False))
-        if secondary_uom:
-            factor = (secondary_uom.factor * (product_uom and
-                      product_uom.factor or 1.0))
-            vals['secondary_uom_qty'] = float_round(
-                vals['product_uom_qty'] / (factor or 1.0),
-                precision_rounding=secondary_uom.uom_id.rounding
-            )
-        return super(SaleOrderLine, self).create(vals)
+        Uom = self.env['uom.uom']
+        for vals in vals_list:
+            secondary_uom = SecondaryUom.browse(
+                vals.get('secondary_uom_id', False))
+            uom = Uom.browse(vals.get('product_uom', False))
+            if secondary_uom:
+                factor = (secondary_uom.factor * (uom.factor or 1.0))
+                vals['secondary_uom_qty'] = float_round(
+                    vals['product_uom_qty'] / (factor or 1.0),
+                    precision_rounding=secondary_uom.uom_id.rounding
+                )
+        return super(SaleOrderLine, self).create(vals_list)
 
     def write(self, vals):
         SecondaryUom = self.env['product.secondary.unit']
+        Uom = self.env['uom.uom']
         for line in self:
             secondary_uom = ('secondary_uom_id' in vals and
                              SecondaryUom.browse(vals['secondary_uom_id']) or
                              line.secondary_uom_id)
+            uom = ('product_uom' in vals and Uom.browse(vals['product_uom']) or
+                   line.product_uom)
             if 'product_uom_qty' in vals and secondary_uom:
-                factor = secondary_uom.factor * vals.get(
-                    'product_uom', line.product_uom.factor)
+                factor = secondary_uom.factor * uom.factor
                 vals['secondary_uom_qty'] = float_round(
                     vals['product_uom_qty'] / (factor or 1.0),
                     precision_rounding=secondary_uom.uom_id.rounding
diff --git a/website_sale_secondary_unit/security/ir.model.access.csv b/website_sale_secondary_unit/security/ir.model.access.csv
deleted file mode 100644
index 2c3a3e2827..0000000000
--- a/website_sale_secondary_unit/security/ir.model.access.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_product_secondary_unit_public,access_product_second_unit_public,product_secondary_unit.model_product_secondary_unit,base.group_public,1,0,0,0
-access_product_secondary_unit_portal,access_product_second_unit_portal,product_secondary_unit.model_product_secondary_unit,base.group_portal,1,0,0,0
-access_product_uom_public,access_product_uom_public,product.model_product_uom,base.group_public,1,0,0,0
-access_product_uom_portal,access_product_uom_portal,product.model_product_uom,base.group_portal,1,0,0,0
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index 0859660391..c2f6ae880b 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -367,7 +367,7 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/11.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-11-0/e-commerce-11-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/11.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
@@ -401,7 +401,7 @@ <h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
-<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2011.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
@@ -425,7 +425,7 @@ <h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
 <p>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.</p>
-<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/11.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
 <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
 </div>
 </div>
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index acad9f64c1..1142392bc3 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -20,7 +20,7 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
 
     var steps = [
         {
-            trigger: "a:contains('iPod')",
+            trigger: "a:contains('Customizable Desk')",
         },
         {
             trigger: "#secondary_uom",
@@ -35,19 +35,16 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
             extra_trigger: "span:contains(Box 5 Unit(s))"
         },
         {
-            trigger: "a:contains('iPod')",
+            trigger: "a:contains('Customizable Desk')",
         },
         {
             trigger: "#add_to_cart",
             extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(1))",
         },
         {
-            trigger: "a[href='/shop/checkout']",
+            trigger: "a[href='/shop/checkout?express=1']",
             extra_trigger: "span:containsExact(Unit(s))"
         },
-        {
-            trigger: "a[href='/shop/confirm_order']",
-        },
         {
             trigger: "#o_payment_form_pay",
             extra_trigger: "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))"
diff --git a/website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less b/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss
similarity index 100%
rename from website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less
rename to website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index c17e0d0b98..351009b4e9 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -4,6 +4,30 @@
 
 
 class WebsiteSaleSecondaryUnitHttpCase(HttpCase):
+    def setUp(self):
+        super().setUp()
+        # Models
+        ProductSecondaryUnit = self.env['product.secondary.unit']
+        product_uom_unit = self.env.ref('uom.product_uom_unit')
+        self.product_template = self.env.ref(
+            'product.product_product_4_product_template')
+        vals = {
+            'name': 'Box',
+            'uom_id': product_uom_unit.id,
+            'factor': 5.0,
+            'product_tmpl_id': self.product_template.id,
+            'website_published': True,
+        }
+        self.secondary_unit_box_5 = ProductSecondaryUnit.create(vals)
+        self.secondary_unit_box_10 = ProductSecondaryUnit.create(
+            dict(vals, factor=10.0))
+        self.product_template.write({
+            'secondary_uom_ids': [
+                (6, 0, [self.secondary_unit_box_5.id,
+                        self.secondary_unit_box_10.id]),
+            ],
+            'optional_product_ids': [(6, 0, [])]
+        })
 
     def test_ui_website(self):
         """Test frontend tour."""
@@ -11,7 +35,7 @@ def test_ui_website(self):
             "odoo.__DEBUG__.services['web_tour.tour']",
             "website_sale_secondary_unit",
         )
-        self.phantom_js(
+        self.browser_js(
             url_path="/",
             code="%s.run('%s')" % tour,
             ready="%s.tours['%s'].ready" % tour,
diff --git a/website_sale_secondary_unit/views/assets.xml b/website_sale_secondary_unit/views/assets.xml
index 0af2522c19..8ee3edcba3 100644
--- a/website_sale_secondary_unit/views/assets.xml
+++ b/website_sale_secondary_unit/views/assets.xml
@@ -6,8 +6,8 @@
                     src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js"/>
             <script type="text/javascript"
                     src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"/>
-            <link type="text/less" rel="stylesheet"
-                  href="/website_sale_secondary_unit/static/src/less/website_sale_secondary_unit.less"/>
+            <link type="text/scss" rel="stylesheet"
+                  href="/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss"/>
         </xpath>
     </template>
 </odoo>
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index 877f52a211..2d61d0a0c2 100755
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -2,42 +2,51 @@
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-
+    <!--
+    Get secondary uom and product uom as sudo to avoid create new ACL's for
+    portal and public users for security reasons
+    -->
     <template id="secondary_qty">
         <div class="css_quantity input-group oe_website_spinner" contenteditable="false">
-            <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json">
-                <i class="fa fa-minus"></i>
-            </a>
+            <div class="input-group-prepend">
+                <a t-attf-href="#" class="btn btn-secondary js_add_cart_json" aria-label="Remove one" title="Remove one">
+                    <i class="fa fa-minus"/>
+                </a>
+            </div>
             <input type="text" class="form-control secondary-quantity" data-min="1" name="add_secondary_qty" value="1"/>
-            <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json">
-                <i class="fa fa-plus"></i>
-            </a>
+            <div class="input-group-append">
+                <a t-attf-href="#" class="btn btn-secondary float_left js_add_cart_json" aria-label="Add one" title="Add one">
+                    <i class="fa fa-plus"/>
+                </a>
+            </div>
         </div>
     </template>
 
     <template id="second_qty_description">
-        <t t-set="factor" t-value="int(secondary_uom.factor) == secondary_uom.factor and int(secondary_uom.factor) or secondary_uom.factor"/>
-        <span t-esc="'{} {} {}'.format(secondary_uom.name, factor, secondary_uom.product_tmpl_id.uom_id.name)"/>
+        <t t-set="secondary_uom_sudo" t-value="secondary_uom.sudo()"/>
+        <t t-set="factor" t-value="int(secondary_uom_sudo.factor) == secondary_uom_sudo.factor and int(secondary_uom_sudo.factor) or secondary_uom_sudo.factor"/>
+        <span t-esc="'{} {} {}'.format(secondary_uom_sudo.name, factor, secondary_uom_sudo.product_tmpl_id.uom_id.name)"/>
     </template>
 
     <template id="product" inherit_id="website_sale.product" name="Manage secondary units">
         <xpath expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']" position="after">
-            <t t-if="product.secondary_uom_ids">
+            <t t-set="product_secondary_uom_ids_sudo" t-value="product.sudo().secondary_uom_ids"/>
+            <t t-if="product_secondary_uom_ids_sudo">
                 <div class="mb8 secondary-unit">
                     <t t-call="website_sale_secondary_unit.secondary_qty"/>
                     <select class="form-control mt4" id="secondary_uom" name="secondary_uom_id">
-                        <option t-if="product.secondary_uom_ids and product.allow_uom_sell"
+                        <option t-if="product_secondary_uom_ids_sudo and product.allow_uom_sell"
                             value="0"
                             t-att-selected="'selected' if not product.sale_secondary_uom_id else None"
                             t-att-data-secondary-uom-factor="1.0"
                             t-att-data-product-uom-factor="1.0">
-                            <span t-esc="product.uom_id.name"/>
+                            <span t-esc="product.uom_id.sudo().name"/>
                         </option>
-                        <t t-foreach="product.secondary_uom_ids" t-as="secondary_uom">
+                        <t t-foreach="product_secondary_uom_ids_sudo" t-as="secondary_uom">
                             <option t-att-value="secondary_uom.id"
-                                    t-att-selected="'selected' if product.sale_secondary_uom_id.id == secondary_uom.id else None"
+                                    t-att-selected="'selected' if product.sudo().sale_secondary_uom_id.id == secondary_uom.id else None"
                                     t-att-data-secondary-uom-factor="secondary_uom.factor"
-                                    t-att-data-product-uom-factor="product.uom_id.factor">
+                                    t-att-data-product-uom-factor="product.sudo().uom_id.factor">
                                 <t t-call="website_sale_secondary_unit.second_qty_description"/>
                             </option>
                         </t>
@@ -48,8 +57,8 @@
     </template>
 
     <template id="product_price" inherit_id="website_sale.product_price">
-        <xpath expr="//b[@t-esc='product.website_price']" position="after">
-            <t t-if="product.secondary_uom_ids">
+        <xpath expr="//b[hasclass('oe_price')]" position="after">
+            <t t-if="product.sudo().secondary_uom_ids">
                 / <span class="css_editable_mode_hidden price_uom" t-field="product.uom_id"/>
             </t>
         </xpath>
@@ -57,28 +66,33 @@
 
     <template id="product_quantity" inherit_id="website_sale.product_quantity">
         <xpath expr="//input[@name='add_qty']/.." position="attributes">
-            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'hide' if product.secondary_uom_ids else None}</attribute>
+            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'d-none' if product.sudo().secondary_uom_ids else None}</attribute>
         </xpath>
     </template>
 
     <template id="cart_lines" inherit_id="website_sale.cart_lines">
         <xpath expr="//td[hasclass('td-qty')]/div" position="before">
-            <t t-if="line.secondary_uom_id">
-                <span class="css_secondary_quantity input-group oe_website_spinner">
-                    <a t-attf-href="#" class="mb8 input-group-addon js_add_cart_json hidden-xs">
-                        <i class="fa fa-minus"></i>
-                    </a>
+            <t t-if="line.sudo().secondary_uom_id">
+                <div class="css_secondary_quantity input-group mx-auto oe_website_spinner">
+                    <div class="input-group-prepend">
+                        <a t-attf-href="#" class="btn btn-link js_add_cart_json d-xs d-md-inline-block" aria-label="Remove one" title="Remove one">
+                            <i class="fa fa-minus"/>
+                        </a>
+                    </div>
+                    <t t-set="line_secondary_uom_sudo" t-value="line.sudo().secondary_uom_id"/>
                     <input type="text" class="js_secondary_quantity form-control secondary-quantity"
                            t-att-data-line-id="line.id"
                            t-att-data-product-id="line.product_id.id"
-                           t-att-data-secondary-uom-id="line.secondary_uom_id.id"
-                           t-att-data-secondary-uom-factor="line.secondary_uom_id.factor"
-                           t-att-data-product-uom-factor="line.product_uom.factor"
+                           t-att-data-secondary-uom-id="line_secondary_uom_sudo.id"
+                           t-att-data-secondary-uom-factor="line_secondary_uom_sudo.factor"
+                           t-att-data-product-uom-factor="line.product_uom.sudo().factor"
                            t-att-value="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty" />
-                    <a t-attf-href="#" class="mb8 input-group-addon float_left js_add_cart_json hidden-xs">
-                        <i class="fa fa-plus"></i>
-                    </a>
-                </span>
+                    <div class="input-group-append">
+                        <a t-attf-href="#" class="btn btn-link float_left js_add_cart_json d-xs d-md-inline-block" aria-label="Add one" title="Add one">
+                            <i class="fa fa-plus"/>
+                        </a>
+                    </div>
+                </div>
                 <div>
                     <t t-call="website_sale_secondary_unit.second_qty_description">
                         <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
@@ -87,11 +101,11 @@
             </t>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]" position="attributes">
-            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'hide' if line.secondary_uom_id else None}</attribute>
+            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'d-none' if line.secondary_uom_id else None}</attribute>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]" position="after">
             <t t-if="not line.secondary_uom_id">
-                <span t-esc="line.product_uom.name"/>
+                <span t-esc="line.product_uom.sudo().name"/>
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
@@ -100,18 +114,18 @@
         <xpath expr="//td[hasclass('td-qty')]" position="after">
             <td class="text-center td-qty">
                 <span t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"/>
-                <span t-esc="line.product_uom.name"/>
+                <span t-esc="line.product_uom.sudo().name"/>
             </td>
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[@name='price']" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids">
+            <t t-if="line.product_id.secondary_uom_ids.sudo()">
                 / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
             </t>
         </xpath>
     </template>
 
-    <template id="payment" inherit_id="website_sale.payment">
+    <template id="cart_summary" inherit_id="website_sale.cart_summary">
         <xpath expr="//td[hasclass('td-qty')]" position="inside">
             <t t-if="line.secondary_uom_id">
                 <div t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"/>
@@ -121,11 +135,11 @@
             </t>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
-            <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
+            <attribute name="t-attf-class">#{'d-none' if line.secondary_uom_id else None}</attribute>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div" position="after">
             <t t-if="not line.secondary_uom_id">
-                <span t-esc="line.product_uom.name"/>
+                <span t-esc="line.product_uom.sudo().name"/>
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
@@ -134,51 +148,25 @@
         <xpath expr="//td[hasclass('td-qty')]" position="after">
             <td class="text-center td-qty">
                 <span t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"/>
-                <span t-esc="line.product_uom.name"/>
+                <span t-esc="line.product_uom.sudo().name"/>
             </td>
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[hasclass('td-price')]" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids">
-                / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
-            </t>
-        </xpath>
-    </template>
-
-    <template id="confirmation" inherit_id="website_sale.confirmation">
-        <xpath expr="//td[hasclass('td-qty')]" position="inside">
-            <t t-if="line.secondary_uom_id">
-                <span t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"/>
-                <t t-call="website_sale_secondary_unit.second_qty_description">
-                    <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
-                </t>
-            </t>
-        </xpath>
-        <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
-            <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
-        </xpath>
-        <!-- Display product uom to price column to clarify that price is per product unit -->
-        <xpath expr="//td[hasclass('td-price')]/span/div" position="attributes">
-            <attribute name="class" separator=" " add="pull-left"/>
-        </xpath>
-        <xpath expr="//td[hasclass('td-price')]/span" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids">
+            <t t-if="line.product_id.secondary_uom_ids.sudo()">
                 / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
             </t>
         </xpath>
     </template>
 
     <template id="cart_popover" inherit_id="website_sale.cart_popover">
-        <xpath expr="//small" position="after">
-            <small t-if="line.secondary_uom_id">
+        <xpath expr="//div[hasclass('col-9')]" position="inside">
+            <div t-if="line.secondary_uom_id.sudo()">
                 Qty: <t t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty" />
                 <t t-call="website_sale_secondary_unit.second_qty_description">
                     <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
                 </t>
-            </small>
-        </xpath>
-        <xpath expr="//small" position="attributes">
-            <attribute name="t-attf-class">#{'hide' if line.secondary_uom_id else None}</attribute>
+            </div>
         </xpath>
     </template>
 

From ddc939482684adbe23c968421a535c1aea55df4f Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Mon, 4 May 2020 16:29:12 +0200
Subject: [PATCH 06/32] [FIX] website_sale_secondary_unit: Fix quantity
 position in cart lines

---
 website_sale_secondary_unit/__manifest__.py                   | 2 +-
 .../static/src/scss/website_sale_secondary_unit.scss          | 4 ++++
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 798b64d786..23360fb3e7 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     'name': 'Website Sale Secondary Unit',
     'summary': 'Allow manage secondary units in website shop',
-    'version': '12.0.1.0.0',
+    'version': '12.0.1.0.1',
     'development_status': 'Beta',
     'category': 'Website',
     'website': 'https://github.com/OCA/e-commerce',
diff --git a/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss b/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss
index 6a89719af7..4d3aef3013 100644
--- a/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss
+++ b/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss
@@ -1,3 +1,7 @@
 .css_secondary_quantity {
     max-width: 150px;
 }
+.oe_website_sale input.js_secondary_quantity {
+    min-width: 48px;
+    text-align: center;
+}

From 21642fecca417a3638cb79242872f0c9b729cf26 Mon Sep 17 00:00:00 2001
From: Sergio Teruel <sergio.teruel@tecnativa.com>
Date: Tue, 21 Jul 2020 09:59:46 +0200
Subject: [PATCH 07/32] [IMP] website_sale_secondary_unit: Set default
 secondary uom for products when "Add to cart" view is enabled.

---
 website_sale_secondary_unit/__manifest__.py      |  2 +-
 website_sale_secondary_unit/models/sale_order.py | 14 ++++++++++++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 23360fb3e7..83076ffae9 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     'name': 'Website Sale Secondary Unit',
     'summary': 'Allow manage secondary units in website shop',
-    'version': '12.0.1.0.1',
+    'version': '12.0.1.1.0',
     'development_status': 'Beta',
     'category': 'Website',
     'website': 'https://github.com/OCA/e-commerce',
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 6e7e92c09c..397a72f63b 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -43,6 +43,20 @@ def _cart_update(self, product_id=None, line_id=None, add_qty=0, set_qty=0,
         else:
             secondary_uom_id = request.session.get('secondary_uom_id', False)
         ctx = self.env.context.copy()
+        if not secondary_uom_id:
+            # Check the default value for secondary uom or is a product can
+            # not allow to sell in base unit, so the default secondary uom
+            # will be the first secondary uom record.
+            product = self.env['product.product'].browse(product_id)
+            if not product.allow_uom_sell:
+                secondary_uom = (product.sale_secondary_uom_id or
+                                 product.secondary_uom_ids[:1])
+                if secondary_uom and add_qty:
+                    add_qty = float_round(
+                        float(add_qty) * secondary_uom.factor,
+                        precision_rounding=secondary_uom.uom_id.rounding
+                    )
+                    secondary_uom_id = secondary_uom.id
         if secondary_uom_id:
             ctx['secondary_uom_id'] = secondary_uom_id
         return super(SaleOrder, self.with_context(ctx))._cart_update(

From 7062b4ffcf2affcd0440dbf97b7a05c3e4d428a0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Volksdorf?= <volksdorf@smartpage.de>
Date: Tue, 11 Aug 2020 16:04:24 +0000
Subject: [PATCH 08/32] Added translation using Weblate (German)

---
 website_sale_secondary_unit/i18n/ca.po | 71 ++++++++++++++++++++++++++
 website_sale_secondary_unit/i18n/de.po | 71 ++++++++++++++++++++++++++
 website_sale_secondary_unit/i18n/es.po | 22 ++++----
 website_sale_secondary_unit/i18n/fr.po | 71 ++++++++++++++++++++++++++
 website_sale_secondary_unit/i18n/it.po | 71 ++++++++++++++++++++++++++
 5 files changed, 294 insertions(+), 12 deletions(-)
 create mode 100644 website_sale_secondary_unit/i18n/ca.po
 create mode 100644 website_sale_secondary_unit/i18n/de.po
 create mode 100644 website_sale_secondary_unit/i18n/fr.po
 create mode 100644 website_sale_secondary_unit/i18n/it.po

diff --git a/website_sale_secondary_unit/i18n/ca.po b/website_sale_secondary_unit/i18n/ca.po
new file mode 100644
index 0000000000..64126cba9f
--- /dev/null
+++ b/website_sale_secondary_unit/i18n/ca.po
@@ -0,0 +1,71 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#	* website_sale_secondary_unit
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2021-01-20 20:44+0000\n"
+"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\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_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Add one"
+msgstr "Afegir un"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
+msgid "Allow to sell in unit of measure"
+msgstr "Permetre vendre en una unitat de mesura"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
+msgid "Is published"
+msgstr "Està publicat"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "Product Secondary Unit"
+msgstr "Unitat secundària de producte"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_template
+msgid "Product Template"
+msgstr "Plantilla de producte"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+msgid "Qty:"
+msgstr "Quantitat:"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
+msgid "Quantity"
+msgstr "Quantitat"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Remove one"
+msgstr "Elimina un"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sale Order"
+msgstr "Comanda de venda"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Línia de comanda de venda"
diff --git a/website_sale_secondary_unit/i18n/de.po b/website_sale_secondary_unit/i18n/de.po
new file mode 100644
index 0000000000..622965020d
--- /dev/null
+++ b/website_sale_secondary_unit/i18n/de.po
@@ -0,0 +1,71 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#	* website_sale_secondary_unit
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2020-08-11 17:59+0000\n"
+"Last-Translator: André Volksdorf <volksdorf@smartpage.de>\n"
+"Language-Team: none\n"
+"Language: de\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 3.10\n"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Add one"
+msgstr "Hinzufügen"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
+msgid "Allow to sell in unit of measure"
+msgstr "Verkauf in Mengeneinheit erlauben"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
+msgid "Is published"
+msgstr "Veröffentlicht"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "Product Secondary Unit"
+msgstr "Sekundäre Produkt-Einheit"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_template
+msgid "Product Template"
+msgstr "Produkt-Vorlage"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+msgid "Qty:"
+msgstr "Menge:"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
+msgid "Quantity"
+msgstr "Menge"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Remove one"
+msgstr "Entfernen"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sale Order"
+msgstr "Auftrag"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Auftragsposition"
diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index aac9e70f40..c580e61bbe 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -7,21 +7,21 @@ msgstr ""
 "Project-Id-Version: Odoo Server 11.0\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-03-13 16:54+0000\n"
-"PO-Revision-Date: 2019-03-13 17:56+0100\n"
-"Last-Translator: \n"
+"PO-Revision-Date: 2020-11-03 13:08+0000\n"
+"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\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 3.10\n"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
 msgid "Add one"
-msgstr ""
+msgstr "Añadir uno"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
@@ -32,12 +32,12 @@ msgstr "Permitir vender en la unidad de medida"
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
 msgid "Is published"
-msgstr ""
+msgstr "Está publicado"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
 msgid "Product Secondary Unit"
-msgstr ""
+msgstr "Segunda unidad de producto"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_template
@@ -47,7 +47,7 @@ msgstr "Plantilla de producto"
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
 msgid "Qty:"
-msgstr "Ctdad."
+msgstr "Cantidad:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
@@ -59,14 +59,12 @@ msgstr "Cantidad"
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
 msgid "Remove one"
-msgstr ""
+msgstr "Quitar uno"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-#, fuzzy
-#| msgid "Sales Order Line"
 msgid "Sale Order"
-msgstr "Línea de pedido"
+msgstr "Pedido de venta"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
diff --git a/website_sale_secondary_unit/i18n/fr.po b/website_sale_secondary_unit/i18n/fr.po
new file mode 100644
index 0000000000..563076c6e3
--- /dev/null
+++ b/website_sale_secondary_unit/i18n/fr.po
@@ -0,0 +1,71 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#	* website_sale_secondary_unit
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2020-11-23 15:36+0000\n"
+"Last-Translator: Yann Papouin <y.papouin@dec-industrie.com>\n"
+"Language-Team: none\n"
+"Language: fr\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 3.10\n"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Add one"
+msgstr "Ajouter"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
+msgid "Allow to sell in unit of measure"
+msgstr "Autorise la vente dans l'unité de mesure par défaut"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
+msgid "Is published"
+msgstr "Est publié"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "Product Secondary Unit"
+msgstr "Unité de mesure secondaire"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_template
+msgid "Product Template"
+msgstr "Modèle d'article"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+msgid "Qty:"
+msgstr "Qté :"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
+msgid "Quantity"
+msgstr "Quantité"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Remove one"
+msgstr "Supprimer"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sale Order"
+msgstr "Commande client"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Ligne de commande de vente"
diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
new file mode 100644
index 0000000000..ffc4d303d9
--- /dev/null
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -0,0 +1,71 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+#	* website_sale_secondary_unit
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2020-08-26 10:00+0000\n"
+"Last-Translator: Francesco Foresti <francesco.foresti@ooops404.com>\n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.10\n"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Add one"
+msgstr "Aggiungi uno"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
+msgid "Allow to sell in unit of measure"
+msgstr "Permetti vendita in Unità di Misura base"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
+msgid "Is published"
+msgstr "E' pubblicato"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
+msgid "Product Secondary Unit"
+msgstr "Unità di Misura Secondaria"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_product_template
+msgid "Product Template"
+msgstr "Modello Prodotto"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
+msgid "Qty:"
+msgstr "Qty:"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
+msgid "Quantity"
+msgstr "Quantità"
+
+#. module: website_sale_secondary_unit
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
+#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.secondary_qty
+msgid "Remove one"
+msgstr "Rimuovi uno"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sale Order"
+msgstr "Ordine di Vendita"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
+msgstr "Riga Ordine di Vendita"

From 1769ae423ceb145266d84d111262facf24e8a062 Mon Sep 17 00:00:00 2001
From: Carlos Roca <carlos.roca@tecnativa.com>
Date: Wed, 17 Feb 2021 10:05:55 +0100
Subject: [PATCH 09/32] [IMP] website_sale_secondary_unit: black, isort,
 prettier

---
 website_sale_secondary_unit/__manifest__.py   |  39 ++--
 .../controllers/main.py                       |  38 ++--
 website_sale_secondary_unit/data/demo.xml     |  53 +++--
 website_sale_secondary_unit/hooks.py          |   6 +-
 .../migrations/12.0.1.0.0/pre-migration.py    |   9 +-
 .../models/product_secondary_unit.py          |   6 +-
 .../models/product_template.py                |   7 +-
 .../models/sale_order.py                      | 102 +++++----
 .../security/website_sale_secondary_unit.xml  |  22 +-
 .../src/js/website_sale_secondary_unit.js     | 178 ++++++++-------
 .../js/website_sale_secondary_unit_tour.js    |  31 +--
 .../tests/test_website_sale_secondary_unit.py |  42 ++--
 website_sale_secondary_unit/views/assets.xml  |  21 +-
 .../views/product_secondary_unit_views.xml    |  11 +-
 .../views/product_template_views.xml          |   8 +-
 .../views/templates.xml                       | 214 ++++++++++++------
 16 files changed, 467 insertions(+), 320 deletions(-)

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 83076ffae9..3e1422c05f 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -1,26 +1,23 @@
 # Copyright 2019 Tecnativa - Sergio Teruel
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 {
-    'name': 'Website Sale Secondary Unit',
-    'summary': 'Allow manage secondary units in website shop',
-    'version': '12.0.1.1.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',
-        'sale_order_secondary_unit',
+    "name": "Website Sale Secondary Unit",
+    "summary": "Allow manage secondary units in website shop",
+    "version": "12.0.1.1.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", "sale_order_secondary_unit",],
+    "data": [
+        "security/website_sale_secondary_unit.xml",
+        "views/assets.xml",
+        "views/product_template_views.xml",
+        "views/product_secondary_unit_views.xml",
+        "views/templates.xml",
     ],
-    'data': [
-        'security/website_sale_secondary_unit.xml',
-        'views/assets.xml',
-        'views/product_template_views.xml',
-        'views/product_secondary_unit_views.xml',
-        'views/templates.xml',
-    ],
-    'post_init_hook': 'post_init_hook',
+    "post_init_hook": "post_init_hook",
 }
diff --git a/website_sale_secondary_unit/controllers/main.py b/website_sale_secondary_unit/controllers/main.py
index 0140df3e0c..01308ec91c 100644
--- a/website_sale_secondary_unit/controllers/main.py
+++ b/website_sale_secondary_unit/controllers/main.py
@@ -1,31 +1,37 @@
 # Copyright 2019 Tecnativa - Sergio Teruel
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo.addons.website_sale.controllers.main import WebsiteSale
 from odoo import http
 from odoo.http import request
 
+from odoo.addons.website_sale.controllers.main import WebsiteSale
+
 
 class WebsiteSaleSecondaryUnit(WebsiteSale):
-
     @http.route()
     def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
         # Add secondary uom info to session
-        request.session.pop('secondary_uom_id', None)
-        if 'secondary_uom_id' in kw:
-            secondary_uom = request.env['product.secondary.unit'].browse(
-                int(kw['secondary_uom_id']))
-            request.session['secondary_uom_id'] = secondary_uom.id
+        request.session.pop("secondary_uom_id", None)
+        if "secondary_uom_id" in kw:
+            secondary_uom = request.env["product.secondary.unit"].browse(
+                int(kw["secondary_uom_id"])
+            )
+            request.session["secondary_uom_id"] = secondary_uom.id
         return super(WebsiteSaleSecondaryUnit, self).cart_update(
-            product_id, add_qty=add_qty, set_qty=set_qty, **kw)
+            product_id, add_qty=add_qty, set_qty=set_qty, **kw
+        )
 
     @http.route()
-    def cart_update_json(self, product_id, line_id=None, add_qty=None,
-                         set_qty=None, display=True):
-        so_line = request.env['sale.order.line'].browse(line_id)
-        request.session.pop('secondary_uom_id', None)
+    def cart_update_json(
+        self, product_id, line_id=None, add_qty=None, set_qty=None, display=True
+    ):
+        so_line = request.env["sale.order.line"].browse(line_id)
+        request.session.pop("secondary_uom_id", None)
         if so_line.sudo().secondary_uom_id:
-            request.session['secondary_uom_id'] = \
-                so_line.sudo().secondary_uom_id.id
+            request.session["secondary_uom_id"] = so_line.sudo().secondary_uom_id.id
         return super(WebsiteSaleSecondaryUnit, self).cart_update_json(
-            product_id, line_id=line_id, add_qty=add_qty, set_qty=set_qty,
-            display=display)
+            product_id,
+            line_id=line_id,
+            add_qty=add_qty,
+            set_qty=set_qty,
+            display=display,
+        )
diff --git a/website_sale_secondary_unit/data/demo.xml b/website_sale_secondary_unit/data/demo.xml
index 84873676c2..a5ed5594f0 100644
--- a/website_sale_secondary_unit/data/demo.xml
+++ b/website_sale_secondary_unit/data/demo.xml
@@ -1,26 +1,31 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <odoo noupdate="0">
-
-        <record id="secondary_unit_box_5" model="product.secondary.unit">
-            <field name="name">Box</field>
-            <field name="uom_id" ref="product.product_uom_unit"/>
-            <field name="factor">5.0</field>
-            <field name="product_tmpl_id" ref="product.product_product_11_product_template"/>
-            <field name="website_published">True</field>
-        </record>
-
-        <record id="secondary_unit_box_10" model="product.secondary.unit">
-            <field name="name">Box</field>
-            <field name="uom_id" ref="product.product_uom_unit"/>
-            <field name="factor">10.0</field>
-            <field name="product_tmpl_id" ref="product.product_product_11_product_template"/>
-            <field name="website_published">True</field>
-        </record>
-
-         <record id="product.product_product_11" model="product.product">
-            <field name="secondary_uom_ids" eval="[(6, 0, [ref('website_sale_secondary_unit.secondary_unit_box_5'),
-                                                           ref('website_sale_secondary_unit.secondary_unit_box_10')]),]"/>
-            <field name="allow_uom_sell" eval="True"/>
-        </record>
-
+    <record id="secondary_unit_box_5" model="product.secondary.unit">
+        <field name="name">Box</field>
+        <field name="uom_id" ref="product.product_uom_unit" />
+        <field name="factor">5.0</field>
+        <field
+            name="product_tmpl_id"
+            ref="product.product_product_11_product_template"
+        />
+        <field name="website_published">True</field>
+    </record>
+    <record id="secondary_unit_box_10" model="product.secondary.unit">
+        <field name="name">Box</field>
+        <field name="uom_id" ref="product.product_uom_unit" />
+        <field name="factor">10.0</field>
+        <field
+            name="product_tmpl_id"
+            ref="product.product_product_11_product_template"
+        />
+        <field name="website_published">True</field>
+    </record>
+    <record id="product.product_product_11" model="product.product">
+        <field
+            name="secondary_uom_ids"
+            eval="[(6, 0, [ref('website_sale_secondary_unit.secondary_unit_box_5'),
+                                                           ref('website_sale_secondary_unit.secondary_unit_box_10')]),]"
+        />
+        <field name="allow_uom_sell" eval="True" />
+    </record>
 </odoo>
diff --git a/website_sale_secondary_unit/hooks.py b/website_sale_secondary_unit/hooks.py
index 63727480e5..46644412cc 100644
--- a/website_sale_secondary_unit/hooks.py
+++ b/website_sale_secondary_unit/hooks.py
@@ -7,8 +7,10 @@ def post_init_hook(cr, registry):
     At installation time, set allow_uom_sell field as true for all products
     that have already been created.
     """
-    cr.execute("""
+    cr.execute(
+        """
         UPDATE product_template
         SET allow_uom_sell=true
         WHERE allow_uom_sell IS NULL;
-    """)
+    """
+    )
diff --git a/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py b/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
index 754991bfd0..be1c4deb2f 100644
--- a/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
+++ b/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
@@ -3,10 +3,13 @@
 
 from openupgradelib import openupgrade
 
-
 _field_renames = [
-    ('product.secondary.unit', 'product_secondary_unit',
-     'website_published', 'is_published'),
+    (
+        "product.secondary.unit",
+        "product_secondary_unit",
+        "website_published",
+        "is_published",
+    ),
 ]
 
 
diff --git a/website_sale_secondary_unit/models/product_secondary_unit.py b/website_sale_secondary_unit/models/product_secondary_unit.py
index f86fe793e0..9534704257 100644
--- a/website_sale_secondary_unit/models/product_secondary_unit.py
+++ b/website_sale_secondary_unit/models/product_secondary_unit.py
@@ -1,10 +1,10 @@
 # Copyright 2019 Tecnativa - Sergio Teruel
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import models, fields
+from odoo import fields, models
 
 
 class ProductSecondaryUnit(models.Model):
-    _inherit = ['product.secondary.unit', 'website.published.mixin']
-    _name = 'product.secondary.unit'
+    _inherit = ["product.secondary.unit", "website.published.mixin"]
+    _name = "product.secondary.unit"
 
     is_published = fields.Boolean(default=True)
diff --git a/website_sale_secondary_unit/models/product_template.py b/website_sale_secondary_unit/models/product_template.py
index c60e43e2f9..564d27859d 100644
--- a/website_sale_secondary_unit/models/product_template.py
+++ b/website_sale_secondary_unit/models/product_template.py
@@ -1,12 +1,11 @@
 # Copyright 2019 Tecnativa - Sergio Teruel
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import models, fields
+from odoo import fields, models
 
 
 class ProductTemplate(models.Model):
-    _inherit = 'product.template'
+    _inherit = "product.template"
 
     allow_uom_sell = fields.Boolean(
-        string='Allow to sell in unit of measure',
-        default=True,
+        string="Allow to sell in unit of measure", default=True,
     )
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 397a72f63b..029d9c1fef 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -14,68 +14,78 @@ def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs):
         Search sale order lines with secondary units
         """
         so_lines = super()._cart_find_product_line(
-            product_id=product_id, line_id=line_id, **kwargs)
+            product_id=product_id, line_id=line_id, **kwargs
+        )
         if so_lines:
             if line_id:
-                sol = self.env['sale.order.line'].browse(line_id)
+                sol = self.env["sale.order.line"].browse(line_id)
                 secondary_uom_id = sol.secondary_uom_id.id
             else:
-                secondary_uom_id = self.env.context.get(
-                    'secondary_uom_id', False)
+                secondary_uom_id = self.env.context.get("secondary_uom_id", False)
             so_lines = so_lines.filtered(
-                lambda x: x.secondary_uom_id.id == secondary_uom_id)
+                lambda x: x.secondary_uom_id.id == secondary_uom_id
+            )
         return so_lines
 
     @api.multi
     def _website_product_id_change(self, order_id, product_id, qty=0):
-        res = super()._website_product_id_change(
-            order_id, product_id, qty=qty)
-        secondary_uom_id = self.env.context.get('secondary_uom_id', False)
-        res['secondary_uom_id'] = secondary_uom_id
+        res = super()._website_product_id_change(order_id, product_id, qty=qty)
+        secondary_uom_id = self.env.context.get("secondary_uom_id", False)
+        res["secondary_uom_id"] = secondary_uom_id
         return res
 
     @api.multi
-    def _cart_update(self, product_id=None, line_id=None, add_qty=0, set_qty=0,
-                     attributes=None, **kwargs):
+    def _cart_update(
+        self,
+        product_id=None,
+        line_id=None,
+        add_qty=0,
+        set_qty=0,
+        attributes=None,
+        **kwargs
+    ):
         if line_id:
-            sol = self.env['sale.order.line'].browse(line_id)
+            sol = self.env["sale.order.line"].browse(line_id)
             secondary_uom_id = sol.secondary_uom_id.id
         else:
-            secondary_uom_id = request.session.get('secondary_uom_id', False)
+            secondary_uom_id = request.session.get("secondary_uom_id", False)
         ctx = self.env.context.copy()
         if not secondary_uom_id:
             # Check the default value for secondary uom or is a product can
             # not allow to sell in base unit, so the default secondary uom
             # will be the first secondary uom record.
-            product = self.env['product.product'].browse(product_id)
+            product = self.env["product.product"].browse(product_id)
             if not product.allow_uom_sell:
-                secondary_uom = (product.sale_secondary_uom_id or
-                                 product.secondary_uom_ids[:1])
+                secondary_uom = (
+                    product.sale_secondary_uom_id or product.secondary_uom_ids[:1]
+                )
                 if secondary_uom and add_qty:
                     add_qty = float_round(
                         float(add_qty) * secondary_uom.factor,
-                        precision_rounding=secondary_uom.uom_id.rounding
+                        precision_rounding=secondary_uom.uom_id.rounding,
                     )
                     secondary_uom_id = secondary_uom.id
         if secondary_uom_id:
-            ctx['secondary_uom_id'] = secondary_uom_id
+            ctx["secondary_uom_id"] = secondary_uom_id
         return super(SaleOrder, self.with_context(ctx))._cart_update(
             product_id=product_id,
             line_id=line_id,
             add_qty=add_qty,
             set_qty=set_qty,
-            attributes=attributes, **kwargs)
+            attributes=attributes,
+            **kwargs
+        )
 
     def _compute_cart_info(self):
         super()._compute_cart_info()
         for order in self:
-            secondary_unit_lines = order.website_order_line.filtered(
-                'secondary_uom_id')
+            secondary_unit_lines = order.website_order_line.filtered("secondary_uom_id")
             if secondary_unit_lines:
-                cart_secondary_quantity = int(sum(
-                    secondary_unit_lines.mapped('secondary_uom_qty')))
+                cart_secondary_quantity = int(
+                    sum(secondary_unit_lines.mapped("secondary_uom_qty"))
+                )
                 so_lines = order.website_order_line - secondary_unit_lines
-                cart_quantity = int(sum(so_lines.mapped('product_uom_qty')))
+                cart_quantity = int(sum(so_lines.mapped("product_uom_qty")))
                 order.cart_quantity = cart_quantity + cart_secondary_quantity
 
 
@@ -84,33 +94,37 @@ class SaleOrderLine(models.Model):
 
     @api.model_create_multi
     def create(self, vals_list):
-        SecondaryUom = self.env['product.secondary.unit']
-        Uom = self.env['uom.uom']
+        SecondaryUom = self.env["product.secondary.unit"]
+        Uom = self.env["uom.uom"]
         for vals in vals_list:
-            secondary_uom = SecondaryUom.browse(
-                vals.get('secondary_uom_id', False))
-            uom = Uom.browse(vals.get('product_uom', False))
+            secondary_uom = SecondaryUom.browse(vals.get("secondary_uom_id", False))
+            uom = Uom.browse(vals.get("product_uom", False))
             if secondary_uom:
-                factor = (secondary_uom.factor * (uom.factor or 1.0))
-                vals['secondary_uom_qty'] = float_round(
-                    vals['product_uom_qty'] / (factor or 1.0),
-                    precision_rounding=secondary_uom.uom_id.rounding
+                factor = secondary_uom.factor * (uom.factor or 1.0)
+                vals["secondary_uom_qty"] = float_round(
+                    vals["product_uom_qty"] / (factor or 1.0),
+                    precision_rounding=secondary_uom.uom_id.rounding,
                 )
         return super(SaleOrderLine, self).create(vals_list)
 
     def write(self, vals):
-        SecondaryUom = self.env['product.secondary.unit']
-        Uom = self.env['uom.uom']
+        SecondaryUom = self.env["product.secondary.unit"]
+        Uom = self.env["uom.uom"]
         for line in self:
-            secondary_uom = ('secondary_uom_id' in vals and
-                             SecondaryUom.browse(vals['secondary_uom_id']) or
-                             line.secondary_uom_id)
-            uom = ('product_uom' in vals and Uom.browse(vals['product_uom']) or
-                   line.product_uom)
-            if 'product_uom_qty' in vals and secondary_uom:
+            secondary_uom = (
+                "secondary_uom_id" in vals
+                and SecondaryUom.browse(vals["secondary_uom_id"])
+                or line.secondary_uom_id
+            )
+            uom = (
+                "product_uom" in vals
+                and Uom.browse(vals["product_uom"])
+                or line.product_uom
+            )
+            if "product_uom_qty" in vals and secondary_uom:
                 factor = secondary_uom.factor * uom.factor
-                vals['secondary_uom_qty'] = float_round(
-                    vals['product_uom_qty'] / (factor or 1.0),
-                    precision_rounding=secondary_uom.uom_id.rounding
+                vals["secondary_uom_qty"] = float_round(
+                    vals["product_uom_qty"] / (factor or 1.0),
+                    precision_rounding=secondary_uom.uom_id.rounding,
                 )
         return super(SaleOrderLine, self).write(vals)
diff --git a/website_sale_secondary_unit/security/website_sale_secondary_unit.xml b/website_sale_secondary_unit/security/website_sale_secondary_unit.xml
index bed211a681..bfe82ee86f 100644
--- a/website_sale_secondary_unit/security/website_sale_secondary_unit.xml
+++ b/website_sale_secondary_unit/security/website_sale_secondary_unit.xml
@@ -1,15 +1,19 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <odoo noupdate="1">
-
     <record id="product_secondary_unit_public" model="ir.rule">
         <field name="name">Public secondary unit</field>
-        <field name="model_id" ref="product_secondary_unit.model_product_secondary_unit"/>
+        <field
+            name="model_id"
+            ref="product_secondary_unit.model_product_secondary_unit"
+        />
         <field name="domain_force">[('website_published', '=', True)]</field>
-        <field name="groups" eval="[(4, ref('base.group_public')), (4, ref('base.group_portal'))]"/>
-        <field name="perm_read" eval="True"/>
-        <field name="perm_write" eval="False"/>
-        <field name="perm_create" eval="False"/>
-        <field name="perm_unlink" eval="False"/>
+        <field
+            name="groups"
+            eval="[(4, ref('base.group_public')), (4, ref('base.group_portal'))]"
+        />
+        <field name="perm_read" eval="True" />
+        <field name="perm_write" eval="False" />
+        <field name="perm_create" eval="False" />
+        <field name="perm_unlink" eval="False" />
     </record>
-
 </odoo>
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
index 8265d5b22f..41bea03713 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
@@ -1,88 +1,100 @@
-odoo.define('website_sale_secondary_unit.animation', function (require) {
-'use strict';
+odoo.define("website_sale_secondary_unit.animation", function(require) {
+    "use strict";
 
-var core = require('web.core');
-var sAnimation = require('website.content.snippets.animation');
+    var core = require("web.core");
+    var sAnimation = require("website.content.snippets.animation");
 
+    sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend({
+        selector: ".secondary-unit",
+        init: function(parent, editableMode) {
+            this._super.apply(this, arguments);
+            this.$secondary_uom = null;
+            this.$secondary_uom_qty = null;
+            this.$product_qty = null;
+            this.secondary_uom_qty = null;
+            this.secondary_uom_factor = null;
+            this.product_uom_factor = null;
+            this.product_qty = null;
+        },
+        start: function() {
+            var self = this;
+            self.$secondary_uom = $("#secondary_uom");
+            self.$secondary_uom_qty = $(".secondary-quantity");
+            self.$product_qty = $(".quantity");
+            self._setValues();
+            this.$target.on("change", ".secondary-quantity", function() {
+                self._onChangeSecondaryUom();
+            });
+            this.$target.on("change", "#secondary_uom", function() {
+                self._onChangeSecondaryUom();
+            });
+            this.$product_qty.on("change", null, function() {
+                self._onChangeProductQty();
+            });
+            if (self.secondary_uom_qty) {
+                self._onChangeSecondaryUom();
+            }
+        },
+        _setValues: function() {
+            this.secondary_uom_qty = parseFloat(
+                this.$target.find(".secondary-quantity").val()
+            );
+            this.secondary_uom_factor = parseFloat(
+                $("option:selected", this.$secondary_uom).data("secondary-uom-factor")
+            );
+            this.product_uom_factor = parseFloat(
+                $("option:selected", this.$secondary_uom).data("product-uom-factor")
+            );
+            this.product_qty = parseFloat($(".quantity").val());
+        },
 
-sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend({
-    selector: ".secondary-unit",
-    init: function (parent, editableMode) {
-        this._super.apply(this, arguments);
-        this.$secondary_uom = null;
-        this.$secondary_uom_qty = null;
-        this.$product_qty = null;
-        this.secondary_uom_qty = null;
-        this.secondary_uom_factor = null;
-        this.product_uom_factor = null;
-        this.product_qty = null;
-    },
-    start: function () {
-        var self = this;
-        self.$secondary_uom = $('#secondary_uom');
-        self.$secondary_uom_qty = $('.secondary-quantity');
-        self.$product_qty = $('.quantity');
-        self._setValues();
-        this.$target.on('change', '.secondary-quantity', function () {
-            self._onChangeSecondaryUom();
-        });
-        this.$target.on('change', '#secondary_uom', function () {
-            self._onChangeSecondaryUom();
-        });
-        this.$product_qty.on('change', null, function () {
-            self._onChangeProductQty();
-        });
-        if(self.secondary_uom_qty){
-            self._onChangeSecondaryUom();
-        };
-    },
-    _setValues: function(){
-        this.secondary_uom_qty = parseFloat(this.$target.find('.secondary-quantity').val());
-        this.secondary_uom_factor = parseFloat($('option:selected', this.$secondary_uom).data('secondary-uom-factor'));
-        this.product_uom_factor = parseFloat($('option:selected', this.$secondary_uom).data('product-uom-factor'));
-        this.product_qty = parseFloat($('.quantity').val());
-    },
-
-    _onChangeSecondaryUom: function(){
-        this._setValues()
-        var factor = this.secondary_uom_factor * this.product_uom_factor;
-        this.$product_qty.val(this.secondary_uom_qty * factor)
-    },
-    _onChangeProductQty: function(){
-        this._setValues();
-        var factor = this.secondary_uom_factor * this.product_uom_factor;
-        this.$secondary_uom_qty.val(this.product_qty / factor);
-    },
-});
-
-sAnimation.registry.sale_secondary_unit_cart = sAnimation.Class.extend({
-    selector: ".oe_cart",
-    init: function (parent, editableMode) {
-        this._super.apply(this, arguments);
-        this.$product_qty = null;
-        this.secondary_uom_qty = null;
-        this.secondary_uom_factor = null;
-        this.product_uom_factor = null;
-        this.product_qty = null;
-    },
-    start: function () {
-        var self = this;
-        this.$target.on('change', 'input.js_secondary_quantity[data-line-id]', function () {
-            self._onChangeSecondaryUom(this);
-        });
-    },
-    _setValues: function(order_line){
-        this.$product_qty = this.$target.find('.quantity[data-line-id='+ order_line.dataset.lineId +']')
-        this.secondary_uom_qty = parseFloat(order_line.value);
-        this.secondary_uom_factor = parseFloat(order_line.dataset.secondaryUomFactor);
-        this.product_uom_factor = parseFloat(order_line.dataset.productUomFactor);
-    },
-    _onChangeSecondaryUom: function(order_line){
-        this._setValues(order_line);
-        var factor = this.secondary_uom_factor * this.product_uom_factor;
-        this.$product_qty.val(this.secondary_uom_qty * factor);
-        this.$product_qty.trigger('change');
-    },
-});
+        _onChangeSecondaryUom: function() {
+            this._setValues();
+            var factor = this.secondary_uom_factor * this.product_uom_factor;
+            this.$product_qty.val(this.secondary_uom_qty * factor);
+        },
+        _onChangeProductQty: function() {
+            this._setValues();
+            var factor = this.secondary_uom_factor * this.product_uom_factor;
+            this.$secondary_uom_qty.val(this.product_qty / factor);
+        },
+    });
 
+    sAnimation.registry.sale_secondary_unit_cart = sAnimation.Class.extend({
+        selector: ".oe_cart",
+        init: function(parent, editableMode) {
+            this._super.apply(this, arguments);
+            this.$product_qty = null;
+            this.secondary_uom_qty = null;
+            this.secondary_uom_factor = null;
+            this.product_uom_factor = null;
+            this.product_qty = null;
+        },
+        start: function() {
+            var self = this;
+            this.$target.on(
+                "change",
+                "input.js_secondary_quantity[data-line-id]",
+                function() {
+                    self._onChangeSecondaryUom(this);
+                }
+            );
+        },
+        _setValues: function(order_line) {
+            this.$product_qty = this.$target.find(
+                ".quantity[data-line-id=" + order_line.dataset.lineId + "]"
+            );
+            this.secondary_uom_qty = parseFloat(order_line.value);
+            this.secondary_uom_factor = parseFloat(
+                order_line.dataset.secondaryUomFactor
+            );
+            this.product_uom_factor = parseFloat(order_line.dataset.productUomFactor);
+        },
+        _onChangeSecondaryUom: function(order_line) {
+            this._setValues(order_line);
+            var factor = this.secondary_uom_factor * this.product_uom_factor;
+            this.$product_qty.val(this.secondary_uom_qty * factor);
+            this.$product_qty.trigger("change");
+        },
+    });
 });
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index 1142392bc3..77cfa993d1 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_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_secondary_unit.tour", function (require) {
+odoo.define("website_sale_secondary_unit.tour", function(require) {
     "use strict";
 
     var tour = require("web_tour.tour");
@@ -9,11 +9,11 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
 
     // Get an option value by its text
     // HACK https://github.com/odoo/odoo/pull/32718
-    function opt_val (option_text) {
-        return function (action_helper) {
-            var option_id = this.$anchor.children(_.str.sprintf(
-                "option:contains('%s')", option_text
-            )).val();
+    function opt_val(option_text) {
+        return function(action_helper) {
+            var option_id = this.$anchor
+                .children(_.str.sprintf("option:contains('%s')", option_text))
+                .val();
             action_helper.text(option_id);
         };
     }
@@ -28,34 +28,39 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
         },
         {
             trigger: "#add_to_cart",
-            extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(5)):has(.price_uom)",
+            extra_trigger:
+                ".js_product:has(input[name='add_qty']:propValueContains(5)):has(.price_uom)",
         },
         {
             trigger: "a[href='/shop']",
-            extra_trigger: "span:contains(Box 5 Unit(s))"
+            extra_trigger: "span:contains(Box 5 Unit(s))",
         },
         {
             trigger: "a:contains('Customizable Desk')",
         },
         {
             trigger: "#add_to_cart",
-            extra_trigger: ".js_product:has(input[name='add_qty']:propValueContains(1))",
+            extra_trigger:
+                ".js_product:has(input[name='add_qty']:propValueContains(1))",
         },
         {
             trigger: "a[href='/shop/checkout?express=1']",
-            extra_trigger: "span:containsExact(Unit(s))"
+            extra_trigger: "span:containsExact(Unit(s))",
         },
         {
             trigger: "#o_payment_form_pay",
-            extra_trigger: "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))"
+            extra_trigger:
+                "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))",
         },
         {
             trigger: "a[href='/shop']",
-            extra_trigger: "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))"
+            extra_trigger:
+                "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))",
         },
     ];
 
-    tour.register("website_sale_secondary_unit",
+    tour.register(
+        "website_sale_secondary_unit",
         {
             url: "/shop",
             test: true,
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index 351009b4e9..30d5289893 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -7,27 +7,34 @@ class WebsiteSaleSecondaryUnitHttpCase(HttpCase):
     def setUp(self):
         super().setUp()
         # Models
-        ProductSecondaryUnit = self.env['product.secondary.unit']
-        product_uom_unit = self.env.ref('uom.product_uom_unit')
+        ProductSecondaryUnit = self.env["product.secondary.unit"]
+        product_uom_unit = self.env.ref("uom.product_uom_unit")
         self.product_template = self.env.ref(
-            'product.product_product_4_product_template')
+            "product.product_product_4_product_template"
+        )
         vals = {
-            'name': 'Box',
-            'uom_id': product_uom_unit.id,
-            'factor': 5.0,
-            'product_tmpl_id': self.product_template.id,
-            'website_published': True,
+            "name": "Box",
+            "uom_id": product_uom_unit.id,
+            "factor": 5.0,
+            "product_tmpl_id": self.product_template.id,
+            "website_published": True,
         }
         self.secondary_unit_box_5 = ProductSecondaryUnit.create(vals)
         self.secondary_unit_box_10 = ProductSecondaryUnit.create(
-            dict(vals, factor=10.0))
-        self.product_template.write({
-            'secondary_uom_ids': [
-                (6, 0, [self.secondary_unit_box_5.id,
-                        self.secondary_unit_box_10.id]),
-            ],
-            'optional_product_ids': [(6, 0, [])]
-        })
+            dict(vals, factor=10.0)
+        )
+        self.product_template.write(
+            {
+                "secondary_uom_ids": [
+                    (
+                        6,
+                        0,
+                        [self.secondary_unit_box_5.id, self.secondary_unit_box_10.id],
+                    ),
+                ],
+                "optional_product_ids": [(6, 0, [])],
+            }
+        )
 
     def test_ui_website(self):
         """Test frontend tour."""
@@ -39,4 +46,5 @@ def test_ui_website(self):
             url_path="/",
             code="%s.run('%s')" % tour,
             ready="%s.tours['%s'].ready" % tour,
-            login="admin")
+            login="admin",
+        )
diff --git a/website_sale_secondary_unit/views/assets.xml b/website_sale_secondary_unit/views/assets.xml
index 8ee3edcba3..9186ef96a4 100644
--- a/website_sale_secondary_unit/views/assets.xml
+++ b/website_sale_secondary_unit/views/assets.xml
@@ -1,13 +1,20 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <odoo>
     <template id="assets_frontend" inherit_id="website.assets_frontend">
         <xpath expr=".">
-            <script type="text/javascript"
-                    src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js"/>
-            <script type="text/javascript"
-                    src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"/>
-            <link type="text/scss" rel="stylesheet"
-                  href="/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss"/>
+            <script
+                type="text/javascript"
+                src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js"
+            />
+            <script
+                type="text/javascript"
+                src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"
+            />
+            <link
+                type="text/scss"
+                rel="stylesheet"
+                href="/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss"
+            />
         </xpath>
     </template>
 </odoo>
diff --git a/website_sale_secondary_unit/views/product_secondary_unit_views.xml b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
index 565c66413e..1eff549a50 100755
--- a/website_sale_secondary_unit/views/product_secondary_unit_views.xml
+++ b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
@@ -1,16 +1,17 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-
     <record id="product_template_website_publish_form_view" model="ir.ui.view">
         <field name="model">product.template</field>
-        <field name="inherit_id" ref="product_secondary_unit.product_template_form_view"/>
+        <field
+            name="inherit_id"
+            ref="product_secondary_unit.product_template_form_view"
+        />
         <field name="arch" type="xml">
             <field name="factor" position="after">
-                <field name="website_published"/>
+                <field name="website_published" />
             </field>
         </field>
     </record>
-
 </odoo>
diff --git a/website_sale_secondary_unit/views/product_template_views.xml b/website_sale_secondary_unit/views/product_template_views.xml
index 4a1b5e3a17..c0d4aa4054 100755
--- a/website_sale_secondary_unit/views/product_template_views.xml
+++ b/website_sale_secondary_unit/views/product_template_views.xml
@@ -1,17 +1,15 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-
     <record id="product_template_form_view" model="ir.ui.view">
         <field name="name">product.template.website.secondary.unit.form</field>
         <field name="model">product.template</field>
-        <field name="inherit_id" ref="website_sale.product_template_form_view"/>
+        <field name="inherit_id" ref="website_sale.product_template_form_view" />
         <field name="arch" type="xml">
             <field name="website_style_ids" position="after">
-                <field name="allow_uom_sell"/>
+                <field name="allow_uom_sell" />
             </field>
         </field>
     </record>
-
 </odoo>
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index 2d61d0a0c2..c8a3f7fc15 100755
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
@@ -7,47 +7,92 @@
     portal and public users for security reasons
     -->
     <template id="secondary_qty">
-        <div class="css_quantity input-group oe_website_spinner" contenteditable="false">
+        <div
+            class="css_quantity input-group oe_website_spinner"
+            contenteditable="false"
+        >
             <div class="input-group-prepend">
-                <a t-attf-href="#" class="btn btn-secondary js_add_cart_json" aria-label="Remove one" title="Remove one">
-                    <i class="fa fa-minus"/>
+                <a
+                    t-attf-href="#"
+                    class="btn btn-secondary js_add_cart_json"
+                    aria-label="Remove one"
+                    title="Remove one"
+                >
+                    <i class="fa fa-minus" />
                 </a>
             </div>
-            <input type="text" class="form-control secondary-quantity" data-min="1" name="add_secondary_qty" value="1"/>
+            <input
+                type="text"
+                class="form-control secondary-quantity"
+                data-min="1"
+                name="add_secondary_qty"
+                value="1"
+            />
             <div class="input-group-append">
-                <a t-attf-href="#" class="btn btn-secondary float_left js_add_cart_json" aria-label="Add one" title="Add one">
-                    <i class="fa fa-plus"/>
+                <a
+                    t-attf-href="#"
+                    class="btn btn-secondary float_left js_add_cart_json"
+                    aria-label="Add one"
+                    title="Add one"
+                >
+                    <i class="fa fa-plus" />
                 </a>
             </div>
         </div>
     </template>
-
     <template id="second_qty_description">
-        <t t-set="secondary_uom_sudo" t-value="secondary_uom.sudo()"/>
-        <t t-set="factor" t-value="int(secondary_uom_sudo.factor) == secondary_uom_sudo.factor and int(secondary_uom_sudo.factor) or secondary_uom_sudo.factor"/>
-        <span t-esc="'{} {} {}'.format(secondary_uom_sudo.name, factor, secondary_uom_sudo.product_tmpl_id.uom_id.name)"/>
+        <t t-set="secondary_uom_sudo" t-value="secondary_uom.sudo()" />
+        <t
+            t-set="factor"
+            t-value="int(secondary_uom_sudo.factor) == secondary_uom_sudo.factor and int(secondary_uom_sudo.factor) or secondary_uom_sudo.factor"
+        />
+        <span
+            t-esc="'{} {} {}'.format(secondary_uom_sudo.name, factor, secondary_uom_sudo.product_tmpl_id.uom_id.name)"
+        />
     </template>
-
-    <template id="product" inherit_id="website_sale.product" name="Manage secondary units">
-        <xpath expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']" position="after">
-            <t t-set="product_secondary_uom_ids_sudo" t-value="product.sudo().secondary_uom_ids"/>
+    <template
+        id="product"
+        inherit_id="website_sale.product"
+        name="Manage secondary units"
+    >
+        <xpath
+            expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']"
+            position="after"
+        >
+            <t
+                t-set="product_secondary_uom_ids_sudo"
+                t-value="product.sudo().secondary_uom_ids"
+            />
             <t t-if="product_secondary_uom_ids_sudo">
                 <div class="mb8 secondary-unit">
-                    <t t-call="website_sale_secondary_unit.secondary_qty"/>
-                    <select class="form-control mt4" id="secondary_uom" name="secondary_uom_id">
-                        <option t-if="product_secondary_uom_ids_sudo and product.allow_uom_sell"
+                    <t t-call="website_sale_secondary_unit.secondary_qty" />
+                    <select
+                        class="form-control mt4"
+                        id="secondary_uom"
+                        name="secondary_uom_id"
+                    >
+                        <option
+                            t-if="product_secondary_uom_ids_sudo and product.allow_uom_sell"
                             value="0"
                             t-att-selected="'selected' if not product.sale_secondary_uom_id else None"
                             t-att-data-secondary-uom-factor="1.0"
-                            t-att-data-product-uom-factor="1.0">
-                            <span t-esc="product.uom_id.sudo().name"/>
+                            t-att-data-product-uom-factor="1.0"
+                        >
+                            <span t-esc="product.uom_id.sudo().name" />
                         </option>
-                        <t t-foreach="product_secondary_uom_ids_sudo" t-as="secondary_uom">
-                            <option t-att-value="secondary_uom.id"
-                                    t-att-selected="'selected' if product.sudo().sale_secondary_uom_id.id == secondary_uom.id else None"
-                                    t-att-data-secondary-uom-factor="secondary_uom.factor"
-                                    t-att-data-product-uom-factor="product.sudo().uom_id.factor">
-                                <t t-call="website_sale_secondary_unit.second_qty_description"/>
+                        <t
+                            t-foreach="product_secondary_uom_ids_sudo"
+                            t-as="secondary_uom"
+                        >
+                            <option
+                                t-att-value="secondary_uom.id"
+                                t-att-selected="'selected' if product.sudo().sale_secondary_uom_id.id == secondary_uom.id else None"
+                                t-att-data-secondary-uom-factor="secondary_uom.factor"
+                                t-att-data-product-uom-factor="product.sudo().uom_id.factor"
+                            >
+                                <t
+                                    t-call="website_sale_secondary_unit.second_qty_description"
+                                />
                             </option>
                         </t>
                     </select>
@@ -55,57 +100,85 @@
             </t>
         </xpath>
     </template>
-
     <template id="product_price" inherit_id="website_sale.product_price">
         <xpath expr="//b[hasclass('oe_price')]" position="after">
             <t t-if="product.sudo().secondary_uom_ids">
-                / <span class="css_editable_mode_hidden price_uom" t-field="product.uom_id"/>
+                / <span
+                    class="css_editable_mode_hidden price_uom"
+                    t-field="product.uom_id"
+                />
             </t>
         </xpath>
     </template>
-
     <template id="product_quantity" inherit_id="website_sale.product_quantity">
         <xpath expr="//input[@name='add_qty']/.." position="attributes">
-            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'d-none' if product.sudo().secondary_uom_ids else None}</attribute>
+            <attribute
+                name="t-attf-class"
+            >css_quantity input-group oe_website_spinner #{'d-none' if product.sudo().secondary_uom_ids else None}</attribute>
         </xpath>
     </template>
-
     <template id="cart_lines" inherit_id="website_sale.cart_lines">
         <xpath expr="//td[hasclass('td-qty')]/div" position="before">
             <t t-if="line.sudo().secondary_uom_id">
-                <div class="css_secondary_quantity input-group mx-auto oe_website_spinner">
+                <div
+                    class="css_secondary_quantity input-group mx-auto oe_website_spinner"
+                >
                     <div class="input-group-prepend">
-                        <a t-attf-href="#" class="btn btn-link js_add_cart_json d-xs d-md-inline-block" aria-label="Remove one" title="Remove one">
-                            <i class="fa fa-minus"/>
+                        <a
+                            t-attf-href="#"
+                            class="btn btn-link js_add_cart_json d-xs d-md-inline-block"
+                            aria-label="Remove one"
+                            title="Remove one"
+                        >
+                            <i class="fa fa-minus" />
                         </a>
                     </div>
-                    <t t-set="line_secondary_uom_sudo" t-value="line.sudo().secondary_uom_id"/>
-                    <input type="text" class="js_secondary_quantity form-control secondary-quantity"
-                           t-att-data-line-id="line.id"
-                           t-att-data-product-id="line.product_id.id"
-                           t-att-data-secondary-uom-id="line_secondary_uom_sudo.id"
-                           t-att-data-secondary-uom-factor="line_secondary_uom_sudo.factor"
-                           t-att-data-product-uom-factor="line.product_uom.sudo().factor"
-                           t-att-value="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty" />
+                    <t
+                        t-set="line_secondary_uom_sudo"
+                        t-value="line.sudo().secondary_uom_id"
+                    />
+                    <input
+                        type="text"
+                        class="js_secondary_quantity form-control secondary-quantity"
+                        t-att-data-line-id="line.id"
+                        t-att-data-product-id="line.product_id.id"
+                        t-att-data-secondary-uom-id="line_secondary_uom_sudo.id"
+                        t-att-data-secondary-uom-factor="line_secondary_uom_sudo.factor"
+                        t-att-data-product-uom-factor="line.product_uom.sudo().factor"
+                        t-att-value="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
+                    />
                     <div class="input-group-append">
-                        <a t-attf-href="#" class="btn btn-link float_left js_add_cart_json d-xs d-md-inline-block" aria-label="Add one" title="Add one">
-                            <i class="fa fa-plus"/>
+                        <a
+                            t-attf-href="#"
+                            class="btn btn-link float_left js_add_cart_json d-xs d-md-inline-block"
+                            aria-label="Add one"
+                            title="Add one"
+                        >
+                            <i class="fa fa-plus" />
                         </a>
                     </div>
                 </div>
                 <div>
                     <t t-call="website_sale_secondary_unit.second_qty_description">
-                        <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                        <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
                     </t>
                 </div>
             </t>
         </xpath>
-        <xpath expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]" position="attributes">
-            <attribute name="t-attf-class">css_quantity input-group oe_website_spinner #{'d-none' if line.secondary_uom_id else None}</attribute>
+        <xpath
+            expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]"
+            position="attributes"
+        >
+            <attribute
+                name="t-attf-class"
+            >css_quantity input-group oe_website_spinner #{'d-none' if line.secondary_uom_id else None}</attribute>
         </xpath>
-        <xpath expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]" position="after">
+        <xpath
+            expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]"
+            position="after"
+        >
             <t t-if="not line.secondary_uom_id">
-                <span t-esc="line.product_uom.sudo().name"/>
+                <span t-esc="line.product_uom.sudo().name" />
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
@@ -113,33 +186,41 @@
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]" position="after">
             <td class="text-center td-qty">
-                <span t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"/>
-                <span t-esc="line.product_uom.sudo().name"/>
+                <span
+                    t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
+                />
+                <span t-esc="line.product_uom.sudo().name" />
             </td>
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[@name='price']" position="inside">
             <t t-if="line.product_id.secondary_uom_ids.sudo()">
-                / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
+                / <span
+                    class="css_editable_mode_hidden price_uom"
+                    t-field="line.product_id.uom_id"
+                />
             </t>
         </xpath>
     </template>
-
     <template id="cart_summary" inherit_id="website_sale.cart_summary">
         <xpath expr="//td[hasclass('td-qty')]" position="inside">
             <t t-if="line.secondary_uom_id">
-                <div t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"/>
+                <div
+                    t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
+                />
                 <t t-call="website_sale_secondary_unit.second_qty_description">
-                    <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                    <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
                 </t>
             </t>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
-            <attribute name="t-attf-class">#{'d-none' if line.secondary_uom_id else None}</attribute>
+            <attribute
+                name="t-attf-class"
+            >#{'d-none' if line.secondary_uom_id else None}</attribute>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div" position="after">
             <t t-if="not line.secondary_uom_id">
-                <span t-esc="line.product_uom.sudo().name"/>
+                <span t-esc="line.product_uom.sudo().name" />
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
@@ -147,27 +228,32 @@
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]" position="after">
             <td class="text-center td-qty">
-                <span t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"/>
-                <span t-esc="line.product_uom.sudo().name"/>
+                <span
+                    t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
+                />
+                <span t-esc="line.product_uom.sudo().name" />
             </td>
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[hasclass('td-price')]" position="inside">
             <t t-if="line.product_id.secondary_uom_ids.sudo()">
-                / <span class="css_editable_mode_hidden price_uom" t-field="line.product_id.uom_id"/>
+                / <span
+                    class="css_editable_mode_hidden price_uom"
+                    t-field="line.product_id.uom_id"
+                />
             </t>
         </xpath>
     </template>
-
     <template id="cart_popover" inherit_id="website_sale.cart_popover">
         <xpath expr="//div[hasclass('col-9')]" position="inside">
             <div t-if="line.secondary_uom_id.sudo()">
-                Qty: <t t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty" />
+                Qty: <t
+                    t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
+                />
                 <t t-call="website_sale_secondary_unit.second_qty_description">
-                    <t t-set="secondary_uom" t-value="line.secondary_uom_id"/>
+                    <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
                 </t>
             </div>
         </xpath>
     </template>
-
 </odoo>

From 8f88e60516acc82150f80d721d87c28eb47ad16f Mon Sep 17 00:00:00 2001
From: Carlos Roca <carlos.roca@tecnativa.com>
Date: Wed, 17 Feb 2021 13:22:41 +0100
Subject: [PATCH 10/32] [MIG] website_sale_secondary_unit: Migration to v13.0

---
 website_sale_secondary_unit/README.rst        | 26 +++++---
 website_sale_secondary_unit/__manifest__.py   |  6 +-
 .../controllers/main.py                       |  6 +-
 website_sale_secondary_unit/data/demo.xml     |  4 +-
 .../i18n/website_sale_secondary_unit.pot      | 17 +++--
 .../migrations/12.0.1.0.0/pre-migration.py    | 18 ------
 .../models/sale_order.py                      |  7 +-
 .../readme/CONFIGURE.rst                      |  2 +
 .../readme/CONTRIBUTORS.rst                   |  5 +-
 website_sale_secondary_unit/readme/USAGE.rst  |  5 +-
 .../static/description/index.html             | 47 ++++++++------
 .../src/js/website_sale_secondary_unit.js     | 64 +++++++++----------
 .../js/website_sale_secondary_unit_tour.js    | 31 +++------
 .../templates/assets.xml                      | 11 ++++
 .../tests/test_website_sale_secondary_unit.py | 24 ++++---
 website_sale_secondary_unit/views/assets.xml  |  4 --
 .../views/product_secondary_unit_views.xml    |  0
 .../views/product_template_views.xml          |  0
 .../views/templates.xml                       |  0
 19 files changed, 141 insertions(+), 136 deletions(-)
 delete mode 100644 website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
 create mode 100644 website_sale_secondary_unit/readme/CONFIGURE.rst
 create mode 100644 website_sale_secondary_unit/templates/assets.xml
 mode change 100755 => 100644 website_sale_secondary_unit/views/product_secondary_unit_views.xml
 mode change 100755 => 100644 website_sale_secondary_unit/views/product_template_views.xml
 mode change 100755 => 100644 website_sale_secondary_unit/views/templates.xml

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index 59c8b5ecea..d735053a20 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -14,13 +14,13 @@ Website Sale Secondary Unit
     :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_secondary_unit
+    :target: https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit
     :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_secondary_unit
+    :target: https://translation.odoo-community.org/projects/e-commerce-13-0/e-commerce-13-0-website_sale_secondary_unit
     :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| 
@@ -33,13 +33,20 @@ allow sell products in online store in secondary units defined.
 .. contents::
    :local:
 
+Configuration
+=============
+
+For define the secondary units, you should active *Manage multiples units of measure* on
+the user that will be responsable of this function.
+
 Usage
 =====
 
 To use this module you need to:
 
-* Go to *'Sales > Catalog > Products'*.
-* Create secondary units for a product.
+* Go to *'Website > Products > Products'*.
+* Select a template.
+* Set the secondary units that you need.
 * Go to Website Shop and buy this product, you will see a selectable option
   with all secondary units defined in the product and visible in website.
 * If you do not want to sell in a base product unit and only allow sell in a
@@ -52,7 +59,7 @@ Bug Tracker
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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 <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
 
@@ -67,7 +74,10 @@ Authors
 Contributors
 ~~~~~~~~~~~~
 
-* Sergio Teruel <sergio.teruel@tecnativa.com>
+* `Tecnativa <https://www.tecnativa.com>`_:
+
+  * Sergio Teruel
+  * Carlos Roca
 
 Maintainers
 ~~~~~~~~~~~
@@ -82,6 +92,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 <https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit>`_ project on GitHub.
+This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit>`_ project on GitHub.
 
 You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 3e1422c05f..bff71860a5 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "12.0.1.1.0",
+    "version": "13.0.1.0.0",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
@@ -11,13 +11,15 @@
     "license": "AGPL-3",
     "application": False,
     "installable": True,
-    "depends": ["website_sale", "sale_order_secondary_unit",],
+    "depends": ["website_sale", "sale_order_secondary_unit"],
     "data": [
         "security/website_sale_secondary_unit.xml",
         "views/assets.xml",
+        "templates/assets.xml",
         "views/product_template_views.xml",
         "views/product_secondary_unit_views.xml",
         "views/templates.xml",
     ],
+    "demo": ["data/demo.xml"],
     "post_init_hook": "post_init_hook",
 }
diff --git a/website_sale_secondary_unit/controllers/main.py b/website_sale_secondary_unit/controllers/main.py
index 01308ec91c..8903437b39 100644
--- a/website_sale_secondary_unit/controllers/main.py
+++ b/website_sale_secondary_unit/controllers/main.py
@@ -16,9 +16,7 @@ def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
                 int(kw["secondary_uom_id"])
             )
             request.session["secondary_uom_id"] = secondary_uom.id
-        return super(WebsiteSaleSecondaryUnit, self).cart_update(
-            product_id, add_qty=add_qty, set_qty=set_qty, **kw
-        )
+        return super().cart_update(product_id, add_qty=add_qty, set_qty=set_qty, **kw)
 
     @http.route()
     def cart_update_json(
@@ -28,7 +26,7 @@ def cart_update_json(
         request.session.pop("secondary_uom_id", None)
         if so_line.sudo().secondary_uom_id:
             request.session["secondary_uom_id"] = so_line.sudo().secondary_uom_id.id
-        return super(WebsiteSaleSecondaryUnit, self).cart_update_json(
+        return super().cart_update_json(
             product_id,
             line_id=line_id,
             add_qty=add_qty,
diff --git a/website_sale_secondary_unit/data/demo.xml b/website_sale_secondary_unit/data/demo.xml
index a5ed5594f0..bb7d01c47f 100644
--- a/website_sale_secondary_unit/data/demo.xml
+++ b/website_sale_secondary_unit/data/demo.xml
@@ -2,7 +2,7 @@
 <odoo noupdate="0">
     <record id="secondary_unit_box_5" model="product.secondary.unit">
         <field name="name">Box</field>
-        <field name="uom_id" ref="product.product_uom_unit" />
+        <field name="uom_id" ref="uom.product_uom_unit" />
         <field name="factor">5.0</field>
         <field
             name="product_tmpl_id"
@@ -12,7 +12,7 @@
     </record>
     <record id="secondary_unit_box_10" model="product.secondary.unit">
         <field name="name">Box</field>
-        <field name="uom_id" ref="product.product_uom_unit" />
+        <field name="uom_id" ref="uom.product_uom_unit" />
         <field name="factor">10.0</field>
         <field
             name="product_tmpl_id"
diff --git a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
index 32d49e6daf..ecb890b93c 100644
--- a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
+++ b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
@@ -1,12 +1,12 @@
 # Translation of Odoo Server.
 # This file contains the translation of the following modules:
-#	* website_sale_secondary_unit
+# 	* website_sale_secondary_unit
 #
 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"
@@ -25,9 +25,15 @@ msgstr ""
 msgid "Allow to sell in unit of measure"
 msgstr ""
 
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
-msgid "Is published"
+msgid "Is Published"
 msgstr ""
 
 #. module: website_sale_secondary_unit
@@ -59,11 +65,10 @@ msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sale Order"
+msgid "Sales Order"
 msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr ""
-
diff --git a/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py b/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
deleted file mode 100644
index be1c4deb2f..0000000000
--- a/website_sale_secondary_unit/migrations/12.0.1.0.0/pre-migration.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# Copyright 2020 Tecnativa - Sergio Teruel
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-
-from openupgradelib import openupgrade
-
-_field_renames = [
-    (
-        "product.secondary.unit",
-        "product_secondary_unit",
-        "website_published",
-        "is_published",
-    ),
-]
-
-
-@openupgrade.migrate()
-def migrate(env, version):
-    openupgrade.rename_fields(env, _field_renames)
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 029d9c1fef..a41adb1275 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -8,7 +8,6 @@
 class SaleOrder(models.Model):
     _inherit = "sale.order"
 
-    @api.multi
     def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs):
         """
         Search sale order lines with secondary units
@@ -27,14 +26,12 @@ def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs):
             )
         return so_lines
 
-    @api.multi
     def _website_product_id_change(self, order_id, product_id, qty=0):
         res = super()._website_product_id_change(order_id, product_id, qty=qty)
         secondary_uom_id = self.env.context.get("secondary_uom_id", False)
         res["secondary_uom_id"] = secondary_uom_id
         return res
 
-    @api.multi
     def _cart_update(
         self,
         product_id=None,
@@ -105,7 +102,7 @@ def create(self, vals_list):
                     vals["product_uom_qty"] / (factor or 1.0),
                     precision_rounding=secondary_uom.uom_id.rounding,
                 )
-        return super(SaleOrderLine, self).create(vals_list)
+        return super().create(vals_list)
 
     def write(self, vals):
         SecondaryUom = self.env["product.secondary.unit"]
@@ -127,4 +124,4 @@ def write(self, vals):
                     vals["product_uom_qty"] / (factor or 1.0),
                     precision_rounding=secondary_uom.uom_id.rounding,
                 )
-        return super(SaleOrderLine, self).write(vals)
+        return super().write(vals)
diff --git a/website_sale_secondary_unit/readme/CONFIGURE.rst b/website_sale_secondary_unit/readme/CONFIGURE.rst
new file mode 100644
index 0000000000..d904421958
--- /dev/null
+++ b/website_sale_secondary_unit/readme/CONFIGURE.rst
@@ -0,0 +1,2 @@
+For define the secondary units, you should active *Manage multiples units of measure* on
+the user that will be responsable of this function.
diff --git a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
index f24a0b0dc7..5a78ea95cf 100644
--- a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
+++ b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
@@ -1 +1,4 @@
-* Sergio Teruel <sergio.teruel@tecnativa.com>
+* `Tecnativa <https://www.tecnativa.com>`_:
+
+  * Sergio Teruel
+  * Carlos Roca
diff --git a/website_sale_secondary_unit/readme/USAGE.rst b/website_sale_secondary_unit/readme/USAGE.rst
index a7114cb809..b42f8d3ebf 100644
--- a/website_sale_secondary_unit/readme/USAGE.rst
+++ b/website_sale_secondary_unit/readme/USAGE.rst
@@ -1,7 +1,8 @@
 To use this module you need to:
 
-* Go to *'Sales > Catalog > Products'*.
-* Create secondary units for a product.
+* Go to *'Website > Products > Products'*.
+* Select a template.
+* Set the secondary units that you need.
 * Go to Website Shop and buy this product, you will see a selectable option
   with all secondary units defined in the product and visible in website.
 * If you do not want to sell in a base product unit and only allow sell in a
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index c2f6ae880b..93b4cdf44d 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -367,28 +367,35 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-12-0/e-commerce-12-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-13-0/e-commerce-13-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
 <div class="contents local topic" id="contents">
 <ul class="simple">
-<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
-<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
-<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
-<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
-<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
-<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
+<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
+<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
 </ul>
 </li>
 </ul>
 </div>
+<div class="section" id="configuration">
+<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
+<p>For define the secondary units, you should active <em>Manage multiples units of measure</em> on
+the user that will be responsable of this function.</p>
+</div>
 <div class="section" id="usage">
-<h1><a class="toc-backref" href="#id1">Usage</a></h1>
+<h1><a class="toc-backref" href="#id2">Usage</a></h1>
 <p>To use this module you need to:</p>
 <ul class="simple">
-<li>Go to <em>‘Sales &gt; Catalog &gt; Products’</em>.</li>
-<li>Create secondary units for a product.</li>
+<li>Go to <em>‘Website &gt; Products &gt; Products’</em>.</li>
+<li>Select a template.</li>
+<li>Set the secondary units that you need.</li>
 <li>Go to Website Shop and buy this product, you will see a selectable option
 with all secondary units defined in the product and visible in website.</li>
 <li>If you do not want to sell in a base product unit and only allow sell in a
@@ -397,35 +404,39 @@ <h1><a class="toc-backref" href="#id1">Usage</a></h1>
 </ul>
 </div>
 <div class="section" id="bug-tracker">
-<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
+<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
-<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
-<h1><a class="toc-backref" href="#id3">Credits</a></h1>
+<h1><a class="toc-backref" href="#id4">Credits</a></h1>
 <div class="section" id="authors">
-<h2><a class="toc-backref" href="#id4">Authors</a></h2>
+<h2><a class="toc-backref" href="#id5">Authors</a></h2>
 <ul class="simple">
 <li>Tecnativa</li>
 </ul>
 </div>
 <div class="section" id="contributors">
-<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
+<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
 <ul class="simple">
-<li>Sergio Teruel &lt;<a class="reference external" href="mailto:sergio.teruel&#64;tecnativa.com">sergio.teruel&#64;tecnativa.com</a>&gt;</li>
+<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
+<li>Sergio Teruel</li>
+<li>Carlos Roca</li>
+</ul>
+</li>
 </ul>
 </div>
 <div class="section" id="maintainers">
-<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
+<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
 <p>This module is maintained by the OCA.</p>
 <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
 <p>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.</p>
-<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/12.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
 <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
 </div>
 </div>
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
index 41bea03713..bebcd19c6b 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
@@ -1,11 +1,11 @@
 odoo.define("website_sale_secondary_unit.animation", function(require) {
     "use strict";
 
-    var core = require("web.core");
-    var sAnimation = require("website.content.snippets.animation");
+    const sAnimation = require("website.content.snippets.animation");
 
     sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend({
         selector: ".secondary-unit",
+        // eslint-disable-next-line no-unused-vars
         init: function(parent, editableMode) {
             this._super.apply(this, arguments);
             this.$secondary_uom = null;
@@ -17,51 +17,53 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_qty = null;
         },
         start: function() {
-            var self = this;
-            self.$secondary_uom = $("#secondary_uom");
-            self.$secondary_uom_qty = $(".secondary-quantity");
-            self.$product_qty = $(".quantity");
-            self._setValues();
-            this.$target.on("change", ".secondary-quantity", function() {
-                self._onChangeSecondaryUom();
-            });
-            this.$target.on("change", "#secondary_uom", function() {
-                self._onChangeSecondaryUom();
-            });
-            this.$product_qty.on("change", null, function() {
-                self._onChangeProductQty();
-            });
-            if (self.secondary_uom_qty) {
-                self._onChangeSecondaryUom();
+            this.$secondary_uom = $("#secondary_uom");
+            this.$secondary_uom_qty = $(".secondary-quantity");
+            this.$product_qty = $(".quantity");
+            this._setValues();
+            this.$target.on(
+                "change",
+                ".secondary-quantity",
+                this._onChangeSecondaryUom.bind(this)
+            );
+            this.$target.on(
+                "change",
+                "#secondary_uom",
+                this._onChangeSecondaryUom.bind(this)
+            );
+            this.$product_qty.on("change", null, this._onChangeProductQty.bind(this));
+            if (this.secondary_uom_qty) {
+                this._onChangeSecondaryUom();
             }
         },
         _setValues: function() {
-            this.secondary_uom_qty = parseFloat(
+            this.secondary_uom_qty = Number(
                 this.$target.find(".secondary-quantity").val()
             );
-            this.secondary_uom_factor = parseFloat(
+            this.secondary_uom_factor = Number(
                 $("option:selected", this.$secondary_uom).data("secondary-uom-factor")
             );
-            this.product_uom_factor = parseFloat(
+            this.product_uom_factor = Number(
                 $("option:selected", this.$secondary_uom).data("product-uom-factor")
             );
-            this.product_qty = parseFloat($(".quantity").val());
+            this.product_qty = Number($(".quantity").val());
         },
 
         _onChangeSecondaryUom: function() {
             this._setValues();
-            var factor = this.secondary_uom_factor * this.product_uom_factor;
+            const factor = this.secondary_uom_factor * this.product_uom_factor;
             this.$product_qty.val(this.secondary_uom_qty * factor);
         },
         _onChangeProductQty: function() {
             this._setValues();
-            var factor = this.secondary_uom_factor * this.product_uom_factor;
+            const factor = this.secondary_uom_factor * this.product_uom_factor;
             this.$secondary_uom_qty.val(this.product_qty / factor);
         },
     });
 
     sAnimation.registry.sale_secondary_unit_cart = sAnimation.Class.extend({
         selector: ".oe_cart",
+        // eslint-disable-next-line no-unused-vars
         init: function(parent, editableMode) {
             this._super.apply(this, arguments);
             this.$product_qty = null;
@@ -71,12 +73,12 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_qty = null;
         },
         start: function() {
-            var self = this;
+            var _this = this;
             this.$target.on(
                 "change",
                 "input.js_secondary_quantity[data-line-id]",
                 function() {
-                    self._onChangeSecondaryUom(this);
+                    _this._onChangeSecondaryUom(this);
                 }
             );
         },
@@ -84,15 +86,13 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.$product_qty = this.$target.find(
                 ".quantity[data-line-id=" + order_line.dataset.lineId + "]"
             );
-            this.secondary_uom_qty = parseFloat(order_line.value);
-            this.secondary_uom_factor = parseFloat(
-                order_line.dataset.secondaryUomFactor
-            );
-            this.product_uom_factor = parseFloat(order_line.dataset.productUomFactor);
+            this.secondary_uom_qty = Number(order_line.value);
+            this.secondary_uom_factor = Number(order_line.dataset.secondaryUomFactor);
+            this.product_uom_factor = Number(order_line.dataset.productUomFactor);
         },
         _onChangeSecondaryUom: function(order_line) {
             this._setValues(order_line);
-            var factor = this.secondary_uom_factor * this.product_uom_factor;
+            const factor = this.secondary_uom_factor * this.product_uom_factor;
             this.$product_qty.val(this.secondary_uom_qty * factor);
             this.$product_qty.trigger("change");
         },
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index 77cfa993d1..209b94520b 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -4,27 +4,16 @@
 odoo.define("website_sale_secondary_unit.tour", function(require) {
     "use strict";
 
-    var tour = require("web_tour.tour");
-    var base = require("web_editor.base");
+    const tour = require("web_tour.tour");
+    const base = require("web_editor.base");
 
-    // Get an option value by its text
-    // HACK https://github.com/odoo/odoo/pull/32718
-    function opt_val(option_text) {
-        return function(action_helper) {
-            var option_id = this.$anchor
-                .children(_.str.sprintf("option:contains('%s')", option_text))
-                .val();
-            action_helper.text(option_id);
-        };
-    }
-
-    var steps = [
+    const steps = [
         {
-            trigger: "a:contains('Customizable Desk')",
+            trigger: "a:contains('Test product')",
         },
         {
             trigger: "#secondary_uom",
-            run: opt_val("Box 5 Unit(s)"),
+            run: "text(Box 5 Units)",
         },
         {
             trigger: "#add_to_cart",
@@ -33,10 +22,10 @@ odoo.define("website_sale_secondary_unit.tour", function(require) {
         },
         {
             trigger: "a[href='/shop']",
-            extra_trigger: "span:contains(Box 5 Unit(s))",
+            extra_trigger: "span:contains(Box 5 Units)",
         },
         {
-            trigger: "a:contains('Customizable Desk')",
+            trigger: "a:contains('Test product')",
         },
         {
             trigger: "#add_to_cart",
@@ -45,17 +34,17 @@ odoo.define("website_sale_secondary_unit.tour", function(require) {
         },
         {
             trigger: "a[href='/shop/checkout?express=1']",
-            extra_trigger: "span:containsExact(Unit(s))",
+            extra_trigger: "span:containsExact(Units)",
         },
         {
             trigger: "#o_payment_form_pay",
             extra_trigger:
-                "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))",
+                "table:has(span:contains(Box 5 Units)):has(span:contains(Units))",
         },
         {
             trigger: "a[href='/shop']",
             extra_trigger:
-                "table:has(span:contains(Box 5 Unit(s)):has(span:contains(Unit(s)))",
+                "table:has(span:contains(Box 5 Units)):has(span:contains(Units))",
         },
     ];
 
diff --git a/website_sale_secondary_unit/templates/assets.xml b/website_sale_secondary_unit/templates/assets.xml
new file mode 100644
index 0000000000..90501064ba
--- /dev/null
+++ b/website_sale_secondary_unit/templates/assets.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <template id="assets_tests" inherit_id="website.assets_tests">
+        <xpath expr=".">
+            <script
+                type="text/javascript"
+                src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"
+            />
+        </xpath>
+    </template>
+</odoo>
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index 30d5289893..2f4508b703 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -9,8 +9,13 @@ def setUp(self):
         # Models
         ProductSecondaryUnit = self.env["product.secondary.unit"]
         product_uom_unit = self.env.ref("uom.product_uom_unit")
-        self.product_template = self.env.ref(
-            "product.product_product_4_product_template"
+        self.product_template = self.env["product.template"].create(
+            {
+                "name": "Test product",
+                "is_published": True,
+                "website_sequence": 1,
+                "type": "consu",
+            }
         )
         vals = {
             "name": "Box",
@@ -32,19 +37,12 @@ def setUp(self):
                         [self.secondary_unit_box_5.id, self.secondary_unit_box_10.id],
                     ),
                 ],
-                "optional_product_ids": [(6, 0, [])],
             }
         )
+        # Add group "Manage Multiple Units of Measure" to admin
+        admin = self.env.ref("base.user_admin")
+        admin.groups_id |= self.browse_ref("uom.group_uom")
 
     def test_ui_website(self):
         """Test frontend tour."""
-        tour = (
-            "odoo.__DEBUG__.services['web_tour.tour']",
-            "website_sale_secondary_unit",
-        )
-        self.browser_js(
-            url_path="/",
-            code="%s.run('%s')" % tour,
-            ready="%s.tours['%s'].ready" % tour,
-            login="admin",
-        )
+        self.start_tour("/", "website_sale_secondary_unit", login="admin")
diff --git a/website_sale_secondary_unit/views/assets.xml b/website_sale_secondary_unit/views/assets.xml
index 9186ef96a4..78775c80ae 100644
--- a/website_sale_secondary_unit/views/assets.xml
+++ b/website_sale_secondary_unit/views/assets.xml
@@ -6,10 +6,6 @@
                 type="text/javascript"
                 src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js"
             />
-            <script
-                type="text/javascript"
-                src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"
-            />
             <link
                 type="text/scss"
                 rel="stylesheet"
diff --git a/website_sale_secondary_unit/views/product_secondary_unit_views.xml b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
old mode 100755
new mode 100644
diff --git a/website_sale_secondary_unit/views/product_template_views.xml b/website_sale_secondary_unit/views/product_template_views.xml
old mode 100755
new mode 100644
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
old mode 100755
new mode 100644

From 68c687fb58235c33dcaa1ca6d5378591a724ca19 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza" <pedro.baeza@tecnativa.com>
Date: Mon, 5 Apr 2021 16:28:30 +0200
Subject: [PATCH 11/32] [FIX] website_sale_secondary_unit: Adjust to upstream
 changes

As the product.secondary.unit view has been isolated, we have to
inherit from that one.
---
 .../views/product_secondary_unit_views.xml                 | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/website_sale_secondary_unit/views/product_secondary_unit_views.xml b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
index 1eff549a50..c956e3cee5 100644
--- a/website_sale_secondary_unit/views/product_secondary_unit_views.xml
+++ b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
@@ -1,12 +1,13 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
+     Copyright 2021 Tecnativa - Pedro M. Baeza
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-    <record id="product_template_website_publish_form_view" model="ir.ui.view">
-        <field name="model">product.template</field>
+    <record id="product_secondary_unit_view_tree" model="ir.ui.view">
+        <field name="model">product.secondary.unit</field>
         <field
             name="inherit_id"
-            ref="product_secondary_unit.product_template_form_view"
+            ref="product_secondary_unit.product_secondary_unit_view_tree"
         />
         <field name="arch" type="xml">
             <field name="factor" position="after">

From 92d5697a82e07bccaaa3dd3e6522001cea074272 Mon Sep 17 00:00:00 2001
From: sergio-teruel <sergio.teruel@tecnativa.com>
Date: Thu, 15 Jul 2021 10:00:24 +0200
Subject: [PATCH 12/32] [FIX] website_sale_secondary_unit: Remove sudo access
 to avoid to display unpublished secondary units. TT31018

---
 website_sale_secondary_unit/__manifest__.py   |  3 +-
 .../security/ir.model.access.csv              |  3 ++
 .../views/templates.xml                       | 42 ++++++-------------
 3 files changed, 18 insertions(+), 30 deletions(-)
 create mode 100644 website_sale_secondary_unit/security/ir.model.access.csv

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index bff71860a5..27ee7723b0 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "13.0.1.0.0",
+    "version": "13.0.1.1.0",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
@@ -13,6 +13,7 @@
     "installable": True,
     "depends": ["website_sale", "sale_order_secondary_unit"],
     "data": [
+        "security/ir.model.access.csv",
         "security/website_sale_secondary_unit.xml",
         "views/assets.xml",
         "templates/assets.xml",
diff --git a/website_sale_secondary_unit/security/ir.model.access.csv b/website_sale_secondary_unit/security/ir.model.access.csv
new file mode 100644
index 0000000000..75e2d825f6
--- /dev/null
+++ b/website_sale_secondary_unit/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_product_secondary_unit_user_public,access_product_second_unit_user_public,model_product_secondary_unit,base.group_public,1,0,0,0
+access_product_secondary_unit_user_portal,access_product_second_unit_user_portal,model_product_secondary_unit,base.group_portal,1,0,0,0
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index c8a3f7fc15..188855b2c8 100644
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -2,10 +2,6 @@
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-    <!--
-    Get secondary uom and product uom as sudo to avoid create new ACL's for
-    portal and public users for security reasons
-    -->
     <template id="secondary_qty">
         <div
             class="css_quantity input-group oe_website_spinner"
@@ -41,13 +37,12 @@
         </div>
     </template>
     <template id="second_qty_description">
-        <t t-set="secondary_uom_sudo" t-value="secondary_uom.sudo()" />
         <t
             t-set="factor"
-            t-value="int(secondary_uom_sudo.factor) == secondary_uom_sudo.factor and int(secondary_uom_sudo.factor) or secondary_uom_sudo.factor"
+            t-value="int(secondary_uom.factor) == secondary_uom.factor and int(secondary_uom.factor) or secondary_uom.factor"
         />
         <span
-            t-esc="'{} {} {}'.format(secondary_uom_sudo.name, factor, secondary_uom_sudo.product_tmpl_id.uom_id.name)"
+            t-esc="'{} {} {}'.format(secondary_uom.name, factor, secondary_uom.product_tmpl_id.sudo().uom_id.name)"
         />
     </template>
     <template
@@ -59,11 +54,7 @@
             expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']"
             position="after"
         >
-            <t
-                t-set="product_secondary_uom_ids_sudo"
-                t-value="product.sudo().secondary_uom_ids"
-            />
-            <t t-if="product_secondary_uom_ids_sudo">
+            <t t-if="product.secondary_uom_ids">
                 <div class="mb8 secondary-unit">
                     <t t-call="website_sale_secondary_unit.secondary_qty" />
                     <select
@@ -72,7 +63,7 @@
                         name="secondary_uom_id"
                     >
                         <option
-                            t-if="product_secondary_uom_ids_sudo and product.allow_uom_sell"
+                            t-if="product.secondary_uom_ids and product.allow_uom_sell"
                             value="0"
                             t-att-selected="'selected' if not product.sale_secondary_uom_id else None"
                             t-att-data-secondary-uom-factor="1.0"
@@ -80,10 +71,7 @@
                         >
                             <span t-esc="product.uom_id.sudo().name" />
                         </option>
-                        <t
-                            t-foreach="product_secondary_uom_ids_sudo"
-                            t-as="secondary_uom"
-                        >
+                        <t t-foreach="product.secondary_uom_ids" t-as="secondary_uom">
                             <option
                                 t-att-value="secondary_uom.id"
                                 t-att-selected="'selected' if product.sudo().sale_secondary_uom_id.id == secondary_uom.id else None"
@@ -102,7 +90,7 @@
     </template>
     <template id="product_price" inherit_id="website_sale.product_price">
         <xpath expr="//b[hasclass('oe_price')]" position="after">
-            <t t-if="product.sudo().secondary_uom_ids">
+            <t t-if="product.secondary_uom_ids">
                 / <span
                     class="css_editable_mode_hidden price_uom"
                     t-field="product.uom_id"
@@ -114,12 +102,12 @@
         <xpath expr="//input[@name='add_qty']/.." position="attributes">
             <attribute
                 name="t-attf-class"
-            >css_quantity input-group oe_website_spinner #{'d-none' if product.sudo().secondary_uom_ids else None}</attribute>
+            >css_quantity input-group oe_website_spinner #{'d-none' if product.secondary_uom_ids else None}</attribute>
         </xpath>
     </template>
     <template id="cart_lines" inherit_id="website_sale.cart_lines">
         <xpath expr="//td[hasclass('td-qty')]/div" position="before">
-            <t t-if="line.sudo().secondary_uom_id">
+            <t t-if="line.secondary_uom_id">
                 <div
                     class="css_secondary_quantity input-group mx-auto oe_website_spinner"
                 >
@@ -133,17 +121,13 @@
                             <i class="fa fa-minus" />
                         </a>
                     </div>
-                    <t
-                        t-set="line_secondary_uom_sudo"
-                        t-value="line.sudo().secondary_uom_id"
-                    />
                     <input
                         type="text"
                         class="js_secondary_quantity form-control secondary-quantity"
                         t-att-data-line-id="line.id"
                         t-att-data-product-id="line.product_id.id"
-                        t-att-data-secondary-uom-id="line_secondary_uom_sudo.id"
-                        t-att-data-secondary-uom-factor="line_secondary_uom_sudo.factor"
+                        t-att-data-secondary-uom-id="line.secondary_uom_id.id"
+                        t-att-data-secondary-uom-factor="line.secondary_uom_id.factor"
                         t-att-data-product-uom-factor="line.product_uom.sudo().factor"
                         t-att-value="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
                     />
@@ -194,7 +178,7 @@
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[@name='price']" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids.sudo()">
+            <t t-if="line.product_id.secondary_uom_ids">
                 / <span
                     class="css_editable_mode_hidden price_uom"
                     t-field="line.product_id.uom_id"
@@ -236,7 +220,7 @@
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[hasclass('td-price')]" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids.sudo()">
+            <t t-if="line.product_id.secondary_uom_ids">
                 / <span
                     class="css_editable_mode_hidden price_uom"
                     t-field="line.product_id.uom_id"
@@ -246,7 +230,7 @@
     </template>
     <template id="cart_popover" inherit_id="website_sale.cart_popover">
         <xpath expr="//div[hasclass('col-9')]" position="inside">
-            <div t-if="line.secondary_uom_id.sudo()">
+            <div t-if="line.secondary_uom_id">
                 Qty: <t
                     t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
                 />

From b516d97e16a62acbc40874f0ce9d8583f60f8d67 Mon Sep 17 00:00:00 2001
From: Carlos Lopez <celm1990@hotmail.com>
Date: Fri, 10 Sep 2021 18:58:21 -0500
Subject: [PATCH 13/32] FIX: script for delete view before update complementary
 to
 https://github.com/OCA/e-commerce/commit/3fa2331d53bda85c81cb6410b6ea0f35c21e6139

---
 website_sale_secondary_unit/__manifest__.py            |  2 +-
 .../migrations/13.0.1.1.1/pre-delete-view.py           | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)
 create mode 100644 website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 27ee7723b0..53bc267027 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "13.0.1.1.0",
+    "version": "13.0.1.1.1",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
diff --git a/website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py b/website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py
new file mode 100644
index 0000000000..11454a2c00
--- /dev/null
+++ b/website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py
@@ -0,0 +1,10 @@
+from odoo import SUPERUSER_ID, api
+
+
+def migrate(cr, version):
+    env = api.Environment(cr, SUPERUSER_ID, {})
+    views_to_unlink = env.ref(
+        "website_sale_secondary_unit.product_template_website_publish_form_view", False
+    )
+    if views_to_unlink:
+        views_to_unlink.unlink()

From ab328b6281d1de33aa8bb3106e21b4ec58768370 Mon Sep 17 00:00:00 2001
From: Carlos Roca <carlos.roca@tecnativa.com>
Date: Fri, 14 May 2021 09:36:32 +0200
Subject: [PATCH 14/32] [FIX] website_sale_secondary_unit: Fixed price
 computation

Before this changes, the change in the value of the secondary unit input field
didn't launch the execution of the onchanges of the real input field.

Adding this changes, we achieve to capture the event of the new input field
to launch the onchanges of the real input field.

cc @Tecnativa TT29708
---
 website_sale_secondary_unit/__manifest__.py   |  2 +-
 .../src/js/website_sale_secondary_unit.js     | 19 ++++++++++++++-----
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 53bc267027..979ffeae83 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "13.0.1.1.1",
+    "version": "13.0.1.1.2",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
index bebcd19c6b..017010111e 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
@@ -1,9 +1,10 @@
 odoo.define("website_sale_secondary_unit.animation", function(require) {
     "use strict";
 
+    const VariantMixin = require("sale.VariantMixin");
     const sAnimation = require("website.content.snippets.animation");
 
-    sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend({
+    sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend(VariantMixin, {
         selector: ".secondary-unit",
         // eslint-disable-next-line no-unused-vars
         init: function(parent, editableMode) {
@@ -17,6 +18,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_qty = null;
         },
         start: function() {
+            const _this = this;
             this.$secondary_uom = $("#secondary_uom");
             this.$secondary_uom_qty = $(".secondary-quantity");
             this.$product_qty = $(".quantity");
@@ -32,9 +34,9 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
                 this._onChangeSecondaryUom.bind(this)
             );
             this.$product_qty.on("change", null, this._onChangeProductQty.bind(this));
-            if (this.secondary_uom_qty) {
-                this._onChangeSecondaryUom();
-            }
+            return this._super.apply(this, arguments).then(function() {
+                _this._onChangeSecondaryUom();
+            });
         },
         _setValues: function() {
             this.secondary_uom_qty = Number(
@@ -49,10 +51,17 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_qty = Number($(".quantity").val());
         },
 
-        _onChangeSecondaryUom: function() {
+        _onChangeSecondaryUom: function(ev) {
+            if (!ev) {
+                // HACK: Create a fake event to locate the form on "onChangeAddQuantity"
+                // odoo method
+                ev = jQuery.Event("fakeEvent");
+                ev.currentTarget = $(".form-control.quantity");
+            }
             this._setValues();
             const factor = this.secondary_uom_factor * this.product_uom_factor;
             this.$product_qty.val(this.secondary_uom_qty * factor);
+            this.onChangeAddQuantity(ev);
         },
         _onChangeProductQty: function() {
             this._setValues();

From 9d68f44d03117fe13cc262fa8016c991971df163 Mon Sep 17 00:00:00 2001
From: CarlosRoca13 <carlos.roca@tecnativa.com>
Date: Thu, 26 May 2022 15:32:08 +0200
Subject: [PATCH 15/32] [IMP] website_sale_secondary_unit: black, isort,
 prettier

---
 .../models/product_template.py                |  3 ++-
 .../src/js/website_sale_secondary_unit.js     | 24 +++++++++----------
 .../js/website_sale_secondary_unit_tour.js    |  2 +-
 3 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/website_sale_secondary_unit/models/product_template.py b/website_sale_secondary_unit/models/product_template.py
index 564d27859d..e70c38375a 100644
--- a/website_sale_secondary_unit/models/product_template.py
+++ b/website_sale_secondary_unit/models/product_template.py
@@ -7,5 +7,6 @@ class ProductTemplate(models.Model):
     _inherit = "product.template"
 
     allow_uom_sell = fields.Boolean(
-        string="Allow to sell in unit of measure", default=True,
+        string="Allow to sell in unit of measure",
+        default=True,
     )
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
index 017010111e..aff2935b0e 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
@@ -1,4 +1,4 @@
-odoo.define("website_sale_secondary_unit.animation", function(require) {
+odoo.define("website_sale_secondary_unit.animation", function (require) {
     "use strict";
 
     const VariantMixin = require("sale.VariantMixin");
@@ -7,7 +7,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
     sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend(VariantMixin, {
         selector: ".secondary-unit",
         // eslint-disable-next-line no-unused-vars
-        init: function(parent, editableMode) {
+        init: function (parent, editableMode) {
             this._super.apply(this, arguments);
             this.$secondary_uom = null;
             this.$secondary_uom_qty = null;
@@ -17,7 +17,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_uom_factor = null;
             this.product_qty = null;
         },
-        start: function() {
+        start: function () {
             const _this = this;
             this.$secondary_uom = $("#secondary_uom");
             this.$secondary_uom_qty = $(".secondary-quantity");
@@ -34,11 +34,11 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
                 this._onChangeSecondaryUom.bind(this)
             );
             this.$product_qty.on("change", null, this._onChangeProductQty.bind(this));
-            return this._super.apply(this, arguments).then(function() {
+            return this._super.apply(this, arguments).then(function () {
                 _this._onChangeSecondaryUom();
             });
         },
-        _setValues: function() {
+        _setValues: function () {
             this.secondary_uom_qty = Number(
                 this.$target.find(".secondary-quantity").val()
             );
@@ -51,7 +51,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_qty = Number($(".quantity").val());
         },
 
-        _onChangeSecondaryUom: function(ev) {
+        _onChangeSecondaryUom: function (ev) {
             if (!ev) {
                 // HACK: Create a fake event to locate the form on "onChangeAddQuantity"
                 // odoo method
@@ -63,7 +63,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.$product_qty.val(this.secondary_uom_qty * factor);
             this.onChangeAddQuantity(ev);
         },
-        _onChangeProductQty: function() {
+        _onChangeProductQty: function () {
             this._setValues();
             const factor = this.secondary_uom_factor * this.product_uom_factor;
             this.$secondary_uom_qty.val(this.product_qty / factor);
@@ -73,7 +73,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
     sAnimation.registry.sale_secondary_unit_cart = sAnimation.Class.extend({
         selector: ".oe_cart",
         // eslint-disable-next-line no-unused-vars
-        init: function(parent, editableMode) {
+        init: function (parent, editableMode) {
             this._super.apply(this, arguments);
             this.$product_qty = null;
             this.secondary_uom_qty = null;
@@ -81,17 +81,17 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.product_uom_factor = null;
             this.product_qty = null;
         },
-        start: function() {
+        start: function () {
             var _this = this;
             this.$target.on(
                 "change",
                 "input.js_secondary_quantity[data-line-id]",
-                function() {
+                function () {
                     _this._onChangeSecondaryUom(this);
                 }
             );
         },
-        _setValues: function(order_line) {
+        _setValues: function (order_line) {
             this.$product_qty = this.$target.find(
                 ".quantity[data-line-id=" + order_line.dataset.lineId + "]"
             );
@@ -99,7 +99,7 @@ odoo.define("website_sale_secondary_unit.animation", function(require) {
             this.secondary_uom_factor = Number(order_line.dataset.secondaryUomFactor);
             this.product_uom_factor = Number(order_line.dataset.productUomFactor);
         },
-        _onChangeSecondaryUom: function(order_line) {
+        _onChangeSecondaryUom: function (order_line) {
             this._setValues(order_line);
             const factor = this.secondary_uom_factor * this.product_uom_factor;
             this.$product_qty.val(this.secondary_uom_qty * factor);
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index 209b94520b..0bde8db34c 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_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_secondary_unit.tour", function(require) {
+odoo.define("website_sale_secondary_unit.tour", function (require) {
     "use strict";
 
     const tour = require("web_tour.tour");

From 7789303f9e4ec6cb650c9e707d18449f7ae9563d Mon Sep 17 00:00:00 2001
From: CarlosRoca13 <carlos.roca@tecnativa.com>
Date: Fri, 27 May 2022 17:24:53 +0200
Subject: [PATCH 16/32] [MIG] website_sale_secondary_unit: Migration to 15.0

---
 website_sale_secondary_unit/__manifest__.py   | 15 ++++++++---
 .../controllers/main.py                       | 17 +++++++++++--
 .../migrations/13.0.1.1.1/pre-delete-view.py  | 10 --------
 .../models/sale_order.py                      | 23 +++++++++++------
 .../src/js/website_sale_secondary_unit.js     | 25 +++++++++++++++++++
 .../js/website_sale_secondary_unit_tour.js    |  8 +++++-
 .../templates/assets.xml                      | 11 --------
 .../tests/test_website_sale_secondary_unit.py |  2 +-
 website_sale_secondary_unit/views/assets.xml  | 16 ------------
 .../views/product_secondary_unit_views.xml    | 10 ++++----
 .../views/product_template_views.xml          |  4 +--
 .../views/templates.xml                       | 12 ++++-----
 12 files changed, 87 insertions(+), 66 deletions(-)
 delete mode 100644 website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py
 delete mode 100644 website_sale_secondary_unit/templates/assets.xml
 delete mode 100644 website_sale_secondary_unit/views/assets.xml

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 979ffeae83..3309abb7c5 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "13.0.1.1.2",
+    "version": "15.0.1.0.0",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
@@ -15,12 +15,19 @@
     "data": [
         "security/ir.model.access.csv",
         "security/website_sale_secondary_unit.xml",
-        "views/assets.xml",
-        "templates/assets.xml",
-        "views/product_template_views.xml",
         "views/product_secondary_unit_views.xml",
+        "views/product_template_views.xml",
         "views/templates.xml",
     ],
     "demo": ["data/demo.xml"],
     "post_init_hook": "post_init_hook",
+    "assets": {
+        "web.assets_frontend": [
+            "/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js",
+            "/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss",
+        ],
+        "web.assets_tests": [
+            "/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"
+        ],
+    },
 }
diff --git a/website_sale_secondary_unit/controllers/main.py b/website_sale_secondary_unit/controllers/main.py
index 8903437b39..1268d00642 100644
--- a/website_sale_secondary_unit/controllers/main.py
+++ b/website_sale_secondary_unit/controllers/main.py
@@ -11,7 +11,7 @@ class WebsiteSaleSecondaryUnit(WebsiteSale):
     def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
         # Add secondary uom info to session
         request.session.pop("secondary_uom_id", None)
-        if "secondary_uom_id" in kw:
+        if kw.get("secondary_uom_id"):
             secondary_uom = request.env["product.secondary.unit"].browse(
                 int(kw["secondary_uom_id"])
             )
@@ -20,10 +20,15 @@ def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
 
     @http.route()
     def cart_update_json(
-        self, product_id, line_id=None, add_qty=None, set_qty=None, display=True
+        self, product_id, line_id=None, add_qty=None, set_qty=None, display=True, **kw
     ):
         so_line = request.env["sale.order.line"].browse(line_id)
         request.session.pop("secondary_uom_id", None)
+        if kw.get("secondary_uom_id"):
+            secondary_uom = request.env["product.secondary.unit"].browse(
+                int(kw["secondary_uom_id"])
+            )
+            request.session["secondary_uom_id"] = secondary_uom.id
         if so_line.sudo().secondary_uom_id:
             request.session["secondary_uom_id"] = so_line.sudo().secondary_uom_id.id
         return super().cart_update_json(
@@ -32,4 +37,12 @@ def cart_update_json(
             add_qty=add_qty,
             set_qty=set_qty,
             display=display,
+            **kw,
+        )
+
+    def _prepare_product_values(self, product, category, search, **kwargs):
+        res = super()._prepare_product_values(product, category, search, **kwargs)
+        res["secondary_uom_ids"] = product.secondary_uom_ids.filtered(
+            lambda su: su.active and su.is_published
         )
+        return res
diff --git a/website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py b/website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py
deleted file mode 100644
index 11454a2c00..0000000000
--- a/website_sale_secondary_unit/migrations/13.0.1.1.1/pre-delete-view.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from odoo import SUPERUSER_ID, api
-
-
-def migrate(cr, version):
-    env = api.Environment(cr, SUPERUSER_ID, {})
-    views_to_unlink = env.ref(
-        "website_sale_secondary_unit.product_template_website_publish_form_view", False
-    )
-    if views_to_unlink:
-        views_to_unlink.unlink()
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index a41adb1275..1db4623bcf 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -26,8 +26,10 @@ def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs):
             )
         return so_lines
 
-    def _website_product_id_change(self, order_id, product_id, qty=0):
-        res = super()._website_product_id_change(order_id, product_id, qty=qty)
+    def _website_product_id_change(self, order_id, product_id, qty=0, **kwargs):
+        res = super()._website_product_id_change(
+            order_id, product_id, qty=qty, **kwargs
+        )
         secondary_uom_id = self.env.context.get("secondary_uom_id", False)
         res["secondary_uom_id"] = secondary_uom_id
         return res
@@ -46,7 +48,7 @@ def _cart_update(
             secondary_uom_id = sol.secondary_uom_id.id
         else:
             secondary_uom_id = request.session.get("secondary_uom_id", False)
-        ctx = self.env.context.copy()
+        self.env.context.copy()
         if not secondary_uom_id:
             # Check the default value for secondary uom or is a product can
             # not allow to sell in base unit, so the default secondary uom
@@ -62,9 +64,9 @@ def _cart_update(
                         precision_rounding=secondary_uom.uom_id.rounding,
                     )
                     secondary_uom_id = secondary_uom.id
-        if secondary_uom_id:
-            ctx["secondary_uom_id"] = secondary_uom_id
-        return super(SaleOrder, self.with_context(ctx))._cart_update(
+        return super(
+            SaleOrder, self.with_context(secondary_uom_id=secondary_uom_id)
+        )._cart_update(
             product_id=product_id,
             line_id=line_id,
             add_qty=add_qty,
@@ -74,7 +76,7 @@ def _cart_update(
         )
 
     def _compute_cart_info(self):
-        super()._compute_cart_info()
+        res = super()._compute_cart_info()
         for order in self:
             secondary_unit_lines = order.website_order_line.filtered("secondary_uom_id")
             if secondary_unit_lines:
@@ -84,6 +86,7 @@ def _compute_cart_info(self):
                 so_lines = order.website_order_line - secondary_unit_lines
                 cart_quantity = int(sum(so_lines.mapped("product_uom_qty")))
                 order.cart_quantity = cart_quantity + cart_secondary_quantity
+        return res
 
 
 class SaleOrderLine(models.Model):
@@ -118,7 +121,11 @@ def write(self, vals):
                 and Uom.browse(vals["product_uom"])
                 or line.product_uom
             )
-            if "product_uom_qty" in vals and secondary_uom:
+            if (
+                "product_uom_qty" in vals
+                and secondary_uom
+                and secondary_uom.dependency_type == "dependent"
+            ):
                 factor = secondary_uom.factor * uom.factor
                 vals["secondary_uom_qty"] = float_round(
                     vals["product_uom_qty"] / (factor or 1.0),
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
index aff2935b0e..60e8f8c9b4 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
@@ -107,3 +107,28 @@ odoo.define("website_sale_secondary_unit.animation", function (require) {
         },
     });
 });
+
+odoo.define("website_sale_secondary_unit.website_sale", function (require) {
+    "use strict";
+
+    var publicWidget = require("web.public.widget");
+    require("website_sale.website_sale");
+
+    publicWidget.registry.WebsiteSale.include({
+        _submitForm: function () {
+            if (
+                !("secondary_uom_id" in this.rootProduct) &&
+                $(this.$target).find("#secondary_uom").length
+            ) {
+                this.rootProduct.secondary_uom_id = $(this.$target)
+                    .find("#secondary_uom")
+                    .val();
+                this.rootProduct.secondary_uom_qty = $(this.$target)
+                    .find(".secondary-quantity")
+                    .val();
+            }
+
+            this._super.apply(this, arguments);
+        },
+    });
+});
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index 0bde8db34c..dacf00607a 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -20,6 +20,9 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
             extra_trigger:
                 ".js_product:has(input[name='add_qty']:propValueContains(5)):has(.price_uom)",
         },
+        {
+            trigger: "a[href='/shop/cart']",
+        },
         {
             trigger: "a[href='/shop']",
             extra_trigger: "span:contains(Box 5 Units)",
@@ -32,12 +35,15 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
             extra_trigger:
                 ".js_product:has(input[name='add_qty']:propValueContains(1))",
         },
+        {
+            trigger: "a[href='/shop/cart']",
+        },
         {
             trigger: "a[href='/shop/checkout?express=1']",
             extra_trigger: "span:containsExact(Units)",
         },
         {
-            trigger: "#o_payment_form_pay",
+            trigger: "button[name='o_payment_submit_button']",
             extra_trigger:
                 "table:has(span:contains(Box 5 Units)):has(span:contains(Units))",
         },
diff --git a/website_sale_secondary_unit/templates/assets.xml b/website_sale_secondary_unit/templates/assets.xml
deleted file mode 100644
index 90501064ba..0000000000
--- a/website_sale_secondary_unit/templates/assets.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<odoo>
-    <template id="assets_tests" inherit_id="website.assets_tests">
-        <xpath expr=".">
-            <script
-                type="text/javascript"
-                src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"
-            />
-        </xpath>
-    </template>
-</odoo>
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index 2f4508b703..208781bb96 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -45,4 +45,4 @@ def setUp(self):
 
     def test_ui_website(self):
         """Test frontend tour."""
-        self.start_tour("/", "website_sale_secondary_unit", login="admin")
+        self.start_tour("/shop", "website_sale_secondary_unit", login="admin")
diff --git a/website_sale_secondary_unit/views/assets.xml b/website_sale_secondary_unit/views/assets.xml
deleted file mode 100644
index 78775c80ae..0000000000
--- a/website_sale_secondary_unit/views/assets.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<odoo>
-    <template id="assets_frontend" inherit_id="website.assets_frontend">
-        <xpath expr=".">
-            <script
-                type="text/javascript"
-                src="/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js"
-            />
-            <link
-                type="text/scss"
-                rel="stylesheet"
-                href="/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss"
-            />
-        </xpath>
-    </template>
-</odoo>
diff --git a/website_sale_secondary_unit/views/product_secondary_unit_views.xml b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
index c956e3cee5..b932023cb7 100644
--- a/website_sale_secondary_unit/views/product_secondary_unit_views.xml
+++ b/website_sale_secondary_unit/views/product_secondary_unit_views.xml
@@ -3,16 +3,16 @@
      Copyright 2021 Tecnativa - Pedro M. Baeza
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-    <record id="product_secondary_unit_view_tree" model="ir.ui.view">
-        <field name="model">product.secondary.unit</field>
+    <record id="product_template_form_view_secondary_unit" model="ir.ui.view">
+        <field name="model">product.template</field>
         <field
             name="inherit_id"
-            ref="product_secondary_unit.product_secondary_unit_view_tree"
+            ref="product_secondary_unit.product_template_form_view"
         />
         <field name="arch" type="xml">
-            <field name="factor" position="after">
+            <xpath expr="//tree/field[@name='factor']" position="after">
                 <field name="website_published" />
-            </field>
+            </xpath>
         </field>
     </record>
 </odoo>
diff --git a/website_sale_secondary_unit/views/product_template_views.xml b/website_sale_secondary_unit/views/product_template_views.xml
index c0d4aa4054..d45665fab3 100644
--- a/website_sale_secondary_unit/views/product_template_views.xml
+++ b/website_sale_secondary_unit/views/product_template_views.xml
@@ -2,12 +2,12 @@
 <!-- Copyright 2019 Tecnativa - Sergio Teruel
      License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
 <odoo>
-    <record id="product_template_form_view" model="ir.ui.view">
+    <record id="product_template_form_view_website_sale" model="ir.ui.view">
         <field name="name">product.template.website.secondary.unit.form</field>
         <field name="model">product.template</field>
         <field name="inherit_id" ref="website_sale.product_template_form_view" />
         <field name="arch" type="xml">
-            <field name="website_style_ids" position="after">
+            <field name="website_ribbon_id" position="after">
                 <field name="allow_uom_sell" />
             </field>
         </field>
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index 188855b2c8..c61f5e8406 100644
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -54,7 +54,7 @@
             expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']"
             position="after"
         >
-            <t t-if="product.secondary_uom_ids">
+            <t t-if="secondary_uom_ids">
                 <div class="mb8 secondary-unit">
                     <t t-call="website_sale_secondary_unit.secondary_qty" />
                     <select
@@ -63,7 +63,7 @@
                         name="secondary_uom_id"
                     >
                         <option
-                            t-if="product.secondary_uom_ids and product.allow_uom_sell"
+                            t-if="secondary_uom_ids and product.allow_uom_sell"
                             value="0"
                             t-att-selected="'selected' if not product.sale_secondary_uom_id else None"
                             t-att-data-secondary-uom-factor="1.0"
@@ -71,7 +71,7 @@
                         >
                             <span t-esc="product.uom_id.sudo().name" />
                         </option>
-                        <t t-foreach="product.secondary_uom_ids" t-as="secondary_uom">
+                        <t t-foreach="secondary_uom_ids" t-as="secondary_uom">
                             <option
                                 t-att-value="secondary_uom.id"
                                 t-att-selected="'selected' if product.sudo().sale_secondary_uom_id.id == secondary_uom.id else None"
@@ -89,8 +89,8 @@
         </xpath>
     </template>
     <template id="product_price" inherit_id="website_sale.product_price">
-        <xpath expr="//b[hasclass('oe_price')]" position="after">
-            <t t-if="product.secondary_uom_ids">
+        <xpath expr="//span[hasclass('oe_price')]" position="after">
+            <t t-if="secondary_uom_ids">
                 / <span
                     class="css_editable_mode_hidden price_uom"
                     t-field="product.uom_id"
@@ -102,7 +102,7 @@
         <xpath expr="//input[@name='add_qty']/.." position="attributes">
             <attribute
                 name="t-attf-class"
-            >css_quantity input-group oe_website_spinner #{'d-none' if product.secondary_uom_ids else None}</attribute>
+            >css_quantity input-group oe_website_spinner #{'d-none' if secondary_uom_ids else None}</attribute>
         </xpath>
     </template>
     <template id="cart_lines" inherit_id="website_sale.cart_lines">

From b2a3fdece5187c9f6117ccdbbcbc8eb18401598b Mon Sep 17 00:00:00 2001
From: oca-ci <oca-ci@odoo-community.org>
Date: Sat, 1 Oct 2022 15:17:19 +0000
Subject: [PATCH 17/32] [UPD] Update website_sale_secondary_unit.pot

---
 website_sale_secondary_unit/README.rst        | 10 ++--
 website_sale_secondary_unit/i18n/ca.po        | 48 +++++++++++++++----
 website_sale_secondary_unit/i18n/de.po        | 48 +++++++++++++++----
 website_sale_secondary_unit/i18n/es.po        | 46 +++++++++++++++---
 website_sale_secondary_unit/i18n/fr.po        | 48 +++++++++++++++----
 website_sale_secondary_unit/i18n/it.po        | 48 +++++++++++++++----
 .../i18n/website_sale_secondary_unit.pot      | 30 ++++++++++--
 .../static/description/index.html             |  6 +--
 8 files changed, 232 insertions(+), 52 deletions(-)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index d735053a20..42446c9fdc 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -14,13 +14,13 @@ Website Sale Secondary Unit
     :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_secondary_unit
+    :target: https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit
     :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_secondary_unit
+    :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit
     :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/15.0
     :alt: Try me on Runbot
 
 |badge1| |badge2| |badge3| |badge4| |badge5| 
@@ -59,7 +59,7 @@ Bug Tracker
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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 <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
 
@@ -92,6 +92,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 <https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit>`_ project on GitHub.
+This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit>`_ project on GitHub.
 
 You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_secondary_unit/i18n/ca.po b/website_sale_secondary_unit/i18n/ca.po
index 64126cba9f..1015ca64f3 100644
--- a/website_sale_secondary_unit/i18n/ca.po
+++ b/website_sale_secondary_unit/i18n/ca.po
@@ -1,6 +1,6 @@
 # Translation of Odoo Server.
 # This file contains the translation of the following modules:
-#	* website_sale_secondary_unit
+# 	* website_sale_secondary_unit
 #
 msgid ""
 msgstr ""
@@ -28,10 +28,26 @@ msgstr "Afegir un"
 msgid "Allow to sell in unit of measure"
 msgstr "Permetre vendre en una unitat de mesura"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Allowing sale_order_type to work with website_sale."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
+msgid "Can Publish"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
-msgid "Is published"
-msgstr "Està publicat"
+msgid "Is Published"
+msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -60,12 +76,28 @@ msgstr "Quantitat"
 msgid "Remove one"
 msgstr "Elimina un"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sale Order"
-msgstr "Comanda de venda"
-
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr "Línia de comanda de venda"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "The full URL to access the document through the website."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
+msgid "Visible on current website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "Website URL"
+msgstr ""
+
+#~ msgid "Is published"
+#~ msgstr "Està publicat"
+
+#~ msgid "Sale Order"
+#~ msgstr "Comanda de venda"
diff --git a/website_sale_secondary_unit/i18n/de.po b/website_sale_secondary_unit/i18n/de.po
index 622965020d..3ad1153af8 100644
--- a/website_sale_secondary_unit/i18n/de.po
+++ b/website_sale_secondary_unit/i18n/de.po
@@ -1,6 +1,6 @@
 # Translation of Odoo Server.
 # This file contains the translation of the following modules:
-#	* website_sale_secondary_unit
+# 	* website_sale_secondary_unit
 #
 msgid ""
 msgstr ""
@@ -28,10 +28,26 @@ msgstr "Hinzufügen"
 msgid "Allow to sell in unit of measure"
 msgstr "Verkauf in Mengeneinheit erlauben"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Allowing sale_order_type to work with website_sale."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
+msgid "Can Publish"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
-msgid "Is published"
-msgstr "Veröffentlicht"
+msgid "Is Published"
+msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -60,12 +76,28 @@ msgstr "Menge"
 msgid "Remove one"
 msgstr "Entfernen"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sale Order"
-msgstr "Auftrag"
-
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr "Auftragsposition"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "The full URL to access the document through the website."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
+msgid "Visible on current website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "Website URL"
+msgstr ""
+
+#~ msgid "Is published"
+#~ msgstr "Veröffentlicht"
+
+#~ msgid "Sale Order"
+#~ msgstr "Auftrag"
diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index c580e61bbe..a092fe0296 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -29,10 +29,26 @@ msgstr "Añadir uno"
 msgid "Allow to sell in unit of measure"
 msgstr "Permitir vender en la unidad de medida"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Allowing sale_order_type to work with website_sale."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
+msgid "Can Publish"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
-msgid "Is published"
-msgstr "Está publicado"
+msgid "Is Published"
+msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -61,16 +77,32 @@ msgstr "Cantidad"
 msgid "Remove one"
 msgstr "Quitar uno"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sale Order"
-msgstr "Pedido de venta"
-
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr "Línea de pedido"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "The full URL to access the document through the website."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
+msgid "Visible on current website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "Website URL"
+msgstr ""
+
+#~ msgid "Is published"
+#~ msgstr "Está publicado"
+
+#~ msgid "Sale Order"
+#~ msgstr "Pedido de venta"
+
 #~ msgid "Quotation"
 #~ msgstr "Presupuesto"
 
diff --git a/website_sale_secondary_unit/i18n/fr.po b/website_sale_secondary_unit/i18n/fr.po
index 563076c6e3..5cddef533f 100644
--- a/website_sale_secondary_unit/i18n/fr.po
+++ b/website_sale_secondary_unit/i18n/fr.po
@@ -1,6 +1,6 @@
 # Translation of Odoo Server.
 # This file contains the translation of the following modules:
-#	* website_sale_secondary_unit
+# 	* website_sale_secondary_unit
 #
 msgid ""
 msgstr ""
@@ -28,10 +28,26 @@ msgstr "Ajouter"
 msgid "Allow to sell in unit of measure"
 msgstr "Autorise la vente dans l'unité de mesure par défaut"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Allowing sale_order_type to work with website_sale."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
+msgid "Can Publish"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
-msgid "Is published"
-msgstr "Est publié"
+msgid "Is Published"
+msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -60,12 +76,28 @@ msgstr "Quantité"
 msgid "Remove one"
 msgstr "Supprimer"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sale Order"
-msgstr "Commande client"
-
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr "Ligne de commande de vente"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "The full URL to access the document through the website."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
+msgid "Visible on current website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "Website URL"
+msgstr ""
+
+#~ msgid "Is published"
+#~ msgstr "Est publié"
+
+#~ msgid "Sale Order"
+#~ msgstr "Commande client"
diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index ffc4d303d9..cf94bdbd10 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -1,6 +1,6 @@
 # Translation of Odoo Server.
 # This file contains the translation of the following modules:
-#	* website_sale_secondary_unit
+# 	* website_sale_secondary_unit
 #
 msgid ""
 msgstr ""
@@ -28,10 +28,26 @@ msgstr "Aggiungi uno"
 msgid "Allow to sell in unit of measure"
 msgstr "Permetti vendita in Unità di Misura base"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Allowing sale_order_type to work with website_sale."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
+#: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
+msgid "Box"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
+msgid "Can Publish"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
-msgid "Is published"
-msgstr "E' pubblicato"
+msgid "Is Published"
+msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -60,12 +76,28 @@ msgstr "Quantità"
 msgid "Remove one"
 msgstr "Rimuovi uno"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sale Order"
-msgstr "Ordine di Vendita"
-
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
 msgstr "Riga Ordine di Vendita"
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "The full URL to access the document through the website."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
+msgid "Visible on current website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "Website URL"
+msgstr ""
+
+#~ msgid "Is published"
+#~ msgstr "E' pubblicato"
+
+#~ msgid "Sale Order"
+#~ msgstr "Ordine di Vendita"
diff --git a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
index ecb890b93c..5a429b07d7 100644
--- a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
+++ b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
@@ -4,7 +4,7 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
 "Report-Msgid-Bugs-To: \n"
 "Last-Translator: \n"
 "Language-Team: \n"
@@ -25,12 +25,22 @@ msgstr ""
 msgid "Allow to sell in unit of measure"
 msgstr ""
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Allowing sale_order_type to work with website_sale."
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
 msgid "Box"
 msgstr ""
 
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
+msgid "Can Publish"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
 msgid "Is Published"
@@ -64,11 +74,21 @@ msgid "Remove one"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Sales Order"
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
+msgid "Sales Order Line"
 msgstr ""
 
 #. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
-msgid "Sales Order Line"
+#: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "The full URL to access the document through the website."
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
+msgid "Visible on current website"
+msgstr ""
+
+#. module: website_sale_secondary_unit
+#: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
+msgid "Website URL"
 msgstr ""
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index 93b4cdf44d..ebcf6419c5 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -367,7 +367,7 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-13-0/e-commerce-13-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/15.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
@@ -408,7 +408,7 @@ <h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
-<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
@@ -436,7 +436,7 @@ <h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
 <p>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.</p>
-<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/13.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
 <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
 </div>
 </div>

From bbc4cf98dfd037281ef28aa5ccb25307c0bc3b61 Mon Sep 17 00:00:00 2001
From: David <david.vidal@tecnativa.com>
Date: Tue, 20 Dec 2022 16:40:53 +0100
Subject: [PATCH 18/32] [IMP] website_sale_secondary_unit: mobile UX

For mobile users adding an extra column in the cart summary makes that
the others content won't fit very well, specially for products with long
names. As we can infer the sale line information without the secondary
units computation computation column we choose to hide it if the screen
is too small as Odoo does with the product image column.

TT37137
---
 website_sale_secondary_unit/__manifest__.py     | 2 +-
 website_sale_secondary_unit/views/templates.xml | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 3309abb7c5..654febd75d 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "15.0.1.0.0",
+    "version": "15.0.1.1.0",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index c61f5e8406..c9e17a83c9 100644
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -166,10 +166,10 @@
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
-            <th class="text-center td-qty">Quantity</th>
+            <th class="text-center td-qty d-none d-md-table-cell">Quantity</th>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]" position="after">
-            <td class="text-center td-qty">
+            <td class="text-center td-qty d-none d-md-table-cell">
                 <span
                     t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
                 />

From a4264278d4a02b1f71fe66a0300f7e87d9784fb5 Mon Sep 17 00:00:00 2001
From: Francesco Foresti <francesco.foresti@ooops404.com>
Date: Fri, 7 Apr 2023 13:47:04 +0000
Subject: [PATCH 19/32] Translated using Weblate (Italian)

Currently translated at 53.3% (8 of 15 strings)

Translation: e-commerce-15.0/e-commerce-15.0-website_sale_secondary_unit
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit/it/
---
 website_sale_secondary_unit/i18n/it.po | 28 +++++++++++++-------------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index cf94bdbd10..9c47f8d03e 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Odoo Server 12.0\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2020-08-26 10:00+0000\n"
+"PO-Revision-Date: 2023-06-06 17:08+0000\n"
 "Last-Translator: Francesco Foresti <francesco.foresti@ooops404.com>\n"
 "Language-Team: none\n"
 "Language: it\n"
@@ -14,7 +14,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: \n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.10\n"
+"X-Generator: Weblate 4.17\n"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
@@ -26,43 +26,43 @@ msgstr "Aggiungi uno"
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_product__allow_uom_sell
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_template__allow_uom_sell
 msgid "Allow to sell in unit of measure"
-msgstr "Permetti vendita in Unità di Misura base"
+msgstr "Permetti vendita in unità di misura base"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
 msgid "Allowing sale_order_type to work with website_sale."
-msgstr ""
+msgstr "Permette a sale_order_type di funzionare con website_sale."
 
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
 msgid "Box"
-msgstr ""
+msgstr "Cartone"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
 msgid "Can Publish"
-msgstr ""
+msgstr "Può pubblicare"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
 msgid "Is Published"
-msgstr ""
+msgstr "E' pubblicato"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
 msgid "Product Secondary Unit"
-msgstr "Unità di Misura Secondaria"
+msgstr "Unità di misura secondaria"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_template
 msgid "Product Template"
-msgstr "Modello Prodotto"
+msgstr "Modello prodotto"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
 msgid "Qty:"
-msgstr "Qty:"
+msgstr "Qtà:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
@@ -79,22 +79,22 @@ msgstr "Rimuovi uno"
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
-msgstr "Riga Ordine di Vendita"
+msgstr "Riga ordine di vendita"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
 msgid "The full URL to access the document through the website."
-msgstr ""
+msgstr "L'URL completo per accedere al documento dal sito web."
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
 msgid "Visible on current website"
-msgstr ""
+msgstr "Visibile sul sito web attuale"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
 msgid "Website URL"
-msgstr ""
+msgstr "URL sito web"
 
 #~ msgid "Is published"
 #~ msgstr "E' pubblicato"

From 825ccbc93ccdc99620b512ddfedafe93081fb6b4 Mon Sep 17 00:00:00 2001
From: Ivorra78 <informatica@totmaterial.es>
Date: Wed, 5 Jul 2023 11:17:46 +0000
Subject: [PATCH 20/32] Translated using Weblate (Spanish)

Currently translated at 100.0% (15 of 15 strings)

Translation: e-commerce-15.0/e-commerce-15.0-website_sale_secondary_unit
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit/es/
---
 website_sale_secondary_unit/i18n/es.po | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index a092fe0296..c4a08802ff 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -7,15 +7,15 @@ msgstr ""
 "Project-Id-Version: Odoo Server 11.0\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-03-13 16:54+0000\n"
-"PO-Revision-Date: 2020-11-03 13:08+0000\n"
-"Last-Translator: claudiagn <claudia.gargallo@qubiq.es>\n"
+"PO-Revision-Date: 2023-07-05 14:08+0000\n"
+"Last-Translator: Ivorra78 <informatica@totmaterial.es>\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 3.10\n"
+"X-Generator: Weblate 4.17\n"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
@@ -32,23 +32,23 @@ msgstr "Permitir vender en la unidad de medida"
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
 msgid "Allowing sale_order_type to work with website_sale."
-msgstr ""
+msgstr "Permitir que sale_order_type funcione con website_sale."
 
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
 msgid "Box"
-msgstr ""
+msgstr "Caja"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__can_publish
 msgid "Can Publish"
-msgstr ""
+msgstr "Se puede publicar"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
 msgid "Is Published"
-msgstr ""
+msgstr "Está publicado"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -85,17 +85,17 @@ msgstr "Línea de pedido"
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
 msgid "The full URL to access the document through the website."
-msgstr ""
+msgstr "La URL completa para acceder al documento a través del sitio web."
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published
 msgid "Visible on current website"
-msgstr ""
+msgstr "Visible en la página web actual"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_url
 msgid "Website URL"
-msgstr ""
+msgstr "URL de la página web"
 
 #~ msgid "Is published"
 #~ msgstr "Está publicado"

From efb67ca2ff415a353680e9f3dff872372c51de96 Mon Sep 17 00:00:00 2001
From: mymage <stefano.consolaro@mymage.it>
Date: Tue, 18 Jul 2023 11:20:50 +0000
Subject: [PATCH 21/32] Translated using Weblate (Italian)

Currently translated at 100.0% (15 of 15 strings)

Translation: e-commerce-15.0/e-commerce-15.0-website_sale_secondary_unit
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit/it/
---
 website_sale_secondary_unit/i18n/it.po | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index 9c47f8d03e..decba76e45 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Odoo Server 12.0\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-06-06 17:08+0000\n"
-"Last-Translator: Francesco Foresti <francesco.foresti@ooops404.com>\n"
+"PO-Revision-Date: 2023-07-21 09:10+0000\n"
+"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
 "Language-Team: none\n"
 "Language: it\n"
 "MIME-Version: 1.0\n"
@@ -47,7 +47,7 @@ msgstr "Può pubblicare"
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__is_published
 msgid "Is Published"
-msgstr "E' pubblicato"
+msgstr "È pubblicato"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
@@ -84,7 +84,7 @@ msgstr "Riga ordine di vendita"
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,help:website_sale_secondary_unit.field_product_secondary_unit__website_url
 msgid "The full URL to access the document through the website."
-msgstr "L'URL completo per accedere al documento dal sito web."
+msgstr "L'URL completo per accedere al documento attraverso il sito web."
 
 #. module: website_sale_secondary_unit
 #: model:ir.model.fields,field_description:website_sale_secondary_unit.field_product_secondary_unit__website_published

From fee8ca8570504b87e59a66dfd9f9e138d86da604 Mon Sep 17 00:00:00 2001
From: oca-ci <oca-ci@odoo-community.org>
Date: Fri, 11 Aug 2023 17:00:55 +0000
Subject: [PATCH 22/32] [UPD] Update website_sale_secondary_unit.pot

---
 website_sale_secondary_unit/README.rst        | 15 ++++---
 website_sale_secondary_unit/i18n/ca.po        | 10 ++---
 website_sale_secondary_unit/i18n/de.po        | 10 ++---
 website_sale_secondary_unit/i18n/es.po        | 13 +++---
 website_sale_secondary_unit/i18n/fr.po        | 10 ++---
 website_sale_secondary_unit/i18n/it.po        | 13 +++---
 .../i18n/website_sale_secondary_unit.pot      | 10 ++---
 .../static/description/index.html             | 42 ++++++++++---------
 8 files changed, 67 insertions(+), 56 deletions(-)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index 42446c9fdc..a864402f1e 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -2,10 +2,13 @@
 Website Sale Secondary Unit
 ===========================
 
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+.. 
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !! This file is generated by oca-gen-addon-readme !!
    !! changes will be overwritten.                   !!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   !! source digest: sha256:5d62d1f0dc3e76f84ddc216fe3f7021a1cfa375533c88a7a02576aa74c0231c2
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
     :target: https://odoo-community.org/page/development-status
@@ -19,11 +22,11 @@ Website Sale Secondary Unit
 .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
     :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit
     :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/15.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 sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.
@@ -58,7 +61,7 @@ Bug Tracker
 
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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
+If you spotted it first, help us to smash it by providing a detailed and welcomed
 `feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
diff --git a/website_sale_secondary_unit/i18n/ca.po b/website_sale_secondary_unit/i18n/ca.po
index 1015ca64f3..efc94ec67b 100644
--- a/website_sale_secondary_unit/i18n/ca.po
+++ b/website_sale_secondary_unit/i18n/ca.po
@@ -28,11 +28,6 @@ msgstr "Afegir un"
 msgid "Allow to sell in unit of measure"
 msgstr "Permetre vendre en una unitat de mesura"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Allowing sale_order_type to work with website_sale."
-msgstr ""
-
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
@@ -76,6 +71,11 @@ msgstr "Quantitat"
 msgid "Remove one"
 msgstr "Elimina un"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
diff --git a/website_sale_secondary_unit/i18n/de.po b/website_sale_secondary_unit/i18n/de.po
index 3ad1153af8..71b113e06c 100644
--- a/website_sale_secondary_unit/i18n/de.po
+++ b/website_sale_secondary_unit/i18n/de.po
@@ -28,11 +28,6 @@ msgstr "Hinzufügen"
 msgid "Allow to sell in unit of measure"
 msgstr "Verkauf in Mengeneinheit erlauben"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Allowing sale_order_type to work with website_sale."
-msgstr ""
-
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
@@ -76,6 +71,11 @@ msgstr "Menge"
 msgid "Remove one"
 msgstr "Entfernen"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index c4a08802ff..c949fef02d 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -29,11 +29,6 @@ msgstr "Añadir uno"
 msgid "Allow to sell in unit of measure"
 msgstr "Permitir vender en la unidad de medida"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Allowing sale_order_type to work with website_sale."
-msgstr "Permitir que sale_order_type funcione con website_sale."
-
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
@@ -77,6 +72,11 @@ msgstr "Cantidad"
 msgid "Remove one"
 msgstr "Quitar uno"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
@@ -97,6 +97,9 @@ msgstr "Visible en la página web actual"
 msgid "Website URL"
 msgstr "URL de la página web"
 
+#~ msgid "Allowing sale_order_type to work with website_sale."
+#~ msgstr "Permitir que sale_order_type funcione con website_sale."
+
 #~ msgid "Is published"
 #~ msgstr "Está publicado"
 
diff --git a/website_sale_secondary_unit/i18n/fr.po b/website_sale_secondary_unit/i18n/fr.po
index 5cddef533f..63a6ff74a1 100644
--- a/website_sale_secondary_unit/i18n/fr.po
+++ b/website_sale_secondary_unit/i18n/fr.po
@@ -28,11 +28,6 @@ msgstr "Ajouter"
 msgid "Allow to sell in unit of measure"
 msgstr "Autorise la vente dans l'unité de mesure par défaut"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Allowing sale_order_type to work with website_sale."
-msgstr ""
-
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
@@ -76,6 +71,11 @@ msgstr "Quantité"
 msgid "Remove one"
 msgstr "Supprimer"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index decba76e45..14c122dbc5 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -28,11 +28,6 @@ msgstr "Aggiungi uno"
 msgid "Allow to sell in unit of measure"
 msgstr "Permetti vendita in unità di misura base"
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Allowing sale_order_type to work with website_sale."
-msgstr "Permette a sale_order_type di funzionare con website_sale."
-
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
@@ -76,6 +71,11 @@ msgstr "Quantità"
 msgid "Remove one"
 msgstr "Rimuovi uno"
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
@@ -96,6 +96,9 @@ msgstr "Visibile sul sito web attuale"
 msgid "Website URL"
 msgstr "URL sito web"
 
+#~ msgid "Allowing sale_order_type to work with website_sale."
+#~ msgstr "Permette a sale_order_type di funzionare con website_sale."
+
 #~ msgid "Is published"
 #~ msgstr "E' pubblicato"
 
diff --git a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
index 5a429b07d7..1e2046b94e 100644
--- a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
+++ b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
@@ -25,11 +25,6 @@ msgstr ""
 msgid "Allow to sell in unit of measure"
 msgstr ""
 
-#. module: website_sale_secondary_unit
-#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
-msgid "Allowing sale_order_type to work with website_sale."
-msgstr ""
-
 #. module: website_sale_secondary_unit
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_10
 #: model:product.secondary.unit,name:website_sale_secondary_unit.secondary_unit_box_5
@@ -73,6 +68,11 @@ msgstr ""
 msgid "Remove one"
 msgstr ""
 
+#. module: website_sale_secondary_unit
+#: model:ir.model,name:website_sale_secondary_unit.model_sale_order
+msgid "Sales Order"
+msgstr ""
+
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line
 msgid "Sales Order Line"
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index ebcf6419c5..b69a01eb6d 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
 <title>Website Sale Secondary Unit</title>
 <style type="text/css">
 
 /*
 :Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
 :Copyright: This stylesheet has been placed in the public domain.
 
 Default cascading style sheet for the HTML output of Docutils.
 
-See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
 customize this style sheet.
 */
 
@@ -366,31 +366,33 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! source digest: sha256:5d62d1f0dc3e76f84ddc216fe3f7021a1cfa375533c88a7a02576aa74c0231c2
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/113/15.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
 <div class="contents local topic" id="contents">
 <ul class="simple">
-<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
-<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
-<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
-<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
-<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
-<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
-<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
+<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
+<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
 </ul>
 </li>
 </ul>
 </div>
 <div class="section" id="configuration">
-<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
 <p>For define the secondary units, you should active <em>Manage multiples units of measure</em> on
 the user that will be responsable of this function.</p>
 </div>
 <div class="section" id="usage">
-<h1><a class="toc-backref" href="#id2">Usage</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
 <p>To use this module you need to:</p>
 <ul class="simple">
 <li>Go to <em>‘Website &gt; Products &gt; Products’</em>.</li>
@@ -404,23 +406,23 @@ <h1><a class="toc-backref" href="#id2">Usage</a></h1>
 </ul>
 </div>
 <div class="section" id="bug-tracker">
-<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
+If you spotted it first, help us to smash it by providing a detailed and welcomed
 <a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
-<h1><a class="toc-backref" href="#id4">Credits</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
 <div class="section" id="authors">
-<h2><a class="toc-backref" href="#id5">Authors</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
 <ul class="simple">
 <li>Tecnativa</li>
 </ul>
 </div>
 <div class="section" id="contributors">
-<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
 <ul class="simple">
 <li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
 <li>Sergio Teruel</li>
@@ -430,7 +432,7 @@ <h2><a class="toc-backref" href="#id6">Contributors</a></h2>
 </ul>
 </div>
 <div class="section" id="maintainers">
-<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
 <p>This module is maintained by the OCA.</p>
 <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
 <p>OCA, or the Odoo Community Association, is a nonprofit organization whose

From 1017fa875f2f0945cecd01a3619c1cfc50becb9d Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa <pilar.vargas@tecnativa.com>
Date: Wed, 13 Sep 2023 15:56:46 +0200
Subject: [PATCH 23/32] [FIX] website_sale_secondary_unit: t-esc directives are
 deprecated

---
 .../views/templates.xml                       | 20 +++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index c9e17a83c9..92069da895 100644
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -42,7 +42,7 @@
             t-value="int(secondary_uom.factor) == secondary_uom.factor and int(secondary_uom.factor) or secondary_uom.factor"
         />
         <span
-            t-esc="'{} {} {}'.format(secondary_uom.name, factor, secondary_uom.product_tmpl_id.sudo().uom_id.name)"
+            t-out="'{} {} {}'.format(secondary_uom.name, factor, secondary_uom.product_tmpl_id.sudo().uom_id.name)"
         />
     </template>
     <template
@@ -69,7 +69,7 @@
                             t-att-data-secondary-uom-factor="1.0"
                             t-att-data-product-uom-factor="1.0"
                         >
-                            <span t-esc="product.uom_id.sudo().name" />
+                            <span t-out="product.uom_id.sudo().name" />
                         </option>
                         <t t-foreach="secondary_uom_ids" t-as="secondary_uom">
                             <option
@@ -162,7 +162,7 @@
             position="after"
         >
             <t t-if="not line.secondary_uom_id">
-                <span t-esc="line.product_uom.sudo().name" />
+                <span t-out="line.product_uom.sudo().name" />
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
@@ -171,9 +171,9 @@
         <xpath expr="//td[hasclass('td-qty')]" position="after">
             <td class="text-center td-qty d-none d-md-table-cell">
                 <span
-                    t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
+                    t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
                 />
-                <span t-esc="line.product_uom.sudo().name" />
+                <span t-out="line.product_uom.sudo().name" />
             </td>
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
@@ -190,7 +190,7 @@
         <xpath expr="//td[hasclass('td-qty')]" position="inside">
             <t t-if="line.secondary_uom_id">
                 <div
-                    t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
+                    t-out="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
                 />
                 <t t-call="website_sale_secondary_unit.second_qty_description">
                     <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
@@ -204,7 +204,7 @@
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div" position="after">
             <t t-if="not line.secondary_uom_id">
-                <span t-esc="line.product_uom.sudo().name" />
+                <span t-out="line.product_uom.sudo().name" />
             </t>
         </xpath>
         <xpath expr="//th[hasclass('td-qty')]" position="after">
@@ -213,9 +213,9 @@
         <xpath expr="//td[hasclass('td-qty')]" position="after">
             <td class="text-center td-qty">
                 <span
-                    t-esc="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
+                    t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
                 />
-                <span t-esc="line.product_uom.sudo().name" />
+                <span t-out="line.product_uom.sudo().name" />
             </td>
         </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
@@ -232,7 +232,7 @@
         <xpath expr="//div[hasclass('col-9')]" position="inside">
             <div t-if="line.secondary_uom_id">
                 Qty: <t
-                    t-esc="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
+                    t-out="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
                 />
                 <t t-call="website_sale_secondary_unit.second_qty_description">
                     <t t-set="secondary_uom" t-value="line.secondary_uom_id" />

From 403f23c5cd6b0aa0de384c74a8ffb0a3bb5702f3 Mon Sep 17 00:00:00 2001
From: pilarvargas-tecnativa <pilar.vargas@tecnativa.com>
Date: Wed, 13 Sep 2023 15:58:43 +0200
Subject: [PATCH 24/32] [IMP] website_sale_secondary_unit: Hide/show uom name
 in secondary quantity description and delete column in purchase summary

There were two quantity columns in the purchase summary, one with the
secondary unit quantity and one with the product quantity. A quantity
column in the purchase summary has been removed to give more clarity
to the view. When product names or units of measure have a considerable
number of characters, having two columns causes a crowding of the view
and therefore a feeling of content clutter. Instead, their content has
been moved so that both the secondary unit quantity and the quantity
of product purchased appear in the same column.

We have also added the option to hide the name of the secondary unit of
measure in the secondary unit description template in case it matches
the unit of measure of the product as depending on where it is being
called from it can be redundant.

TT45032
---
 website_sale_secondary_unit/README.rst        | 12 +++---
 .../readme/CONTRIBUTORS.rst                   |  1 +
 .../static/description/index.html             | 43 +++++++++----------
 .../js/website_sale_secondary_unit_tour.js    |  6 +--
 .../views/templates.xml                       | 39 +++++++++--------
 5 files changed, 51 insertions(+), 50 deletions(-)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index a864402f1e..c3ca12b3b6 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -2,13 +2,10 @@
 Website Sale Secondary Unit
 ===========================
 
-.. 
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !! This file is generated by oca-gen-addon-readme !!
    !! changes will be overwritten.                   !!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   !! source digest: sha256:5d62d1f0dc3e76f84ddc216fe3f7021a1cfa375533c88a7a02576aa74c0231c2
-   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
     :target: https://odoo-community.org/page/development-status
@@ -23,10 +20,10 @@ Website Sale Secondary Unit
     :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit
     :alt: Translate me on Weblate
 .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
-    :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=15.0
+    :target: https://runboat.odoo-community.org/webui/builds.html?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 sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.
@@ -61,7 +58,7 @@ Bug Tracker
 
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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
+If you spotted it first, help us smashing it by providing a detailed and welcomed
 `feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
@@ -81,6 +78,7 @@ Contributors
 
   * Sergio Teruel
   * Carlos Roca
+  * Pilar Vargas
 
 Maintainers
 ~~~~~~~~~~~
diff --git a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
index 5a78ea95cf..9321aaf14e 100644
--- a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
+++ b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
@@ -2,3 +2,4 @@
 
   * Sergio Teruel
   * Carlos Roca
+  * Pilar Vargas
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index b69a01eb6d..e0c2078d5f 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
+<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
 <title>Website Sale Secondary Unit</title>
 <style type="text/css">
 
 /*
 :Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
 :Copyright: This stylesheet has been placed in the public domain.
 
 Default cascading style sheet for the HTML output of Docutils.
 
-See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
 customize this style sheet.
 */
 
@@ -366,33 +366,31 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:5d62d1f0dc3e76f84ddc216fe3f7021a1cfa375533c88a7a02576aa74c0231c2
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runboat.odoo-community.org/webui/builds.html?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
 <div class="contents local topic" id="contents">
 <ul class="simple">
-<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
-<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
-<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
-<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
-<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
-<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
-<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
+<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
+<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
 </ul>
 </li>
 </ul>
 </div>
 <div class="section" id="configuration">
-<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
+<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
 <p>For define the secondary units, you should active <em>Manage multiples units of measure</em> on
 the user that will be responsable of this function.</p>
 </div>
 <div class="section" id="usage">
-<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
+<h1><a class="toc-backref" href="#id2">Usage</a></h1>
 <p>To use this module you need to:</p>
 <ul class="simple">
 <li>Go to <em>‘Website &gt; Products &gt; Products’</em>.</li>
@@ -406,33 +404,34 @@ <h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
 </ul>
 </div>
 <div class="section" id="bug-tracker">
-<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
+<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
+If you spotted it first, help us smashing it by providing a detailed and welcomed
 <a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
-<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
+<h1><a class="toc-backref" href="#id4">Credits</a></h1>
 <div class="section" id="authors">
-<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
+<h2><a class="toc-backref" href="#id5">Authors</a></h2>
 <ul class="simple">
 <li>Tecnativa</li>
 </ul>
 </div>
 <div class="section" id="contributors">
-<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
+<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
 <ul class="simple">
 <li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
 <li>Sergio Teruel</li>
 <li>Carlos Roca</li>
+<li>Pilar Vargas</li>
 </ul>
 </li>
 </ul>
 </div>
 <div class="section" id="maintainers">
-<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
+<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
 <p>This module is maintained by the OCA.</p>
 <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
 <p>OCA, or the Odoo Community Association, is a nonprofit organization whose
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
index dacf00607a..71d58d4b1b 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
@@ -44,13 +44,11 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
         },
         {
             trigger: "button[name='o_payment_submit_button']",
-            extra_trigger:
-                "table:has(span:contains(Box 5 Units)):has(span:contains(Units))",
+            extra_trigger: "table:has(span:contains(Box 5)):has(span:contains(Units))",
         },
         {
             trigger: "a[href='/shop']",
-            extra_trigger:
-                "table:has(span:contains(Box 5 Units)):has(span:contains(Units))",
+            extra_trigger: "table:has(span:contains(Box 5)):has(span:contains(Units))",
         },
     ];
 
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index 92069da895..3e29dac317 100644
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -41,9 +41,12 @@
             t-set="factor"
             t-value="int(secondary_uom.factor) == secondary_uom.factor and int(secondary_uom.factor) or secondary_uom.factor"
         />
+        <!-- Show/hide unit of measure: In case the secondary unit of measure matches the unit of measure of the product it can be omitted so that it is not redundant depending on where this template is called from. -->
         <span
+            t-if="not hide_uom_name"
             t-out="'{} {} {}'.format(secondary_uom.name, factor, secondary_uom.product_tmpl_id.sudo().uom_id.name)"
         />
+        <span t-else="" t-out="'{} {}'.format(secondary_uom.name, factor)" />
     </template>
     <template
         id="product"
@@ -189,12 +192,25 @@
     <template id="cart_summary" inherit_id="website_sale.cart_summary">
         <xpath expr="//td[hasclass('td-qty')]" position="inside">
             <t t-if="line.secondary_uom_id">
-                <div
-                    t-out="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
-                />
-                <t t-call="website_sale_secondary_unit.second_qty_description">
-                    <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
-                </t>
+                <div>
+                    <span
+                        t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
+                    />
+                    <span t-out="line.product_uom.sudo().name" />
+                </div>
+                <div class="font-weight-light">
+                    <t
+                        t-out="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
+                    />
+                    <t t-call="website_sale_secondary_unit.second_qty_description">
+                        <t
+                            t-if="line.product_uom.sudo().name == line.secondary_uom_id.product_tmpl_id.sudo().uom_id.name"
+                            t-set="hide_uom_name"
+                            t-value="True"
+                        />
+                        <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
+                    </t>
+                </div>
             </t>
         </xpath>
         <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
@@ -207,17 +223,6 @@
                 <span t-out="line.product_uom.sudo().name" />
             </t>
         </xpath>
-        <xpath expr="//th[hasclass('td-qty')]" position="after">
-            <th class="text-center td-qty">Quantity</th>
-        </xpath>
-        <xpath expr="//td[hasclass('td-qty')]" position="after">
-            <td class="text-center td-qty">
-                <span
-                    t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
-                />
-                <span t-out="line.product_uom.sudo().name" />
-            </td>
-        </xpath>
         <!-- Display product uom to price column to clarify that price is per product unit -->
         <xpath expr="//td[hasclass('td-price')]" position="inside">
             <t t-if="line.product_id.secondary_uom_ids">

From fd1b6cceed31070a3daedaa0080e7f0411051dff Mon Sep 17 00:00:00 2001
From: oca-ci <oca-ci@odoo-community.org>
Date: Thu, 14 Sep 2023 14:09:09 +0000
Subject: [PATCH 25/32] [UPD] Update website_sale_secondary_unit.pot

---
 website_sale_secondary_unit/README.rst        | 11 +++--
 website_sale_secondary_unit/__manifest__.py   |  2 +-
 website_sale_secondary_unit/i18n/ca.po        |  1 -
 website_sale_secondary_unit/i18n/de.po        |  1 -
 website_sale_secondary_unit/i18n/es.po        |  1 -
 website_sale_secondary_unit/i18n/fr.po        |  1 -
 website_sale_secondary_unit/i18n/it.po        |  1 -
 .../i18n/website_sale_secondary_unit.pot      |  1 -
 .../static/description/index.html             | 42 ++++++++++---------
 9 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index c3ca12b3b6..89520e273e 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -2,10 +2,13 @@
 Website Sale Secondary Unit
 ===========================
 
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+.. 
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !! This file is generated by oca-gen-addon-readme !!
    !! changes will be overwritten.                   !!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   !! source digest: sha256:2617863988b7ef88ad135912c4bac209798afe500817e8ebd15d04b017139ed0
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
     :target: https://odoo-community.org/page/development-status
@@ -20,10 +23,10 @@ Website Sale Secondary Unit
     :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit
     :alt: Translate me on Weblate
 .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
-    :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/e-commerce&target_branch=15.0
+    :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 sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.
@@ -58,7 +61,7 @@ Bug Tracker
 
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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
+If you spotted it first, help us to smash it by providing a detailed and welcomed
 `feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 654febd75d..5b21b0727f 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "15.0.1.1.0",
+    "version": "15.0.1.2.0",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
diff --git a/website_sale_secondary_unit/i18n/ca.po b/website_sale_secondary_unit/i18n/ca.po
index efc94ec67b..a2790b9122 100644
--- a/website_sale_secondary_unit/i18n/ca.po
+++ b/website_sale_secondary_unit/i18n/ca.po
@@ -61,7 +61,6 @@ msgstr "Quantitat:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr "Quantitat"
 
diff --git a/website_sale_secondary_unit/i18n/de.po b/website_sale_secondary_unit/i18n/de.po
index 71b113e06c..e21be4907c 100644
--- a/website_sale_secondary_unit/i18n/de.po
+++ b/website_sale_secondary_unit/i18n/de.po
@@ -61,7 +61,6 @@ msgstr "Menge:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr "Menge"
 
diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index c949fef02d..372c62e7e0 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -62,7 +62,6 @@ msgstr "Cantidad:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr "Cantidad"
 
diff --git a/website_sale_secondary_unit/i18n/fr.po b/website_sale_secondary_unit/i18n/fr.po
index 63a6ff74a1..2534b953e3 100644
--- a/website_sale_secondary_unit/i18n/fr.po
+++ b/website_sale_secondary_unit/i18n/fr.po
@@ -61,7 +61,6 @@ msgstr "Qté :"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr "Quantité"
 
diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index 14c122dbc5..f8424d0d57 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -61,7 +61,6 @@ msgstr "Qtà:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr "Quantità"
 
diff --git a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
index 1e2046b94e..d2f6c60fda 100644
--- a/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
+++ b/website_sale_secondary_unit/i18n/website_sale_secondary_unit.pot
@@ -58,7 +58,6 @@ msgstr ""
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines
-#: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_summary
 msgid "Quantity"
 msgstr ""
 
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index e0c2078d5f..049bd6a74c 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -1,20 +1,20 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
 <title>Website Sale Secondary Unit</title>
 <style type="text/css">
 
 /*
 :Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
 :Copyright: This stylesheet has been placed in the public domain.
 
 Default cascading style sheet for the HTML output of Docutils.
 
-See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
 customize this style sheet.
 */
 
@@ -366,31 +366,33 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! source digest: sha256:2617863988b7ef88ad135912c4bac209798afe500817e8ebd15d04b017139ed0
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runboat.odoo-community.org/webui/builds.html?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
 allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
 <div class="contents local topic" id="contents">
 <ul class="simple">
-<li><a class="reference internal" href="#configuration" id="id1">Configuration</a></li>
-<li><a class="reference internal" href="#usage" id="id2">Usage</a></li>
-<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
-<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
-<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
-<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
-<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
+<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
+<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
 </ul>
 </li>
 </ul>
 </div>
 <div class="section" id="configuration">
-<h1><a class="toc-backref" href="#id1">Configuration</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
 <p>For define the secondary units, you should active <em>Manage multiples units of measure</em> on
 the user that will be responsable of this function.</p>
 </div>
 <div class="section" id="usage">
-<h1><a class="toc-backref" href="#id2">Usage</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
 <p>To use this module you need to:</p>
 <ul class="simple">
 <li>Go to <em>‘Website &gt; Products &gt; Products’</em>.</li>
@@ -404,23 +406,23 @@ <h1><a class="toc-backref" href="#id2">Usage</a></h1>
 </ul>
 </div>
 <div class="section" id="bug-tracker">
-<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
+If you spotted it first, help us to smash it by providing a detailed and welcomed
 <a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
-<h1><a class="toc-backref" href="#id4">Credits</a></h1>
+<h1><a class="toc-backref" href="#toc-entry-4">Credits</a></h1>
 <div class="section" id="authors">
-<h2><a class="toc-backref" href="#id5">Authors</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-5">Authors</a></h2>
 <ul class="simple">
 <li>Tecnativa</li>
 </ul>
 </div>
 <div class="section" id="contributors">
-<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
 <ul class="simple">
 <li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
 <li>Sergio Teruel</li>
@@ -431,7 +433,7 @@ <h2><a class="toc-backref" href="#id6">Contributors</a></h2>
 </ul>
 </div>
 <div class="section" id="maintainers">
-<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
+<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
 <p>This module is maintained by the OCA.</p>
 <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
 <p>OCA, or the Odoo Community Association, is a nonprofit organization whose

From c4e502d35777af6b1d4254290526434a5af84d3d Mon Sep 17 00:00:00 2001
From: mymage <stefano.consolaro@mymage.it>
Date: Fri, 22 Sep 2023 14:21:39 +0000
Subject: [PATCH 26/32] Translated using Weblate (Italian)

Currently translated at 100.0% (15 of 15 strings)

Translation: e-commerce-15.0/e-commerce-15.0-website_sale_secondary_unit
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit/it/
---
 website_sale_secondary_unit/i18n/it.po | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index f8424d0d57..45795aae92 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Odoo Server 12.0\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-07-21 09:10+0000\n"
+"PO-Revision-Date: 2023-09-22 16:38+0000\n"
 "Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
 "Language-Team: none\n"
 "Language: it\n"
@@ -73,7 +73,7 @@ msgstr "Rimuovi uno"
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
 msgid "Sales Order"
-msgstr ""
+msgstr "Ordine di vendita"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line

From 62be6de6ec237fe29a86e387ff5eae5808507e1b Mon Sep 17 00:00:00 2001
From: Ivorra78 <informatica@totmaterial.es>
Date: Wed, 4 Oct 2023 16:31:52 +0000
Subject: [PATCH 27/32] Translated using Weblate (Spanish)

Currently translated at 100.0% (15 of 15 strings)

Translation: e-commerce-15.0/e-commerce-15.0-website_sale_secondary_unit
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit/es/
---
 website_sale_secondary_unit/i18n/es.po | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/website_sale_secondary_unit/i18n/es.po b/website_sale_secondary_unit/i18n/es.po
index 372c62e7e0..fac21c18c2 100644
--- a/website_sale_secondary_unit/i18n/es.po
+++ b/website_sale_secondary_unit/i18n/es.po
@@ -7,7 +7,7 @@ msgstr ""
 "Project-Id-Version: Odoo Server 11.0\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-03-13 16:54+0000\n"
-"PO-Revision-Date: 2023-07-05 14:08+0000\n"
+"PO-Revision-Date: 2023-10-09 07:57+0000\n"
 "Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
 "Language-Team: \n"
 "Language: es\n"
@@ -74,7 +74,7 @@ msgstr "Quitar uno"
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order
 msgid "Sales Order"
-msgstr ""
+msgstr "Orden de venta"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_sale_order_line

From c74943878fe458b9930435e8c01d44d8ce81d972 Mon Sep 17 00:00:00 2001
From: josep-tecnativa <josep.guardiola@tecnativa.com>
Date: Wed, 18 Oct 2023 11:12:55 +0200
Subject: [PATCH 28/32] [IMP] website_sale_b2x_alt_price: test performance
 improvement

---
 .../tests/test_website_sale_secondary_unit.py                 | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index 208781bb96..4602436b52 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -40,8 +40,8 @@ def setUp(self):
             }
         )
         # Add group "Manage Multiple Units of Measure" to admin
-        admin = self.env.ref("base.user_admin")
-        admin.groups_id |= self.browse_ref("uom.group_uom")
+        admin = cls.env.ref("base.user_admin")
+        admin.groups_id |= cls.browse_ref("uom.group_uom")
 
     def test_ui_website(self):
         """Test frontend tour."""

From cd60a22faa9de9bbfe2fa883a8be149f10048451 Mon Sep 17 00:00:00 2001
From: josep-tecnativa <josep.guardiola@tecnativa.com>
Date: Wed, 18 Oct 2023 11:30:54 +0200
Subject: [PATCH 29/32] [IMP] website_sale_secondary_unit: test performance
 improvement - Switch to setUpClass for avoiding repeat the same setup for
 each test. - Include context keys for avoiding mail operations overhead.

---
 website_sale_secondary_unit/README.rst        |  2 +-
 website_sale_secondary_unit/__manifest__.py   |  2 +-
 .../static/description/index.html             |  2 +-
 .../tests/test_website_sale_secondary_unit.py | 35 ++++++++++++-------
 4 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index 89520e273e..607ea589fe 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -7,7 +7,7 @@ Website Sale Secondary Unit
    !! This file is generated by oca-gen-addon-readme !!
    !! changes will be overwritten.                   !!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-   !! source digest: sha256:2617863988b7ef88ad135912c4bac209798afe500817e8ebd15d04b017139ed0
+   !! source digest: sha256:b22305a090cabad4fd64b941824c90c602eec985747acf0fc3039558a4b22968
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 5b21b0727f..4bf4cea4f0 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "15.0.1.2.0",
+    "version": "15.0.1.2.1",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index 049bd6a74c..ac9a6c7506 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -367,7 +367,7 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:2617863988b7ef88ad135912c4bac209798afe500817e8ebd15d04b017139ed0
+!! source digest: sha256:b22305a090cabad4fd64b941824c90c602eec985747acf0fc3039558a4b22968
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
 <p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module extends the functionality of sale_order_secondary_unit module to
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index 4602436b52..74da3ce79f 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -4,12 +4,23 @@
 
 
 class WebsiteSaleSecondaryUnitHttpCase(HttpCase):
-    def setUp(self):
-        super().setUp()
+    @classmethod
+    def setUpClass(cls):
+        super().setUpClass()
+        # Remove this variable in v16 and put instead:
+        # from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
+        DISABLED_MAIL_CONTEXT = {
+            "tracking_disable": True,
+            "mail_create_nolog": True,
+            "mail_create_nosubscribe": True,
+            "mail_notrack": True,
+            "no_reset_password": True,
+        }
+        cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT))
         # Models
-        ProductSecondaryUnit = self.env["product.secondary.unit"]
-        product_uom_unit = self.env.ref("uom.product_uom_unit")
-        self.product_template = self.env["product.template"].create(
+        ProductSecondaryUnit = cls.env["product.secondary.unit"]
+        product_uom_unit = cls.env.ref("uom.product_uom_unit")
+        cls.product_template = cls.env["product.template"].create(
             {
                 "name": "Test product",
                 "is_published": True,
@@ -21,27 +32,25 @@ def setUp(self):
             "name": "Box",
             "uom_id": product_uom_unit.id,
             "factor": 5.0,
-            "product_tmpl_id": self.product_template.id,
+            "product_tmpl_id": cls.product_template.id,
             "website_published": True,
         }
-        self.secondary_unit_box_5 = ProductSecondaryUnit.create(vals)
-        self.secondary_unit_box_10 = ProductSecondaryUnit.create(
-            dict(vals, factor=10.0)
-        )
-        self.product_template.write(
+        cls.secondary_unit_box_5 = ProductSecondaryUnit.create(vals)
+        cls.secondary_unit_box_10 = ProductSecondaryUnit.create(dict(vals, factor=10.0))
+        cls.product_template.write(
             {
                 "secondary_uom_ids": [
                     (
                         6,
                         0,
-                        [self.secondary_unit_box_5.id, self.secondary_unit_box_10.id],
+                        [cls.secondary_unit_box_5.id, cls.secondary_unit_box_10.id],
                     ),
                 ],
             }
         )
         # Add group "Manage Multiple Units of Measure" to admin
         admin = cls.env.ref("base.user_admin")
-        admin.groups_id |= cls.browse_ref("uom.group_uom")
+        admin.groups_id |= cls.env.ref("uom.group_uom")
 
     def test_ui_website(self):
         """Test frontend tour."""

From 42f836b40946e8fe03164ef5ab3a0b0756a335fa Mon Sep 17 00:00:00 2001
From: mymage <stefano.consolaro@mymage.it>
Date: Sun, 29 Oct 2023 14:41:12 +0000
Subject: [PATCH 30/32] Translated using Weblate (Italian)

Currently translated at 100.0% (15 of 15 strings)

Translation: e-commerce-15.0/e-commerce-15.0-website_sale_secondary_unit
Translate-URL: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit/it/
---
 website_sale_secondary_unit/i18n/it.po | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/website_sale_secondary_unit/i18n/it.po b/website_sale_secondary_unit/i18n/it.po
index 45795aae92..6fc537b83a 100644
--- a/website_sale_secondary_unit/i18n/it.po
+++ b/website_sale_secondary_unit/i18n/it.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Odoo Server 12.0\n"
 "Report-Msgid-Bugs-To: \n"
-"PO-Revision-Date: 2023-09-22 16:38+0000\n"
+"PO-Revision-Date: 2023-10-31 14:39+0000\n"
 "Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
 "Language-Team: none\n"
 "Language: it\n"
@@ -47,7 +47,7 @@ msgstr "È pubblicato"
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_secondary_unit
 msgid "Product Secondary Unit"
-msgstr "Unità di misura secondaria"
+msgstr "Unità di misura secondaria del prodotto"
 
 #. module: website_sale_secondary_unit
 #: model:ir.model,name:website_sale_secondary_unit.model_product_template
@@ -57,7 +57,7 @@ msgstr "Modello prodotto"
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_popover
 msgid "Qty:"
-msgstr "Qtà:"
+msgstr "Q.tà:"
 
 #. module: website_sale_secondary_unit
 #: model_terms:ir.ui.view,arch_db:website_sale_secondary_unit.cart_lines

From 16499ce5390f261fe1084d86a3a53e20b90cd309 Mon Sep 17 00:00:00 2001
From: Carlos Lopez <carlos.lopez@tecnativa.com>
Date: Thu, 9 Jan 2025 08:07:57 -0500
Subject: [PATCH 31/32] [IMP] website_sale_secondary_unit: pre-commit auto
 fixes

---
 website_sale_secondary_unit/README.rst        | 49 ++++++++++---------
 .../models/sale_order.py                      |  4 +-
 website_sale_secondary_unit/pyproject.toml    |  3 ++
 .../readme/CONFIGURE.md                       |  2 +
 .../readme/CONFIGURE.rst                      |  2 -
 .../readme/CONTRIBUTORS.md                    |  4 ++
 .../readme/CONTRIBUTORS.rst                   |  5 --
 .../readme/DESCRIPTION.md                     |  2 +
 .../readme/DESCRIPTION.rst                    |  2 -
 website_sale_secondary_unit/readme/USAGE.md   | 11 +++++
 website_sale_secondary_unit/readme/USAGE.rst  | 10 ----
 .../static/description/index.html             | 37 +++++++-------
 12 files changed, 69 insertions(+), 62 deletions(-)
 create mode 100644 website_sale_secondary_unit/pyproject.toml
 create mode 100644 website_sale_secondary_unit/readme/CONFIGURE.md
 delete mode 100644 website_sale_secondary_unit/readme/CONFIGURE.rst
 create mode 100644 website_sale_secondary_unit/readme/CONTRIBUTORS.md
 delete mode 100644 website_sale_secondary_unit/readme/CONTRIBUTORS.rst
 create mode 100644 website_sale_secondary_unit/readme/DESCRIPTION.md
 delete mode 100644 website_sale_secondary_unit/readme/DESCRIPTION.rst
 create mode 100644 website_sale_secondary_unit/readme/USAGE.md
 delete mode 100644 website_sale_secondary_unit/readme/USAGE.rst

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index 607ea589fe..1afbd42da1 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -17,19 +17,19 @@ Website Sale Secondary Unit
     :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
     :alt: License: AGPL-3
 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github
-    :target: https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit
+    :target: https://github.com/OCA/e-commerce/tree/17.0/website_sale_secondary_unit
     :alt: OCA/e-commerce
 .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
-    :target: https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit
+    :target: https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_secondary_unit
     :alt: Translate me on Weblate
 .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
-    :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=15.0
+    :target: https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&target_branch=17.0
     :alt: Try me on Runboat
 
 |badge1| |badge2| |badge3| |badge4| |badge5|
 
-This module extends the functionality of sale_order_secondary_unit module to
-allow sell products in online store in secondary units defined.
+This module extends the functionality of saleorder_secondary_unit module
+to allow sell products in online store in secondary units defined.
 
 **Table of contents**
 
@@ -39,22 +39,23 @@ allow sell products in online store in secondary units defined.
 Configuration
 =============
 
-For define the secondary units, you should active *Manage multiples units of measure* on
-the user that will be responsable of this function.
+For define the secondary units, you should active *Manage multiples
+units of measure* on the user that will be responsable of this function.
 
 Usage
 =====
 
 To use this module you need to:
 
-* Go to *'Website > Products > Products'*.
-* Select a template.
-* Set the secondary units that you need.
-* Go to Website Shop and buy this product, you will see a selectable option
-  with all secondary units defined in the product and visible in website.
-* If you do not want to sell in a base product unit and only allow sell in a
-  secondary unit you can disable the option *'Allow to sell in unit of
-  measure'* in a product sale tab.
+- Go to *'Website > Products > Products'*.
+- Select a template.
+- Set the secondary units that you need.
+- Go to Website Shop and buy this product, you will see a selectable
+  option with all secondary units defined in the product and visible in
+  website.
+- If you do not want to sell in a base product unit and only allow sell
+  in a secondary unit you can disable the option *'Allow to sell in unit
+  of measure'* in a product sale tab.
 
 Bug Tracker
 ===========
@@ -62,7 +63,7 @@ Bug Tracker
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/e-commerce/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 <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+`feedback <https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
 
 Do not contact contributors directly about support or help with technical issues.
 
@@ -70,21 +71,21 @@ Credits
 =======
 
 Authors
-~~~~~~~
+-------
 
 * Tecnativa
 
 Contributors
-~~~~~~~~~~~~
+------------
 
-* `Tecnativa <https://www.tecnativa.com>`_:
+- `Tecnativa <https://www.tecnativa.com>`__:
 
-  * Sergio Teruel
-  * Carlos Roca
-  * Pilar Vargas
+  - Sergio Teruel
+  - Carlos Roca
+  - Pilar Vargas
 
 Maintainers
-~~~~~~~~~~~
+-----------
 
 This module is maintained by the OCA.
 
@@ -96,6 +97,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 <https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit>`_ project on GitHub.
+This module is part of the `OCA/e-commerce <https://github.com/OCA/e-commerce/tree/17.0/website_sale_secondary_unit>`_ project on GitHub.
 
 You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 1db4623bcf..61ca51dd57 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -41,7 +41,7 @@ def _cart_update(
         add_qty=0,
         set_qty=0,
         attributes=None,
-        **kwargs
+        **kwargs,
     ):
         if line_id:
             sol = self.env["sale.order.line"].browse(line_id)
@@ -72,7 +72,7 @@ def _cart_update(
             add_qty=add_qty,
             set_qty=set_qty,
             attributes=attributes,
-            **kwargs
+            **kwargs,
         )
 
     def _compute_cart_info(self):
diff --git a/website_sale_secondary_unit/pyproject.toml b/website_sale_secondary_unit/pyproject.toml
new file mode 100644
index 0000000000..4231d0cccb
--- /dev/null
+++ b/website_sale_secondary_unit/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/website_sale_secondary_unit/readme/CONFIGURE.md b/website_sale_secondary_unit/readme/CONFIGURE.md
new file mode 100644
index 0000000000..98a223ffb7
--- /dev/null
+++ b/website_sale_secondary_unit/readme/CONFIGURE.md
@@ -0,0 +1,2 @@
+For define the secondary units, you should active *Manage multiples
+units of measure* on the user that will be responsable of this function.
diff --git a/website_sale_secondary_unit/readme/CONFIGURE.rst b/website_sale_secondary_unit/readme/CONFIGURE.rst
deleted file mode 100644
index d904421958..0000000000
--- a/website_sale_secondary_unit/readme/CONFIGURE.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-For define the secondary units, you should active *Manage multiples units of measure* on
-the user that will be responsable of this function.
diff --git a/website_sale_secondary_unit/readme/CONTRIBUTORS.md b/website_sale_secondary_unit/readme/CONTRIBUTORS.md
new file mode 100644
index 0000000000..91dff99b67
--- /dev/null
+++ b/website_sale_secondary_unit/readme/CONTRIBUTORS.md
@@ -0,0 +1,4 @@
+- [Tecnativa](https://www.tecnativa.com):
+  - Sergio Teruel
+  - Carlos Roca
+  - Pilar Vargas
diff --git a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst b/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 9321aaf14e..0000000000
--- a/website_sale_secondary_unit/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-* `Tecnativa <https://www.tecnativa.com>`_:
-
-  * Sergio Teruel
-  * Carlos Roca
-  * Pilar Vargas
diff --git a/website_sale_secondary_unit/readme/DESCRIPTION.md b/website_sale_secondary_unit/readme/DESCRIPTION.md
new file mode 100644
index 0000000000..498cf4e510
--- /dev/null
+++ b/website_sale_secondary_unit/readme/DESCRIPTION.md
@@ -0,0 +1,2 @@
+This module extends the functionality of saleorder_secondary_unit module
+to allow sell products in online store in secondary units defined.
diff --git a/website_sale_secondary_unit/readme/DESCRIPTION.rst b/website_sale_secondary_unit/readme/DESCRIPTION.rst
deleted file mode 100644
index 9c64f39cc2..0000000000
--- a/website_sale_secondary_unit/readme/DESCRIPTION.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-This module extends the functionality of sale_order_secondary_unit module to
-allow sell products in online store in secondary units defined.
diff --git a/website_sale_secondary_unit/readme/USAGE.md b/website_sale_secondary_unit/readme/USAGE.md
new file mode 100644
index 0000000000..508a9b8b58
--- /dev/null
+++ b/website_sale_secondary_unit/readme/USAGE.md
@@ -0,0 +1,11 @@
+To use this module you need to:
+
+- Go to *'Website \> Products \> Products'*.
+- Select a template.
+- Set the secondary units that you need.
+- Go to Website Shop and buy this product, you will see a selectable
+  option with all secondary units defined in the product and visible in
+  website.
+- If you do not want to sell in a base product unit and only allow sell
+  in a secondary unit you can disable the option *'Allow to sell in unit
+  of measure'* in a product sale tab.
diff --git a/website_sale_secondary_unit/readme/USAGE.rst b/website_sale_secondary_unit/readme/USAGE.rst
deleted file mode 100644
index b42f8d3ebf..0000000000
--- a/website_sale_secondary_unit/readme/USAGE.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-To use this module you need to:
-
-* Go to *'Website > Products > Products'*.
-* Select a template.
-* Set the secondary units that you need.
-* Go to Website Shop and buy this product, you will see a selectable option
-  with all secondary units defined in the product and visible in website.
-* If you do not want to sell in a base product unit and only allow sell in a
-  secondary unit you can disable the option *'Allow to sell in unit of
-  measure'* in a product sale tab.
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index ac9a6c7506..3b8a08f248 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
@@ -9,10 +8,11 @@
 
 /*
 :Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
 :Copyright: This stylesheet has been placed in the public domain.
 
 Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
 
 See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
 customize this style sheet.
@@ -275,7 +275,7 @@
   margin-left: 2em ;
   margin-right: 2em }
 
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
 pre.code, code { background-color: #eeeeee }
 pre.code .comment, code .comment { color: #5C6576 }
 pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +301,7 @@
 span.pre {
   white-space: pre }
 
-span.problematic {
+span.problematic, pre.problematic {
   color: red }
 
 span.section-subtitle {
@@ -369,9 +369,9 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !! source digest: sha256:b22305a090cabad4fd64b941824c90c602eec985747acf0fc3039558a4b22968
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/e-commerce-15-0/e-commerce-15-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&amp;target_branch=15.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
-<p>This module extends the functionality of sale_order_secondary_unit module to
-allow sell products in online store in secondary units defined.</p>
+<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/e-commerce/tree/17.0/website_sale_secondary_unit"><img alt="OCA/e-commerce" src="https://img.shields.io/badge/github-OCA%2Fe--commerce-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/e-commerce-17-0/e-commerce-17-0-website_sale_secondary_unit"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/e-commerce&amp;target_branch=17.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
+<p>This module extends the functionality of saleorder_secondary_unit module
+to allow sell products in online store in secondary units defined.</p>
 <p><strong>Table of contents</strong></p>
 <div class="contents local topic" id="contents">
 <ul class="simple">
@@ -388,8 +388,8 @@ <h1 class="title">Website Sale Secondary Unit</h1>
 </div>
 <div class="section" id="configuration">
 <h1><a class="toc-backref" href="#toc-entry-1">Configuration</a></h1>
-<p>For define the secondary units, you should active <em>Manage multiples units of measure</em> on
-the user that will be responsable of this function.</p>
+<p>For define the secondary units, you should active <em>Manage multiples
+units of measure</em> on the user that will be responsable of this function.</p>
 </div>
 <div class="section" id="usage">
 <h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
@@ -398,11 +398,12 @@ <h1><a class="toc-backref" href="#toc-entry-2">Usage</a></h1>
 <li>Go to <em>‘Website &gt; Products &gt; Products’</em>.</li>
 <li>Select a template.</li>
 <li>Set the secondary units that you need.</li>
-<li>Go to Website Shop and buy this product, you will see a selectable option
-with all secondary units defined in the product and visible in website.</li>
-<li>If you do not want to sell in a base product unit and only allow sell in a
-secondary unit you can disable the option <em>‘Allow to sell in unit of
-measure’</em> in a product sale tab.</li>
+<li>Go to Website Shop and buy this product, you will see a selectable
+option with all secondary units defined in the product and visible in
+website.</li>
+<li>If you do not want to sell in a base product unit and only allow sell
+in a secondary unit you can disable the option <em>‘Allow to sell in unit
+of measure’</em> in a product sale tab.</li>
 </ul>
 </div>
 <div class="section" id="bug-tracker">
@@ -410,7 +411,7 @@ <h1><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/e-commerce/issues">GitHub Issues</a>.
 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
-<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2015.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<a class="reference external" href="https://github.com/OCA/e-commerce/issues/new?body=module:%20website_sale_secondary_unit%0Aversion:%2017.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
@@ -435,11 +436,13 @@ <h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
 <div class="section" id="maintainers">
 <h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
 <p>This module is maintained by the OCA.</p>
-<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
+<a class="reference external image-reference" href="https://odoo-community.org">
+<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
+</a>
 <p>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.</p>
-<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/15.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/e-commerce/tree/17.0/website_sale_secondary_unit">OCA/e-commerce</a> project on GitHub.</p>
 <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
 </div>
 </div>

From 09b889cc5758ec5fbc5e90e39664fbc2af8de0b3 Mon Sep 17 00:00:00 2001
From: Carlos Lopez <carlos.lopez@tecnativa.com>
Date: Fri, 10 Jan 2025 07:39:43 -0500
Subject: [PATCH 32/32] [MIG] website_sale_secondary_unit: Migration to version
 17.0

- Replaced the popover implementation with notifications, following the update in odoo/odoo#133990.
- Removed the Unit from the displayed price. Previously, Odoo showed the price per unit, making it appropriate to include the UoM. However, as it now displays the total, the UoM is unnecessary.
---
 website_sale_secondary_unit/README.rst        |   1 +
 website_sale_secondary_unit/__manifest__.py   |   6 +-
 .../controllers/main.py                       |  21 ++
 website_sale_secondary_unit/hooks.py          |   4 +-
 .../models/product_template.py                |  18 ++
 .../models/sale_order.py                      |  35 ++-
 .../readme/CONTRIBUTORS.md                    |   1 +
 .../static/description/index.html             |   1 +
 .../add_to_cart_notification.esm.js           |  47 ++++
 .../cart_notification.esm.js                  |  22 ++
 .../src/js/website_sale_secondary_unit.esm.js | 137 ++++++++++++
 .../src/js/website_sale_secondary_unit.js     | 134 ------------
 .../website_sale_secondary_unit_tour.esm.js}  |  35 +--
 .../tests/test_website_sale_secondary_unit.py |  15 +-
 .../views/templates.xml                       | 204 +++++++-----------
 15 files changed, 381 insertions(+), 300 deletions(-)
 create mode 100644 website_sale_secondary_unit/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.esm.js
 create mode 100644 website_sale_secondary_unit/static/src/js/notification/cart_notification/cart_notification.esm.js
 create mode 100644 website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.esm.js
 delete mode 100644 website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
 rename website_sale_secondary_unit/static/{src/js/website_sale_secondary_unit_tour.js => tests/tours/website_sale_secondary_unit_tour.esm.js} (69%)

diff --git a/website_sale_secondary_unit/README.rst b/website_sale_secondary_unit/README.rst
index 1afbd42da1..5875bb8e45 100644
--- a/website_sale_secondary_unit/README.rst
+++ b/website_sale_secondary_unit/README.rst
@@ -83,6 +83,7 @@ Contributors
   - Sergio Teruel
   - Carlos Roca
   - Pilar Vargas
+  - Carlos Lopez
 
 Maintainers
 -----------
diff --git a/website_sale_secondary_unit/__manifest__.py b/website_sale_secondary_unit/__manifest__.py
index 4bf4cea4f0..2769c9bf30 100644
--- a/website_sale_secondary_unit/__manifest__.py
+++ b/website_sale_secondary_unit/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Website Sale Secondary Unit",
     "summary": "Allow manage secondary units in website shop",
-    "version": "15.0.1.2.1",
+    "version": "17.0.1.0.0",
     "development_status": "Beta",
     "category": "Website",
     "website": "https://github.com/OCA/e-commerce",
@@ -23,11 +23,11 @@
     "post_init_hook": "post_init_hook",
     "assets": {
         "web.assets_frontend": [
-            "/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js",
+            "/website_sale_secondary_unit/static/src/js/**/*.esm.js",
             "/website_sale_secondary_unit/static/src/scss/website_sale_secondary_unit.scss",
         ],
         "web.assets_tests": [
-            "/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js"
+            "/website_sale_secondary_unit/static/tests/tours/website_sale_secondary_unit_tour.esm.js"
         ],
     },
 }
diff --git a/website_sale_secondary_unit/controllers/main.py b/website_sale_secondary_unit/controllers/main.py
index 1268d00642..372c99cb29 100644
--- a/website_sale_secondary_unit/controllers/main.py
+++ b/website_sale_secondary_unit/controllers/main.py
@@ -46,3 +46,24 @@ def _prepare_product_values(self, product, category, search, **kwargs):
             lambda su: su.active and su.is_published
         )
         return res
+
+    def _get_cart_notification_information(self, order, line_ids):
+        res = super()._get_cart_notification_information(order, line_ids)
+        for line in res.get("lines", []):
+            sale_line = request.env["sale.order.line"].browse(line["id"])
+            line["secondary_uom_name"] = ""
+            line["secondary_uom_qty"] = sale_line.secondary_uom_qty
+            secondary_uom = sale_line.secondary_uom_id
+            if not secondary_uom:
+                continue
+            factor = (
+                int(secondary_uom.factor) == secondary_uom.factor
+                and int(secondary_uom.factor)
+                or secondary_uom.factor
+            )
+            uom_name = secondary_uom.product_tmpl_id.sudo().uom_id.name
+            secondary_uom_name = f"{secondary_uom.name} {factor}"
+            if uom_name != secondary_uom.name:
+                secondary_uom_name += f" {uom_name}"
+            line["secondary_uom_name"] = secondary_uom_name
+        return res
diff --git a/website_sale_secondary_unit/hooks.py b/website_sale_secondary_unit/hooks.py
index 46644412cc..d02e3052f7 100644
--- a/website_sale_secondary_unit/hooks.py
+++ b/website_sale_secondary_unit/hooks.py
@@ -2,12 +2,12 @@
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 
 
-def post_init_hook(cr, registry):
+def post_init_hook(env):
     """
     At installation time, set allow_uom_sell field as true for all products
     that have already been created.
     """
-    cr.execute(
+    env.cr.execute(
         """
         UPDATE product_template
         SET allow_uom_sell=true
diff --git a/website_sale_secondary_unit/models/product_template.py b/website_sale_secondary_unit/models/product_template.py
index e70c38375a..777ea1aa06 100644
--- a/website_sale_secondary_unit/models/product_template.py
+++ b/website_sale_secondary_unit/models/product_template.py
@@ -10,3 +10,21 @@ class ProductTemplate(models.Model):
         string="Allow to sell in unit of measure",
         default=True,
     )
+
+    def _get_combination_info(
+        self,
+        combination=False,
+        product_id=False,
+        add_qty=1,
+        parent_combination=False,
+        only_template=False,
+    ):
+        combination_info = super()._get_combination_info(
+            combination=combination,
+            product_id=product_id,
+            add_qty=add_qty,
+            parent_combination=parent_combination,
+            only_template=only_template,
+        )
+        combination_info.update({"has_secondary_uom": bool(self.secondary_uom_ids)})
+        return combination_info
diff --git a/website_sale_secondary_unit/models/sale_order.py b/website_sale_secondary_unit/models/sale_order.py
index 61ca51dd57..8f7f428053 100644
--- a/website_sale_secondary_unit/models/sale_order.py
+++ b/website_sale_secondary_unit/models/sale_order.py
@@ -26,13 +26,36 @@ def _cart_find_product_line(self, product_id=None, line_id=None, **kwargs):
             )
         return so_lines
 
-    def _website_product_id_change(self, order_id, product_id, qty=0, **kwargs):
-        res = super()._website_product_id_change(
-            order_id, product_id, qty=qty, **kwargs
+    def _prepare_order_line_values(
+        self,
+        product_id,
+        quantity,
+        linked_line_id=False,
+        no_variant_attribute_values=None,
+        product_custom_attribute_values=None,
+        **kwargs,
+    ):
+        values = super()._prepare_order_line_values(
+            product_id,
+            quantity,
+            linked_line_id=linked_line_id,
+            no_variant_attribute_values=no_variant_attribute_values,
+            product_custom_attribute_values=product_custom_attribute_values,
+            **kwargs,
         )
-        secondary_uom_id = self.env.context.get("secondary_uom_id", False)
-        res["secondary_uom_id"] = secondary_uom_id
-        return res
+        values["secondary_uom_id"] = self.env.context.get("secondary_uom_id")
+        return values
+
+    def _prepare_order_line_update_values(
+        self, order_line, quantity, linked_line_id=False, **kwargs
+    ):
+        values = super()._prepare_order_line_update_values(
+            order_line, quantity, linked_line_id=linked_line_id, **kwargs
+        )
+        secondary_uom_id = self.env.context.get("secondary_uom_id")
+        if secondary_uom_id != order_line.secondary_uom_id.id:
+            values["secondary_uom_id"] = secondary_uom_id
+        return values
 
     def _cart_update(
         self,
diff --git a/website_sale_secondary_unit/readme/CONTRIBUTORS.md b/website_sale_secondary_unit/readme/CONTRIBUTORS.md
index 91dff99b67..6b40fbde45 100644
--- a/website_sale_secondary_unit/readme/CONTRIBUTORS.md
+++ b/website_sale_secondary_unit/readme/CONTRIBUTORS.md
@@ -2,3 +2,4 @@
   - Sergio Teruel
   - Carlos Roca
   - Pilar Vargas
+  - Carlos Lopez
diff --git a/website_sale_secondary_unit/static/description/index.html b/website_sale_secondary_unit/static/description/index.html
index 3b8a08f248..14ca5e78ec 100644
--- a/website_sale_secondary_unit/static/description/index.html
+++ b/website_sale_secondary_unit/static/description/index.html
@@ -429,6 +429,7 @@ <h2><a class="toc-backref" href="#toc-entry-6">Contributors</a></h2>
 <li>Sergio Teruel</li>
 <li>Carlos Roca</li>
 <li>Pilar Vargas</li>
+<li>Carlos Lopez</li>
 </ul>
 </li>
 </ul>
diff --git a/website_sale_secondary_unit/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.esm.js b/website_sale_secondary_unit/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.esm.js
new file mode 100644
index 0000000000..759e1554fb
--- /dev/null
+++ b/website_sale_secondary_unit/static/src/js/notification/add_to_cart_notification/add_to_cart_notification.esm.js
@@ -0,0 +1,47 @@
+/** @odoo-module **/
+/* Copyright 2025 Carlos Lopez - Tecnativa
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+import {AddToCartNotification} from "@website_sale/js/notification/add_to_cart_notification/add_to_cart_notification";
+import {patch} from "@web/core/utils/patch";
+
+patch(AddToCartNotification.prototype, {
+    /**
+     * Return the product summary based on the line information.
+     *
+     * If the line has a secondary unit of measure,
+     * the product summary is computed based on the secondary unit of measure quantity and name,
+     *
+     * @param {Object} line - The line element for which to return the product summary.
+     * @returns {String} - The product summary.
+     */
+    getProductSummary(line) {
+        if (line.secondary_uom_name) {
+            return (
+                line.secondary_uom_qty +
+                " x " +
+                line.secondary_uom_name +
+                " " +
+                line.name
+            );
+        }
+        return super.getProductSummary(...arguments);
+    },
+});
+
+const extendedShape = {
+    ...AddToCartNotification.props.lines.element.shape,
+    secondary_uom_name: String,
+    secondary_uom_qty: {type: Number, optional: true},
+};
+
+AddToCartNotification.props = {
+    ...AddToCartNotification.props,
+    lines: {
+        ...AddToCartNotification.props.lines,
+        element: {
+            ...AddToCartNotification.props.lines.element,
+            shape: extendedShape,
+        },
+    },
+};
diff --git a/website_sale_secondary_unit/static/src/js/notification/cart_notification/cart_notification.esm.js b/website_sale_secondary_unit/static/src/js/notification/cart_notification/cart_notification.esm.js
new file mode 100644
index 0000000000..5a9ca2e2fb
--- /dev/null
+++ b/website_sale_secondary_unit/static/src/js/notification/cart_notification/cart_notification.esm.js
@@ -0,0 +1,22 @@
+/** @odoo-module **/
+/* Copyright 2025 Carlos Lopez - Tecnativa
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+import {CartNotification} from "@website_sale/js/notification/cart_notification/cart_notification";
+
+const extendedShape = {
+    ...CartNotification.props.lines.element.shape,
+    secondary_uom_name: String,
+    secondary_uom_qty: {type: Number, optional: true},
+};
+
+CartNotification.props = {
+    ...CartNotification.props,
+    lines: {
+        ...CartNotification.props.lines,
+        element: {
+            ...CartNotification.props.lines.element,
+            shape: extendedShape,
+        },
+    },
+};
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.esm.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.esm.js
new file mode 100644
index 0000000000..470efb14cf
--- /dev/null
+++ b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.esm.js
@@ -0,0 +1,137 @@
+/** @odoo-module **/
+/* Copyright 2019 Sergio Teruel
+ * Copyright 2025 Carlos Lopez - Tecnativa
+ * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
+
+import "@website_sale/js/website_sale";
+import VariantMixin from "@website_sale/js/sale_variant_mixin";
+import publicWidget from "@web/legacy/js/public/public_widget";
+
+publicWidget.registry.sale_secondary_unit = publicWidget.Widget.extend(VariantMixin, {
+    selector: ".secondary-unit",
+    // eslint-disable-next-line no-unused-vars
+    init: function (parent, editableMode) {
+        this._super.apply(this, arguments);
+        this.$secondary_uom = null;
+        this.$secondary_uom_qty = null;
+        this.$product_qty = null;
+        this.secondary_uom_qty = null;
+        this.secondary_uom_factor = null;
+        this.product_uom_factor = null;
+        this.product_qty = null;
+    },
+    start: function () {
+        const _this = this;
+        this.$secondary_uom = $("#secondary_uom");
+        this.$secondary_uom_qty = $(".secondary-quantity");
+        this.$product_qty = $(".quantity");
+        this._setValues();
+        this.$target.on(
+            "change",
+            ".secondary-quantity",
+            this._onChangeSecondaryUom.bind(this)
+        );
+        this.$target.on(
+            "change",
+            "#secondary_uom",
+            this._onChangeSecondaryUom.bind(this)
+        );
+        this.$product_qty.on("change", null, this._onChangeProductQty.bind(this));
+        return this._super.apply(this, arguments).then(function () {
+            _this._onChangeSecondaryUom();
+        });
+    },
+    _setValues: function () {
+        this.secondary_uom_qty = Number(this.$target.find(".secondary-quantity").val());
+        this.secondary_uom_factor = Number(
+            $("option:selected", this.$secondary_uom).data("secondary-uom-factor")
+        );
+        this.product_uom_factor = Number(
+            $("option:selected", this.$secondary_uom).data("product-uom-factor")
+        );
+        this.product_qty = Number($(".quantity").val());
+    },
+
+    _onChangeSecondaryUom: function (ev) {
+        if (!ev) {
+            // HACK: Create a fake event to locate the form on "onChangeAddQuantity"
+            // odoo method
+            ev = jQuery.Event("fakeEvent");
+            ev.currentTarget = $(".form-control.quantity");
+        }
+        this._setValues();
+        const factor = this.secondary_uom_factor * this.product_uom_factor;
+        this.$product_qty.val(this.secondary_uom_qty * factor);
+        this.onChangeAddQuantity(ev);
+    },
+    _onChangeProductQty: function () {
+        this._setValues();
+        const factor = this.secondary_uom_factor * this.product_uom_factor;
+        this.$secondary_uom_qty.val(this.product_qty / factor);
+    },
+});
+
+publicWidget.registry.sale_secondary_unit_cart = publicWidget.Widget.extend({
+    selector: ".oe_cart",
+    // eslint-disable-next-line no-unused-vars
+    init: function (parent, editableMode) {
+        this._super.apply(this, arguments);
+        this.$product_qty = null;
+        this.secondary_uom_qty = null;
+        this.secondary_uom_factor = null;
+        this.product_uom_factor = null;
+        this.product_qty = null;
+    },
+    start: function () {
+        var _this = this;
+        this.$target.on(
+            "change",
+            "input.js_secondary_quantity[data-line-id]",
+            function () {
+                _this._onChangeSecondaryUom(this);
+            }
+        );
+    },
+    _setValues: function (order_line) {
+        this.$product_qty = this.$target.find(
+            ".quantity[data-line-id=" + order_line.dataset.lineId + "]"
+        );
+        this.secondary_uom_qty = Number(order_line.value);
+        this.secondary_uom_factor = Number(order_line.dataset.secondaryUomFactor);
+        this.product_uom_factor = Number(order_line.dataset.productUomFactor);
+    },
+    _onChangeSecondaryUom: function (order_line) {
+        this._setValues(order_line);
+        const factor = this.secondary_uom_factor * this.product_uom_factor;
+        this.$product_qty.val(this.secondary_uom_qty * factor);
+        this.$product_qty.trigger("change");
+    },
+});
+
+publicWidget.registry.WebsiteSale.include({
+    _onChangeCombination: function (ev, $parent, combination) {
+        const quantity = $parent.find(".css_quantity:not(.secondary_qty)");
+        const res = this._super(...arguments);
+        if (combination.has_secondary_uom) {
+            quantity.removeClass("d-inline-flex").addClass("d-none");
+        } else {
+            quantity.removeClass("d-none").addClass("d-inline-flex");
+        }
+        return res;
+    },
+    _submitForm: function () {
+        if (
+            !("secondary_uom_id" in this.rootProduct) &&
+            $(this.$target).find("#secondary_uom").length
+        ) {
+            this.rootProduct.secondary_uom_id = $(this.$target)
+                .find("#secondary_uom")
+                .val();
+            this.rootProduct.secondary_uom_qty = $(this.$target)
+                .find(".secondary-quantity")
+                .val();
+        }
+
+        this._super.apply(this, arguments);
+    },
+});
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js b/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
deleted file mode 100644
index 60e8f8c9b4..0000000000
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit.js
+++ /dev/null
@@ -1,134 +0,0 @@
-odoo.define("website_sale_secondary_unit.animation", function (require) {
-    "use strict";
-
-    const VariantMixin = require("sale.VariantMixin");
-    const sAnimation = require("website.content.snippets.animation");
-
-    sAnimation.registry.sale_secondary_unit = sAnimation.Class.extend(VariantMixin, {
-        selector: ".secondary-unit",
-        // eslint-disable-next-line no-unused-vars
-        init: function (parent, editableMode) {
-            this._super.apply(this, arguments);
-            this.$secondary_uom = null;
-            this.$secondary_uom_qty = null;
-            this.$product_qty = null;
-            this.secondary_uom_qty = null;
-            this.secondary_uom_factor = null;
-            this.product_uom_factor = null;
-            this.product_qty = null;
-        },
-        start: function () {
-            const _this = this;
-            this.$secondary_uom = $("#secondary_uom");
-            this.$secondary_uom_qty = $(".secondary-quantity");
-            this.$product_qty = $(".quantity");
-            this._setValues();
-            this.$target.on(
-                "change",
-                ".secondary-quantity",
-                this._onChangeSecondaryUom.bind(this)
-            );
-            this.$target.on(
-                "change",
-                "#secondary_uom",
-                this._onChangeSecondaryUom.bind(this)
-            );
-            this.$product_qty.on("change", null, this._onChangeProductQty.bind(this));
-            return this._super.apply(this, arguments).then(function () {
-                _this._onChangeSecondaryUom();
-            });
-        },
-        _setValues: function () {
-            this.secondary_uom_qty = Number(
-                this.$target.find(".secondary-quantity").val()
-            );
-            this.secondary_uom_factor = Number(
-                $("option:selected", this.$secondary_uom).data("secondary-uom-factor")
-            );
-            this.product_uom_factor = Number(
-                $("option:selected", this.$secondary_uom).data("product-uom-factor")
-            );
-            this.product_qty = Number($(".quantity").val());
-        },
-
-        _onChangeSecondaryUom: function (ev) {
-            if (!ev) {
-                // HACK: Create a fake event to locate the form on "onChangeAddQuantity"
-                // odoo method
-                ev = jQuery.Event("fakeEvent");
-                ev.currentTarget = $(".form-control.quantity");
-            }
-            this._setValues();
-            const factor = this.secondary_uom_factor * this.product_uom_factor;
-            this.$product_qty.val(this.secondary_uom_qty * factor);
-            this.onChangeAddQuantity(ev);
-        },
-        _onChangeProductQty: function () {
-            this._setValues();
-            const factor = this.secondary_uom_factor * this.product_uom_factor;
-            this.$secondary_uom_qty.val(this.product_qty / factor);
-        },
-    });
-
-    sAnimation.registry.sale_secondary_unit_cart = sAnimation.Class.extend({
-        selector: ".oe_cart",
-        // eslint-disable-next-line no-unused-vars
-        init: function (parent, editableMode) {
-            this._super.apply(this, arguments);
-            this.$product_qty = null;
-            this.secondary_uom_qty = null;
-            this.secondary_uom_factor = null;
-            this.product_uom_factor = null;
-            this.product_qty = null;
-        },
-        start: function () {
-            var _this = this;
-            this.$target.on(
-                "change",
-                "input.js_secondary_quantity[data-line-id]",
-                function () {
-                    _this._onChangeSecondaryUom(this);
-                }
-            );
-        },
-        _setValues: function (order_line) {
-            this.$product_qty = this.$target.find(
-                ".quantity[data-line-id=" + order_line.dataset.lineId + "]"
-            );
-            this.secondary_uom_qty = Number(order_line.value);
-            this.secondary_uom_factor = Number(order_line.dataset.secondaryUomFactor);
-            this.product_uom_factor = Number(order_line.dataset.productUomFactor);
-        },
-        _onChangeSecondaryUom: function (order_line) {
-            this._setValues(order_line);
-            const factor = this.secondary_uom_factor * this.product_uom_factor;
-            this.$product_qty.val(this.secondary_uom_qty * factor);
-            this.$product_qty.trigger("change");
-        },
-    });
-});
-
-odoo.define("website_sale_secondary_unit.website_sale", function (require) {
-    "use strict";
-
-    var publicWidget = require("web.public.widget");
-    require("website_sale.website_sale");
-
-    publicWidget.registry.WebsiteSale.include({
-        _submitForm: function () {
-            if (
-                !("secondary_uom_id" in this.rootProduct) &&
-                $(this.$target).find("#secondary_uom").length
-            ) {
-                this.rootProduct.secondary_uom_id = $(this.$target)
-                    .find("#secondary_uom")
-                    .val();
-                this.rootProduct.secondary_uom_qty = $(this.$target)
-                    .find(".secondary-quantity")
-                    .val();
-            }
-
-            this._super.apply(this, arguments);
-        },
-    });
-});
diff --git a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js b/website_sale_secondary_unit/static/tests/tours/website_sale_secondary_unit_tour.esm.js
similarity index 69%
rename from website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
rename to website_sale_secondary_unit/static/tests/tours/website_sale_secondary_unit_tour.esm.js
index 71d58d4b1b..a23767c516 100644
--- a/website_sale_secondary_unit/static/src/js/website_sale_secondary_unit_tour.js
+++ b/website_sale_secondary_unit/static/tests/tours/website_sale_secondary_unit_tour.esm.js
@@ -1,13 +1,12 @@
+/** @odoo-module */
 /* Copyright 2019 Sergio Teruel
  * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
 
-odoo.define("website_sale_secondary_unit.tour", function (require) {
-    "use strict";
-
-    const tour = require("web_tour.tour");
-    const base = require("web_editor.base");
-
-    const steps = [
+import {registry} from "@web/core/registry";
+registry.category("web_tour.tours").add("website_sale_secondary_unit", {
+    test: true,
+    url: "/shop",
+    steps: () => [
         {
             trigger: "a:contains('Test product')",
         },
@@ -43,26 +42,14 @@ odoo.define("website_sale_secondary_unit.tour", function (require) {
             extra_trigger: "span:containsExact(Units)",
         },
         {
-            trigger: "button[name='o_payment_submit_button']",
-            extra_trigger: "table:has(span:contains(Box 5)):has(span:contains(Units))",
+            trigger: "div[id='o_wsale_total_accordion'] button.accordion-button",
         },
         {
-            trigger: "a[href='/shop']",
-            extra_trigger: "table:has(span:contains(Box 5)):has(span:contains(Units))",
+            trigger: "h6[name='secondary_uom_qty'] span:containsExact(Box 5)",
         },
-    ];
-
-    tour.register(
-        "website_sale_secondary_unit",
         {
-            url: "/shop",
-            test: true,
-            wait_for: base.ready(),
+            trigger: "a[href='/shop']",
+            extra_trigger: "table:has(span:contains(Box 5)):has(span:contains(Units))",
         },
-        steps
-    );
-
-    return {
-        steps: steps,
-    };
+    ],
 });
diff --git a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
index 74da3ce79f..79080e70ab 100644
--- a/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
+++ b/website_sale_secondary_unit/tests/test_website_sale_secondary_unit.py
@@ -2,20 +2,13 @@
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 from odoo.tests.common import HttpCase
 
+from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
+
 
 class WebsiteSaleSecondaryUnitHttpCase(HttpCase):
     @classmethod
     def setUpClass(cls):
         super().setUpClass()
-        # Remove this variable in v16 and put instead:
-        # from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
-        DISABLED_MAIL_CONTEXT = {
-            "tracking_disable": True,
-            "mail_create_nolog": True,
-            "mail_create_nosubscribe": True,
-            "mail_notrack": True,
-            "no_reset_password": True,
-        }
         cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT))
         # Models
         ProductSecondaryUnit = cls.env["product.secondary.unit"]
@@ -54,4 +47,6 @@ def setUpClass(cls):
 
     def test_ui_website(self):
         """Test frontend tour."""
-        self.start_tour("/shop", "website_sale_secondary_unit", login="admin")
+        self.start_tour(
+            "/shop", "website_sale_secondary_unit", login="admin", step_delay=1000
+        )
diff --git a/website_sale_secondary_unit/views/templates.xml b/website_sale_secondary_unit/views/templates.xml
index 3e29dac317..7e1085b618 100644
--- a/website_sale_secondary_unit/views/templates.xml
+++ b/website_sale_secondary_unit/views/templates.xml
@@ -4,36 +4,32 @@
 <odoo>
     <template id="secondary_qty">
         <div
-            class="css_quantity input-group oe_website_spinner"
+            t-attf-class="css_quantity secondary_qty input-group {{'d-none' if combination_info['prevent_zero_price_sale'] else 'd-inline-flex'}} me-2 mb-2 align-middle"
             contenteditable="false"
         >
-            <div class="input-group-prepend">
-                <a
-                    t-attf-href="#"
-                    class="btn btn-secondary js_add_cart_json"
-                    aria-label="Remove one"
-                    title="Remove one"
-                >
-                    <i class="fa fa-minus" />
-                </a>
-            </div>
+            <a
+                t-attf-href="#"
+                class="btn btn-link js_add_cart_json"
+                aria-label="Remove one"
+                title="Remove one"
+            >
+                <i class="fa fa-minus" />
+            </a>
             <input
                 type="text"
-                class="form-control secondary-quantity"
+                class="form-control secondary-quantity text-center"
                 data-min="1"
                 name="add_secondary_qty"
                 value="1"
             />
-            <div class="input-group-append">
-                <a
-                    t-attf-href="#"
-                    class="btn btn-secondary float_left js_add_cart_json"
-                    aria-label="Add one"
-                    title="Add one"
-                >
-                    <i class="fa fa-plus" />
-                </a>
-            </div>
+            <a
+                t-attf-href="#"
+                class="btn btn-link js_add_cart_json"
+                aria-label="Add one"
+                title="Add one"
+            >
+                <i class="fa fa-plus" />
+            </a>
         </div>
     </template>
     <template id="second_qty_description">
@@ -57,11 +53,13 @@
             expr="//div[@id='product_details']//t[@t-call='website_sale.product_price']"
             position="after"
         >
-            <t t-if="secondary_uom_ids">
+            <t
+                t-if="secondary_uom_ids and not combination_info['prevent_zero_price_sale']"
+            >
                 <div class="mb8 secondary-unit">
                     <t t-call="website_sale_secondary_unit.secondary_qty" />
                     <select
-                        class="form-control mt4"
+                        class="form-control"
                         id="secondary_uom"
                         name="secondary_uom_id"
                     >
@@ -105,28 +103,24 @@
         <xpath expr="//input[@name='add_qty']/.." position="attributes">
             <attribute
                 name="t-attf-class"
-            >css_quantity input-group oe_website_spinner #{'d-none' if secondary_uom_ids else None}</attribute>
+            >css_quantity input-group {{'d-none' if combination_info['prevent_zero_price_sale'] or secondary_uom_ids else 'd-inline-flex'}} me-2 mb-2 align-middle</attribute>
         </xpath>
     </template>
     <template id="cart_lines" inherit_id="website_sale.cart_lines">
-        <xpath expr="//td[hasclass('td-qty')]/div" position="before">
+        <xpath expr="//div[@name='website_sale_cart_line_quantity']" position="before">
             <t t-if="line.secondary_uom_id">
-                <div
-                    class="css_secondary_quantity input-group mx-auto oe_website_spinner"
-                >
-                    <div class="input-group-prepend">
-                        <a
-                            t-attf-href="#"
-                            class="btn btn-link js_add_cart_json d-xs d-md-inline-block"
-                            aria-label="Remove one"
-                            title="Remove one"
-                        >
-                            <i class="fa fa-minus" />
-                        </a>
-                    </div>
+                <div class="css_secondary_quantity css_quantity input-group mb-2">
+                    <a
+                        t-attf-href="#"
+                        class="js_add_cart_json btn btn-link d-inline-block border-end-0"
+                        aria-label="Remove one"
+                        title="Remove one"
+                    >
+                        <i class="position-relative z-index-1 fa fa-minus" />
+                    </a>
                     <input
                         type="text"
-                        class="js_secondary_quantity form-control secondary-quantity"
+                        class="js_secondary_quantity secondary-quantity form-control border-start-0 border-end-0"
                         t-att-data-line-id="line.id"
                         t-att-data-product-id="line.product_id.id"
                         t-att-data-secondary-uom-id="line.secondary_uom_id.id"
@@ -134,74 +128,55 @@
                         t-att-data-product-uom-factor="line.product_uom.sudo().factor"
                         t-att-value="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
                     />
-                    <div class="input-group-append">
-                        <a
-                            t-attf-href="#"
-                            class="btn btn-link float_left js_add_cart_json d-xs d-md-inline-block"
-                            aria-label="Add one"
-                            title="Add one"
-                        >
-                            <i class="fa fa-plus" />
-                        </a>
-                    </div>
+                    <a
+                        t-attf-href="#"
+                        class="js_add_cart_json d-inline-block btn btn-link border-start-0"
+                        aria-label="Add one"
+                        title="Add one"
+                    >
+                        <i class="fa fa-plus position-relative z-index-1" />
+                    </a>
                 </div>
                 <div>
                     <t t-call="website_sale_secondary_unit.second_qty_description">
                         <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
                     </t>
+                    =
+                    <span
+                        t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
+                    />
+                    <span t-out="line.product_uom.sudo().name" />
                 </div>
             </t>
         </xpath>
         <xpath
-            expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]"
+            expr="//div[@name='website_sale_cart_line_quantity']//t[@t-if='show_qty']"
             position="attributes"
         >
-            <attribute
-                name="t-attf-class"
-            >css_quantity input-group oe_website_spinner #{'d-none' if line.secondary_uom_id else None}</attribute>
+            <attribute name="t-if">show_qty and not line.secondary_uom_id</attribute>
         </xpath>
-        <xpath
-            expr="//td[hasclass('td-qty')]/div[hasclass('css_quantity')]"
-            position="after"
-        >
+        <xpath expr="//div[@name='website_sale_cart_line_quantity']" position="after">
             <t t-if="not line.secondary_uom_id">
-                <span t-out="line.product_uom.sudo().name" />
-            </t>
-        </xpath>
-        <xpath expr="//th[hasclass('td-qty')]" position="after">
-            <th class="text-center td-qty d-none d-md-table-cell">Quantity</th>
-        </xpath>
-        <xpath expr="//td[hasclass('td-qty')]" position="after">
-            <td class="text-center td-qty d-none d-md-table-cell">
-                <span
-                    t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
-                />
-                <span t-out="line.product_uom.sudo().name" />
-            </td>
-        </xpath>
-        <!-- Display product uom to price column to clarify that price is per product unit -->
-        <xpath expr="//td[@name='price']" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids">
-                / <span
-                    class="css_editable_mode_hidden price_uom"
-                    t-field="line.product_id.uom_id"
-                />
+                <div class="mb-2">
+                    <span t-out="line.product_uom.sudo().name" />
+                </div>
             </t>
         </xpath>
     </template>
-    <template id="cart_summary" inherit_id="website_sale.cart_summary">
-        <xpath expr="//td[hasclass('td-qty')]" position="inside">
+    <template id="checkout_layout" inherit_id="website_sale.checkout_layout">
+        <xpath
+            expr="//td[@name='website_sale_cart_summary_product_name']//h6"
+            position="attributes"
+        >
+            <attribute name="t-if">not line.secondary_uom_id</attribute>
+        </xpath>
+        <xpath
+            expr="//td[@name='website_sale_cart_summary_product_name']"
+            position="inside"
+        >
             <t t-if="line.secondary_uom_id">
-                <div>
-                    <span
-                        t-out="int(line.product_uom_qty) == line.product_uom_qty and int(line.product_uom_qty) or line.product_uom_qty"
-                    />
-                    <span t-out="line.product_uom.sudo().name" />
-                </div>
-                <div class="font-weight-light">
-                    <t
-                        t-out="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
-                    />
+                <h6 name="secondary_uom_qty">
+                    <t t-out="int(line.secondary_uom_qty)" />
                     <t t-call="website_sale_secondary_unit.second_qty_description">
                         <t
                             t-if="line.product_uom.sudo().name == line.secondary_uom_id.product_tmpl_id.sudo().uom_id.name"
@@ -210,39 +185,26 @@
                         />
                         <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
                     </t>
-                </div>
-            </t>
-        </xpath>
-        <xpath expr="//td[hasclass('td-qty')]/div" position="attributes">
-            <attribute
-                name="t-attf-class"
-            >#{'d-none' if line.secondary_uom_id else None}</attribute>
-        </xpath>
-        <xpath expr="//td[hasclass('td-qty')]/div" position="after">
-            <t t-if="not line.secondary_uom_id">
+                    <t t-if="line._get_shop_warning(clear=False)">
+                        <i
+                            class="fa fa-warning text-warning"
+                            role="img"
+                            t-att-title="line._get_shop_warning()"
+                            aria-label="Warning"
+                        />
+                    </t>
+                    x
+                    <t t-out="line.name_short" />
+                </h6>
+                <t t-out="int(line.product_uom_qty)" />
                 <span t-out="line.product_uom.sudo().name" />
             </t>
         </xpath>
-        <!-- Display product uom to price column to clarify that price is per product unit -->
-        <xpath expr="//td[hasclass('td-price')]" position="inside">
-            <t t-if="line.product_id.secondary_uom_ids">
-                / <span
-                    class="css_editable_mode_hidden price_uom"
-                    t-field="line.product_id.uom_id"
-                />
-            </t>
-        </xpath>
-    </template>
-    <template id="cart_popover" inherit_id="website_sale.cart_popover">
-        <xpath expr="//div[hasclass('col-9')]" position="inside">
-            <div t-if="line.secondary_uom_id">
-                Qty: <t
-                    t-out="int(line.secondary_uom_qty) == line.secondary_uom_qty and int(line.secondary_uom_qty) or line.secondary_uom_qty"
-                />
-                <t t-call="website_sale_secondary_unit.second_qty_description">
-                    <t t-set="secondary_uom" t-value="line.secondary_uom_id" />
-                </t>
-            </div>
+        <xpath
+            expr="//td[@name='website_sale_cart_summary_product_name']//t[@t-if='line._get_shop_warning(clear=False)']"
+            position="before"
+        >
+            <span t-out="line.product_uom.sudo().name" />
         </xpath>
     </template>
 </odoo>