From 36028ceab2b7f36c2dd1ad1e289f1dfe1a596aee Mon Sep 17 00:00:00 2001 From: Giovanni Date: Mon, 22 Nov 2021 16:27:10 +0100 Subject: [PATCH] [ADD] web_widget_uom --- .../web_widget_uom/odoo/addons/web_widget_uom | 1 + setup/web_widget_uom/setup.py | 6 + web_widget_uom/README.rst | 109 +++++ web_widget_uom/__init__.py | 1 + web_widget_uom/__manifest__.py | 19 + web_widget_uom/i18n/it.po | 0 web_widget_uom/models/__init__.py | 1 + web_widget_uom/models/uom_uom.py | 60 +++ web_widget_uom/readme/CONTRIBUTORS.rst | 2 + web_widget_uom/readme/DESCRIPTION.rst | 6 + web_widget_uom/readme/ROADMAP.rst | 3 + web_widget_uom/readme/USAGE.rst | 40 ++ .../static/description/UoMDecimalPlaces.png | Bin 0 -> 20447 bytes web_widget_uom/static/description/index.html | 456 ++++++++++++++++++ web_widget_uom/static/src/js/widget.js | 44 ++ web_widget_uom/tests/__init__.py | 1 + .../tests/test_decimal_precision.py | 14 + web_widget_uom/views/assets.xml | 15 + web_widget_uom/views/uom_uom_views.xml | 26 + 19 files changed, 804 insertions(+) create mode 120000 setup/web_widget_uom/odoo/addons/web_widget_uom create mode 100644 setup/web_widget_uom/setup.py create mode 100644 web_widget_uom/README.rst create mode 100644 web_widget_uom/__init__.py create mode 100644 web_widget_uom/__manifest__.py create mode 100644 web_widget_uom/i18n/it.po create mode 100644 web_widget_uom/models/__init__.py create mode 100644 web_widget_uom/models/uom_uom.py create mode 100644 web_widget_uom/readme/CONTRIBUTORS.rst create mode 100644 web_widget_uom/readme/DESCRIPTION.rst create mode 100644 web_widget_uom/readme/ROADMAP.rst create mode 100644 web_widget_uom/readme/USAGE.rst create mode 100644 web_widget_uom/static/description/UoMDecimalPlaces.png create mode 100644 web_widget_uom/static/description/index.html create mode 100644 web_widget_uom/static/src/js/widget.js create mode 100644 web_widget_uom/tests/__init__.py create mode 100644 web_widget_uom/tests/test_decimal_precision.py create mode 100644 web_widget_uom/views/assets.xml create mode 100644 web_widget_uom/views/uom_uom_views.xml diff --git a/setup/web_widget_uom/odoo/addons/web_widget_uom b/setup/web_widget_uom/odoo/addons/web_widget_uom new file mode 120000 index 000000000..120729044 --- /dev/null +++ b/setup/web_widget_uom/odoo/addons/web_widget_uom @@ -0,0 +1 @@ +../../../../web_widget_uom \ No newline at end of file diff --git a/setup/web_widget_uom/setup.py b/setup/web_widget_uom/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/web_widget_uom/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/web_widget_uom/README.rst b/web_widget_uom/README.rst new file mode 100644 index 000000000..30c04aa2c --- /dev/null +++ b/web_widget_uom/README.rst @@ -0,0 +1,109 @@ +============== +Web Widget UoM +============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/14.0/web_widget_uom + :alt: OCA/web + +|badge1| |badge2| |badge3| + +This module aims to allow the user to decide how many +decimal places should be displayed in the Odoo User +Interface for each Unit of Measure. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +In the UoM form view specify the number of decimal places that +should be displayed for each unit of Measure: + +.. image:: https://raw.githubusercontent.com/OCA/web/14.0/web_widget_uom/static/description/UoMDecimalPlaces.png + :alt: Decimal Places in UoM form view + +In the view declaration, put widget='uom' attribute in the field tag:: + + ... + + + ... + + ... + + + ... + +
+ ... + + ... + +
+ ... + +Widget Options:: + + ... + + + ... + + ... + + + ... + +If the UoM field in the model is not declared under the name uom_id, the +option uom_field must be specified with the appropriate field name. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Contributors +~~~~~~~~~~~~ + +* Adria Gil Sorribes +* Giovanni Serra + +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/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_widget_uom/__init__.py b/web_widget_uom/__init__.py new file mode 100644 index 000000000..fe1551806 --- /dev/null +++ b/web_widget_uom/__init__.py @@ -0,0 +1 @@ +from . import models # noqa diff --git a/web_widget_uom/__manifest__.py b/web_widget_uom/__manifest__.py new file mode 100644 index 000000000..aa900b959 --- /dev/null +++ b/web_widget_uom/__manifest__.py @@ -0,0 +1,19 @@ +{ + "name": "Web Widget UoM", + "summary": """Allow user to to decide how many decimal places should be displayed for UoM. + """, + "category": "web", + "version": "14.0.1.0.0", + "author": "Odoo Community Association (OCA), Giovanni Serra", + "license": "AGPL-3", + "website": "https://github.com/OCA/web", + "depends": ["web", "uom", "product"], + "data": [ + "views/uom_uom_views.xml", + "views/assets.xml", + ], + "auto_install": False, + "application": False, + "installable": True, + "web_preload": True, +} diff --git a/web_widget_uom/i18n/it.po b/web_widget_uom/i18n/it.po new file mode 100644 index 000000000..e69de29bb diff --git a/web_widget_uom/models/__init__.py b/web_widget_uom/models/__init__.py new file mode 100644 index 000000000..7753e8e76 --- /dev/null +++ b/web_widget_uom/models/__init__.py @@ -0,0 +1 @@ +from . import uom_uom diff --git a/web_widget_uom/models/uom_uom.py b/web_widget_uom/models/uom_uom.py new file mode 100644 index 000000000..968b3cb96 --- /dev/null +++ b/web_widget_uom/models/uom_uom.py @@ -0,0 +1,60 @@ +# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# Copyright 2022 - Giovanni Serra +import decimal + +from odoo import _, api, fields, models + + +class UoM(models.Model): + _inherit = "uom.uom" + + decimal_places = fields.Integer( + string="Decimal Places", + default=2, + ) + + show_only_inputed_decimals = fields.Boolean( + "Show only inputed decimals", + default=False, + help="It shows only inputed decimals up to Decimal Places", + ) + + @api.onchange("decimal_places") + def _onchange_decimal_places(self): + decimal_accuracy = self.env["decimal.precision"].precision_get( + "Product Unit of Measure" + ) + + if self.decimal_places > decimal_accuracy: + return { + "warning": { + "title": _("Warning!"), + "message": _( + "The Decimal places is higher than the Decimal Accuracy" + " (%s digits).\nThis may cause inconsistencies in computations.\n" + "Please set Decimal Places between 0 and %s." + ) + % (decimal_accuracy, decimal_accuracy), + } + } + + _sql_constraints = [ + ( + "uom_decimal_places_positive", + "CHECK(decimal_places >= 0)", + "Decimal places must be strictly bigger or equal than zero", + ), + ] + + def get_decimal_places(self, uom_id, value): + uom = self.env["uom.uom"].browse(uom_id) + decimal_places = uom.decimal_places + if uom.show_only_inputed_decimals: + digits = ( + 0 + if isinstance(value, int) + else abs(decimal.Decimal(str(value)).as_tuple().exponent) + ) + decimal_places = min(decimal_places, digits) + return decimal_places diff --git a/web_widget_uom/readme/CONTRIBUTORS.rst b/web_widget_uom/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..c8cdb8cd3 --- /dev/null +++ b/web_widget_uom/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Adria Gil Sorribes +* Giovanni Serra diff --git a/web_widget_uom/readme/DESCRIPTION.rst b/web_widget_uom/readme/DESCRIPTION.rst new file mode 100644 index 000000000..c265fe666 --- /dev/null +++ b/web_widget_uom/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This module allows the user to decide maximum +how many decimal places should be displayed in the Odoo User +Interface for each Unit of Measure. + +If "Show only inputed decimals" is enabled on the UoM, +the widget will show inputed decimals up to Decimal Places. diff --git a/web_widget_uom/readme/ROADMAP.rst b/web_widget_uom/readme/ROADMAP.rst new file mode 100644 index 000000000..c46f1cf43 --- /dev/null +++ b/web_widget_uom/readme/ROADMAP.rst @@ -0,0 +1,3 @@ +TODO + +1. Add caching by uom.id diff --git a/web_widget_uom/readme/USAGE.rst b/web_widget_uom/readme/USAGE.rst new file mode 100644 index 000000000..52e836715 --- /dev/null +++ b/web_widget_uom/readme/USAGE.rst @@ -0,0 +1,40 @@ +In the UoM form view specify the number of decimal places that +should be displayed for each unit of Measure: + +.. image:: ../static/description/UoMDecimalPlaces.png + :alt: Decimal Places in UoM form view + +In the view declaration, put widget='uom' attribute in the field tag:: + + ... + + + ... + + ... + + + ... + +
+ ... + + ... + +
+ ... + +Widget Options:: + + ... + + + ... + + ... + + + ... + +If the UoM field in the model is not declared under the name uom_id, the +option uom_field must be specified with the appropriate field name. diff --git a/web_widget_uom/static/description/UoMDecimalPlaces.png b/web_widget_uom/static/description/UoMDecimalPlaces.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4bfb226ff9b931834f6e9a36edb420f1e5c0b6 GIT binary patch literal 20447 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 + + + + + +Web Widget UoM + + + +
+

