From 1967b6ce190a0def51249f252c99d36331bb21e2 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 5 Mar 2014 18:14:56 +0100 Subject: [PATCH 1/4] [FIX] product: when converting unit of mesures, round above instead of mathematical rounding bzr revid: mat@openerp.com-20140305171456-goo7on3ncfihu0wu --- addons/product/_common.py | 20 ++++++++++++++------ addons/product/pricelist.py | 4 ++-- addons/product/product.py | 4 ++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/addons/product/_common.py b/addons/product/_common.py index f5f53fe8689..def09e975af 100644 --- a/addons/product/_common.py +++ b/addons/product/_common.py @@ -18,12 +18,20 @@ # along with this program. If not, see . # ############################################################################## +from openerp import tools + +import math +import logging +_logger = logging.getLogger(__name__) + + def rounding(f, r): + # TODO for trunk: log deprecation warning + # _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.") + return tools.float_round(f, precision_rounding=r) + +# TODO for trunk: add rounding method parameter to tools.float_round and remove this method +def ceiling(f, r): if not r: return f - return round(f / r) * r - - - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: - + return math.ceil(f / r) * r diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py index 426931f9a27..86480c60059 100644 --- a/addons/product/pricelist.py +++ b/addons/product/pricelist.py @@ -21,7 +21,7 @@ import time -from _common import rounding +from _common import ceiling from openerp.osv import fields, osv from openerp.tools.translate import _ @@ -296,7 +296,7 @@ class product_pricelist(osv.osv): if price is not False: price_limit = price price = price * (1.0+(res['price_discount'] or 0.0)) - price = rounding(price, res['price_round']) #TOFIX: rounding with tools.float_rouding + price = ceiling(price, res['price_round']) price += (res['price_surcharge'] or 0.0) if res['price_min_margin']: price = max(price, price_limit+res['price_min_margin']) diff --git a/addons/product/product.py b/addons/product/product.py index d9419fc4d68..34503b5136e 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -22,7 +22,7 @@ import math import re -from _common import rounding +from _common import ceiling from openerp import tools from openerp.osv import osv, fields @@ -178,7 +178,7 @@ class product_uom(osv.osv): return qty amount = qty / from_unit.factor if to_unit: - amount = rounding(amount * to_unit.factor, to_unit.rounding) + amount = ceiling(amount * to_unit.factor, to_unit.rounding) return amount def _compute_price(self, cr, uid, from_uom_id, price, to_uom_id=False): From 5db649549c98056304181a0302821e897b50ab7a Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 6 Mar 2014 10:45:04 +0100 Subject: [PATCH 2/4] [IMP] mrp: use also the ceiling method from product bzr revid: mat@openerp.com-20140306094504-37r691hxcemp0ual --- addons/mrp/mrp.py | 5 ++++- addons/product/_common.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/mrp/mrp.py b/addons/mrp/mrp.py index dfe45e927bc..2b5d68177f1 100644 --- a/addons/mrp/mrp.py +++ b/addons/mrp/mrp.py @@ -30,6 +30,7 @@ from openerp.tools.translate import _ from openerp import netsvc from openerp import tools from openerp import SUPERUSER_ID +from openerp.addons.product import _common #---------------------------------------------------------- # Work Centers @@ -324,7 +325,7 @@ class mrp_bom(osv.osv): """ routing_obj = self.pool.get('mrp.routing') factor = factor / (bom.product_efficiency or 1.0) - factor = rounding(factor, bom.product_rounding) + factor = _common.ceiling(factor, bom.product_rounding) if factor < bom.product_rounding: factor = bom.product_rounding result = [] @@ -380,6 +381,8 @@ class mrp_bom(osv.osv): def rounding(f, r): + # TODO for trunk: log deprecation warning + # _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.") import math if not r: return f diff --git a/addons/product/_common.py b/addons/product/_common.py index def09e975af..2d6fe8bec32 100644 --- a/addons/product/_common.py +++ b/addons/product/_common.py @@ -30,7 +30,7 @@ def rounding(f, r): # _logger.warning("Deprecated rounding method, please use tools.float_round to round floats.") return tools.float_round(f, precision_rounding=r) -# TODO for trunk: add rounding method parameter to tools.float_round and remove this method +# TODO for trunk: add rounding method parameter to tools.float_round and use this method as hook def ceiling(f, r): if not r: return f From 378dbbfaaee930b8b82111cf06ea16755a8b4840 Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 6 Mar 2014 14:34:56 +0100 Subject: [PATCH 3/4] [IMP] product: add python tests bzr revid: mat@openerp.com-20140306133456-cnqjcwmo73ioqxxf --- addons/product/__openerp__.py | 1 - addons/product/test/product_uom.yml | 15 ------------ addons/product/tests/__init__.py | 5 ++++ addons/product/tests/test_uom.py | 37 +++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 16 deletions(-) delete mode 100644 addons/product/test/product_uom.yml create mode 100644 addons/product/tests/__init__.py create mode 100644 addons/product/tests/test_uom.py diff --git a/addons/product/__openerp__.py b/addons/product/__openerp__.py index fdadda2e4d4..d81a352087e 100644 --- a/addons/product/__openerp__.py +++ b/addons/product/__openerp__.py @@ -61,7 +61,6 @@ Print product labels with barcode. ], 'test': [ 'product_pricelist_demo.yml', - 'test/product_uom.yml', 'test/product_pricelist.yml', ], 'installable': True, diff --git a/addons/product/test/product_uom.yml b/addons/product/test/product_uom.yml deleted file mode 100644 index 04928d43d87..00000000000 --- a/addons/product/test/product_uom.yml +++ /dev/null @@ -1,15 +0,0 @@ -- - In order to test conversation of UOM, -- - I convert Grams into TON with price. -- - !python {model: product.uom}: | - from_uom_id = ref("product_uom_gram") - to_uom_id = ref("product_uom_ton") - price = 2 - qty = 1020000 - price = self._compute_price(cr, uid, from_uom_id, price, to_uom_id) - qty = self._compute_qty(cr, uid, from_uom_id, qty, to_uom_id) - assert qty == 1.02, "Qty is not correspond." - assert price == 2000000.0, "Price is not correspond." - diff --git a/addons/product/tests/__init__.py b/addons/product/tests/__init__.py new file mode 100644 index 00000000000..850189ac0f4 --- /dev/null +++ b/addons/product/tests/__init__.py @@ -0,0 +1,5 @@ +from . import test_uom + +fast_suite = [ + test_uom, +] diff --git a/addons/product/tests/test_uom.py b/addons/product/tests/test_uom.py new file mode 100644 index 00000000000..3d3ba04b689 --- /dev/null +++ b/addons/product/tests/test_uom.py @@ -0,0 +1,37 @@ +from openerp.tests.common import TransactionCase + +class TestUom(TransactionCase): + """Tests for unit of measure conversion""" + + def setUp(self): + super(TestUom, self).setUp() + self.product = self.registry('product.product') + self.uom = self.registry('product.uom') + self.imd = self.registry('ir.model.data') + + def test_10_conversion(self): + cr, uid = self.cr, self.uid + gram_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_gram')[1] + tonne_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_ton')[1] + + qty = self.uom._compute_qty(cr, uid, gram_id, 1020000, tonne_id) + self.assertEquals(qty, 1.02, "Converted quantity does not correspond.") + + price = self.uom._compute_price(cr, uid, gram_id, 2, tonne_id) + self.assertEquals(price, 2000000.0, "Converted price does not correspond.") + + def test_20_rounding(self): + cr, uid = self.cr, self.uid + unit_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_unit')[1] + categ_unit_id = self.imd.get_object_reference(cr, uid, 'product', 'product_uom_categ_unit')[1] + + score_id = self.uom.create(cr, uid, { + 'name': 'Score', + 'factor_inv': 20, + 'uom_type': 'bigger', + 'rounding': 1.0, + 'category_id': categ_unit_id + }) + + qty = self.uom._compute_qty(cr, uid, unit_id, 2, score_id) + self.assertEquals(qty, 1, "Converted quantity should be rounded up.") From 1e048736df81d58e1b18f1734e047808f225cd3b Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Thu, 6 Mar 2014 16:31:25 +0100 Subject: [PATCH 4/4] [IMP] remove useless imports bzr revid: mat@openerp.com-20140306153125-czwswqw1k3w5ungh --- addons/product/_common.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/product/_common.py b/addons/product/_common.py index 2d6fe8bec32..c05dcee66a2 100644 --- a/addons/product/_common.py +++ b/addons/product/_common.py @@ -21,8 +21,6 @@ from openerp import tools import math -import logging -_logger = logging.getLogger(__name__) def rounding(f, r):