Merge PR #2091 into 14.0

Signed-off-by simahawk
pull/2647/head
OCA-git-bot 2023-10-25 15:15:55 +00:00
commit aed764632b
19 changed files with 804 additions and 0 deletions

View File

@ -0,0 +1 @@
../../../../web_widget_uom

View File

@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)

View File

@ -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::
...
<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 <https://github.com/OCA/web/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/web/issues/new?body=module:%20web_widget_uom%0Aversion:%2014.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
=======
Contributors
~~~~~~~~~~~~
* Adria Gil Sorribes <adria.gil@eficent.com>
* Giovanni Serra <giovanni@gslab.it>
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 <https://github.com/OCA/web/tree/14.0/web_widget_uom>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@ -0,0 +1 @@
from . import models # noqa

View File

@ -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,
}

View File

View File

@ -0,0 +1 @@
from . import uom_uom

View File

@ -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

View File

@ -0,0 +1,2 @@
* Adria Gil Sorribes <adria.gil@eficent.com>
* Giovanni Serra <giovanni@gslab.it>

View File

@ -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.

View File

@ -0,0 +1,3 @@
TODO
1. Add caching by uom.id

View File

@ -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::
...
<field name="arch" type="xml">
<tree string="View name">
...
<field name="product_qty" widget="uom"/>
...
</tree>
</field>
...
<field name="arch" type="xml">
<form string="View name">
...
<field name="product_qty" widget="uom"/>
...
</form>
</field>
...
Widget Options::
...
<field name="arch" type="xml">
<tree string="View name">
...
<field name="product_qty" widget="uom" 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,456 @@
<?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/" />
<title>Web Widget UoM</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="web-widget-uom">
<h1 class="title">Web Widget UoM</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/web/tree/14.0/web_widget_uom"><img alt="OCA/web" src="https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github" /></a></p>
<p>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.</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="#contributors" id="id4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id1">Usage</a></h1>
<p>In the UoM form view specify the number of decimal places that
should be displayed for each unit of Measure:</p>
<img alt="Decimal Places in UoM form view" src="https://raw.githubusercontent.com/OCA/web/14.0/web_widget_uom/static/description/UoMDecimalPlaces.png" />
<p>In the view declaration, put widget=uom attribute in the field tag:</p>
<pre class="literal-block">
...
&lt;field name=&quot;arch&quot; type=&quot;xml&quot;&gt;
&lt;tree string=&quot;View name&quot;&gt;
...
&lt;field name=&quot;&quot; widget=&quot;uom&quot;/&gt;
...
&lt;/tree&gt;
&lt;/field&gt;
...
&lt;field name=&quot;arch&quot; type=&quot;xml&quot;&gt;
&lt;form string=&quot;View name&quot;&gt;
...
&lt;field name=&quot;&quot; widget=&quot;uom&quot;/&gt;
...
&lt;/form&gt;
&lt;/field&gt;
...
</pre>
<p>Widget Options:</p>
<pre class="literal-block">
...
&lt;field name=&quot;arch&quot; type=&quot;xml&quot;&gt;
&lt;tree string=&quot;View name&quot;&gt;
...
&lt;field name=&quot;color&quot; widget=&quot;color&quot; options=&quot;{'uom_field': 'product_uom'}&quot;/&gt;
...
&lt;/tree&gt;
&lt;/field&gt;
...
</pre>
<p>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.</p>
</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/web/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/web/issues/new?body=module:%20web_widget_uom%0Aversion:%2014.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="contributors">
<h2><a class="toc-backref" href="#id4">Contributors</a></h2>
<ul class="simple">
<li>Adria Gil Sorribes &lt;<a class="reference external" href="mailto:adria.gil&#64;eficent.com">adria.gil&#64;eficent.com</a>&gt;</li>
<li>Giovanni Serra &lt;<a class="reference external" href="mailto:giovanni&#64;gslab.it">giovanni&#64;gslab.it</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id5">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/web/tree/14.0/web_widget_uom">OCA/web</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>

View File

@ -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,
};
});

View File

@ -0,0 +1 @@
from . import test_decimal_precision

View File

@ -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)

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<template
id="assets_backend"
name="web_widget_uom_assets"
inherit_id="web.assets_backend"
>
<xpath expr="." position="inside">
<script
type="text/javascript"
src="/web_widget_uom/static/src/js/widget.js"
/>
</xpath>
</template>
</odoo>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="product_uom_tree_view" model="ir.ui.view">
<field name="name">uom.uom.tree</field>
<field name="model">uom.uom</field>
<field name="inherit_id" ref="uom.product_uom_tree_view" />
<field name="arch" type="xml">
<field name="uom_type" position="after">
<field name="decimal_places" />
<field name="show_only_inputed_decimals" />
</field>
</field>
</record>
<record id="product_uom_form_view" model="ir.ui.view">
<field name="name">uom.uom.form</field>
<field name="model">uom.uom</field>
<field name="inherit_id" ref="uom.product_uom_form_view" />
<field name="arch" type="xml">
<field name="rounding" position="after">
<field name="decimal_places" />
<field name="show_only_inputed_decimals" />
</field>
</field>
</record>
</odoo>