Web Widget UoM

+ + +

Beta License: AGPL-3 OCA/web

+

This module aims to allow the user to decide how many +decimal places should be displayed in the Odoo User +Interface for each Unit of Measure.

+

Table of contents

+ +
+

Usage

+

In the UoM form view specify the number of decimal places that +should be displayed for each unit of Measure:

+Decimal Places in UoM form view +

In the view declaration, put widget=’uom’ attribute in the field tag:

+
+...
+<field name="arch" type="xml">
+    <tree string="View name">
+        ...
+        <field name="" widget="uom"/>
+        ...
+    </tree>
+</field>
+...
+<field name="arch" type="xml">
+    <form string="View name">
+        ...
+        <field name="" widget="uom"/>
+        ...
+    </form>
+</field>
+...
+
+

Widget Options:

+
+...
+<field name="arch" type="xml">
+    <tree string="View name">
+        ...
+        <field name="color" widget="color" options="{'uom_field': 'product_uom'}"/>
+        ...
+    </tree>
+</field>
+...
+
+

If the UoM field in the model is not declared under the name uom_id, the +option uom_field must be specified with the appropriate field name.

+
+
+

Bug Tracker

+

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

+

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

+
+
+

Credits

+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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

+

This module is part of the OCA/web project on GitHub.

