[Erp5-report] r39089 yo - in /erp5/trunk/products/ERP5: Document/ PropertySheet/ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Oct 13 12:29:53 CEST 2010
Author: yo
Date: Wed Oct 13 12:29:46 2010
New Revision: 39089
URL: http://svn.erp5.org?rev=39089&view=rev
Log:
Fix various issues:
- make it really working with any precision
- change the precision to specify a minimal unit rather than a kind of scale
- fix some wrong assert conditions
Modified:
erp5/trunk/products/ERP5/Document/RoundingModel.py
erp5/trunk/products/ERP5/PropertySheet/RoundingModel.py
erp5/trunk/products/ERP5/tests/testRoundingTool.py
Modified: erp5/trunk/products/ERP5/Document/RoundingModel.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/RoundingModel.py?rev=39089&r1=39088&r2=39089&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/RoundingModel.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Document/RoundingModel.py [utf8] Wed Oct 13 12:29:46 2010
@@ -29,7 +29,10 @@ from AccessControl import ClassSecurityI
from Products.ERP5Type import PropertySheet, Permissions
from Products.ERP5.Document.Predicate import Predicate
from Products.ERP5Type.Utils import UpperCase
+from decimal import Decimal
+from Products.ERP5.Tool.RoundingTool import ROUNDING_OPTION_DICT
import ExtensionClass
+from math import log
class RoundingModel(Predicate):
"""
@@ -56,34 +59,38 @@ class RoundingModel(Predicate):
def roundValue(self, value):
if not value:
return value
- if self.getRoundingMethodId() is not None:
- rounding_method = getattr(self, self.getRoundingMethodId(), None)
+
+ rounding_method_id = self.getRoundingMethodId()
+ if rounding_method_id is not None:
+ rounding_method = getattr(self, rounding_method_id, None)
if rounding_method is None:
- raise ValueError, 'Rounding method (%s) was not found.'
+ raise ValueError('Rounding method (%s) was not found.' \
+ % (rounding_method_id,))
else:
- from decimal import Decimal
- from Products.ERP5.Tool.RoundingTool import ROUNDING_OPTION_DICT
decimal_rounding_option = self.getDecimalRoundingOption()
- if (decimal_rounding_option is None or
- decimal_rounding_option not in ROUNDING_OPTION_DICT):
- raise ValueError, 'Decimal rounding option must be selected.'
- def rounding_method(value, decimal_exponent, precision):
+ if decimal_rounding_option not in ROUNDING_OPTION_DICT:
+ raise ValueError('Decimal rounding option must be selected.')
+
+ def rounding_method(value, precision):
if precision is None:
- precision = 0
- if decimal_exponent is None:
- if precision > 0:
- decimal_exponent = '1.' + '0' * precision
- else:
- decimal_exponent = '1'
- result = float(
- Decimal(str(value)).quantize(Decimal(decimal_exponent),
- rounding=decimal_rounding_option))
- if precision < 0:
- # FIXME!!!!!
- result = round(result, precision)
+ precision = 1
+
+ scale = int(log(precision, 10))
+ if scale > 0:
+ value = Decimal(str(value))
+ scale = Decimal(str(int(precision))).quantize(value)
+ precision = Decimal('1')
+ value /= scale
+ value = value.quantize(precision, rounding=decimal_rounding_option)
+ value *= scale
+ result = float(value.quantize(precision))
+ else:
+ result = float(
+ Decimal(str(value)).quantize(Decimal(str(precision)),
+ rounding=decimal_rounding_option))
return result
- return rounding_method(value, self.getDecimalExponent(), self.getPrecision())
+ return rounding_method(value, self.getPrecision())
security.declareProtected(Permissions.AccessContentsInformation, 'getRoundingProxy')
def getRoundingProxy(self, document):
@@ -99,23 +106,14 @@ class RoundingModel(Predicate):
temp_document = document._getOriginalDocument()
original_document = document
else:
- from Products.ERP5Type import Document
- if document.__class__.__name__ == 'TempDocument':
- class_ = document.__class__.__bases__[0]
- else:
- class_ = document.__class__
- constructor = getattr(Document, 'newTemp%s' % class_.__name__)
- temp_document = constructor(document.getParentValue(), 'id')
- temp_document.__dict__.update(document.__dict__)
+ temp_document = document.asContext()
original_document = temp_document
for property_id in rounding_model.getRoundedPropertyIdList():
getter_name = 'get%s' % UpperCase(property_id)
- getter = getattr(temp_document,
- getter_name, None)
+ getter = getattr(temp_document, getter_name, None)
setter_name = 'set%s' % UpperCase(property_id)
- setter = getattr(temp_document,
- setter_name, None)
+ setter = getattr(temp_document, setter_name, None)
if getter is not None and setter is not None:
# round the property value itself
Modified: erp5/trunk/products/ERP5/PropertySheet/RoundingModel.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/PropertySheet/RoundingModel.py?rev=39089&r1=39088&r2=39089&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/PropertySheet/RoundingModel.py [utf8] (original)
+++ erp5/trunk/products/ERP5/PropertySheet/RoundingModel.py [utf8] Wed Oct 13 12:29:46 2010
@@ -47,8 +47,8 @@ class RoundingModel(DecimalOption):
'default' : None,
},
{ 'id' : 'precision',
- 'description' : 'Precision value to be used for rounding. Rounding model accepts negative precision value as same as built-in round function.',
- 'type' : 'int',
+ 'description' : 'Precision value to be used for rounding, specified as a minimal unit.',
+ 'type' : 'float',
'mode' : 'w',
'default' : None,
},
Modified: erp5/trunk/products/ERP5/tests/testRoundingTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testRoundingTool.py?rev=39089&r1=39088&r2=39089&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testRoundingTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testRoundingTool.py [utf8] Wed Oct 13 12:29:46 2010
@@ -81,7 +81,7 @@ class TestRoundingTool(ERP5TypeTestCase)
# rounding model dummy never match to sale order line
rounding_model_dummy= rounding_tool.newContent(portal_type='Rounding Model')
rounding_model_dummy.edit(decimal_rounding_option='ROUND_DOWN',
- precision=2,
+ precision=0.01,
rounded_property_id_list=['price',
'quantity',
'total_price'])
@@ -92,7 +92,7 @@ class TestRoundingTool(ERP5TypeTestCase)
# add a rounding model for price of sale order line
rounding_model_1 = rounding_tool.newContent(portal_type='Rounding Model')
rounding_model_1.edit(decimal_rounding_option='ROUND_DOWN',
- precision=2,
+ precision=0.01,
rounded_property_id_list=['price'])
rounding_model_1.setCriterionProperty('portal_type')
rounding_model_1.setCriterion('portal_type', identity=['Sale Order Line'],
@@ -113,7 +113,7 @@ class TestRoundingTool(ERP5TypeTestCase)
self.assertEqual(wrapped_line.getProperty('quantity'), 0.0)
self.assertEqual(wrapped_line.getTotalPrice(), 0.0)
self.assertEqual(wrapped_line.getProperty('total_price'), 0.0)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 2)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 0.01)
self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), None)
self.assertEqual(wrapped_line.getRoundingModelPrecision('total_price'), None)
@@ -141,7 +141,7 @@ class TestRoundingTool(ERP5TypeTestCase)
self.assertEqual(wrapped_line.getProperty('quantity'), 78.91)
self.assertEqual(wrapped_line.getTotalPrice(), 123.45*78.91)
self.assertEqual(wrapped_line.getProperty('total_price'), 123.45*78.91)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 2)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 0.01)
self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), None)
self.assertEqual(wrapped_line.getRoundingModelPrecision('total_price'), None)
@@ -149,7 +149,7 @@ class TestRoundingTool(ERP5TypeTestCase)
self.login('developer')
rounding_model_2 = rounding_tool.newContent(portal_type='Rounding Model')
rounding_model_2.edit(decimal_rounding_option='ROUND_UP',
- precision=1,
+ precision=0.1,
rounded_property_id_list=['quantity'])
transaction.commit()
@@ -166,7 +166,7 @@ class TestRoundingTool(ERP5TypeTestCase)
self.assertEqual(wrapped_line.getProperty('quantity'), 78.91)
self.assertEqual(wrapped_line.getTotalPrice(), 123.45*78.91)
self.assertEqual(wrapped_line.getProperty('total_price'), 123.45*78.91)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 2)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 0.01)
self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), None)
self.assertEqual(wrapped_line.getRoundingModelPrecision('total_price'), None)
@@ -185,15 +185,15 @@ class TestRoundingTool(ERP5TypeTestCase)
self.assertEqual(wrapped_line.getProperty('quantity'), 79.0)
self.assertEqual(wrapped_line.getTotalPrice(), 123.45*79.0)
self.assertEqual(wrapped_line.getProperty('total_price'), 123.45*79.0)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 2)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), 1)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 0.01)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), 0.1)
self.assertEqual(wrapped_line.getRoundingModelPrecision('total_price'), None)
# add a rounding model for total price of any portal type
self.login('developer')
rounding_model_3 = rounding_tool.newContent(portal_type='Rounding Model')
rounding_model_3.edit(decimal_rounding_option='ROUND_UP',
- precision=-1,
+ precision=10,
rounded_property_id_list=['total_price'])
self.login('assignor')
@@ -208,11 +208,11 @@ class TestRoundingTool(ERP5TypeTestCase)
self.assertEqual(wrapped_line.getProperty('price'), 123.45)
self.assertEqual(wrapped_line.getQuantity(), 79.0)
self.assertEqual(wrapped_line.getProperty('quantity'), 79.0)
- self.assertEqual(wrapped_line.getTotalPrice(), 9750.0)
- self.assertEqual(wrapped_line.getProperty('total_price'), 9750.0)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 2)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), 1)
- self.assertEqual(wrapped_line.getRoundingModelPrecision('total_price'), -1)
+ self.assertEqual(wrapped_line.getTotalPrice(), 9760.0)
+ self.assertEqual(wrapped_line.getProperty('total_price'), 9760.0)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('price'), 0.01)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('quantity'), 0.1)
+ self.assertEqual(wrapped_line.getRoundingModelPrecision('total_price'), 10)
def test_suite():
More information about the Erp5-report
mailing list