+

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

+
+
+
+ + diff --git a/web_widget_uom/static/src/js/widget.js b/web_widget_uom/static/src/js/widget.js new file mode 100644 index 000000000..c24138556 --- /dev/null +++ b/web_widget_uom/static/src/js/widget.js @@ -0,0 +1,44 @@ +/* Copyright 2022 Giovanni Serra +License LGPLv3.0 or later (https://www.gnu.org/licenses/lgpl-3.0.en.html). */ + +/* Global jscolor */ +odoo.define("web.web_widget_uom", function (require) { + "use strict"; + + var basic_fields = require("web.basic_fields"); + var field_registry = require("web.field_registry"); + + var FieldUoM = basic_fields.FieldFloat.extend({ + willStart: function () { + return Promise.all([ + this._getDecimalPlaces(), + this._super.apply(this, arguments), + ]); + }, + _getDecimalPlaces: function () { + var self = this; + var uomField = + this.nodeOptions.uom_field || this.field.uom_field || "uom_id"; + var uomID = this.record.data[uomField] && this.record.data[uomField].res_id; + + var qtyField = this.nodeOptions.qty_field || "product_uom_qty"; + var quantity = this.record.data[qtyField] || 0.0; + + return this._rpc({ + model: "uom.uom", + method: "get_decimal_places", + args: [, uomID, quantity], + }).then(function (result) { + if (result !== null) { + self.nodeOptions.digits = [32, result]; + } + }); + }, + }); + + field_registry.add("uom", FieldUoM); + + return { + FieldUoM: FieldUoM, + }; +}); diff --git a/web_widget_uom/tests/__init__.py b/web_widget_uom/tests/__init__.py new file mode 100644 index 000000000..418fe18ae --- /dev/null +++ b/web_widget_uom/tests/__init__.py @@ -0,0 +1 @@ +from . import test_decimal_precision diff --git a/web_widget_uom/tests/test_decimal_precision.py b/web_widget_uom/tests/test_decimal_precision.py new file mode 100644 index 000000000..89af3515c --- /dev/null +++ b/web_widget_uom/tests/test_decimal_precision.py @@ -0,0 +1,14 @@ +from odoo.tests import common + + +class TestWebWidgetUom(common.TransactionCase): + def test_web_widget_uom(self): + Uom = self.env["uom.uom"] + uom_unit = self.env.ref("uom.product_uom_unit") + + uom_unit.write({"decimal_places": 5}) + self.assertTrue(isinstance(uom_unit._onchange_decimal_places(), dict)) + self.assertEqual(Uom.get_decimal_places(uom_unit.id, 0.1234567), 5) + + uom_unit.write({"show_only_inputed_decimals": True}) + self.assertEqual(Uom.get_decimal_places(uom_unit.id, 0.1), 1) diff --git a/web_widget_uom/views/assets.xml b/web_widget_uom/views/assets.xml new file mode 100644 index 000000000..119e6e773 --- /dev/null +++ b/web_widget_uom/views/assets.xml @@ -0,0 +1,15 @@ + + +