Skip to content

Commit 46a44e5

Browse files
Quantize incoming digitals (#4339)
1 parent aa349fe commit 46a44e5

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

rest_framework/fields.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,7 @@ def to_internal_value(self, data):
955955
if value in (decimal.Decimal('Inf'), decimal.Decimal('-Inf')):
956956
self.fail('invalid')
957957

958-
return self.validate_precision(value)
958+
return self.quantize(self.validate_precision(value))
959959

960960
def validate_precision(self, value):
961961
"""
@@ -1018,7 +1018,8 @@ def quantize(self, value):
10181018
context.prec = self.max_digits
10191019
return value.quantize(
10201020
decimal.Decimal('.1') ** self.decimal_places,
1021-
context=context)
1021+
context=context
1022+
)
10221023

10231024

10241025
# Date & time fields...

tests/test_fields.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,6 +912,26 @@ def test_localize_forces_coerce_to_string(self):
912912
self.assertTrue(isinstance(field.to_representation(Decimal('1.1')), six.string_types))
913913

914914

915+
class TestQuantizedValueForDecimal(TestCase):
916+
def test_int_quantized_value_for_decimal(self):
917+
field = serializers.DecimalField(max_digits=4, decimal_places=2)
918+
value = field.to_internal_value(12).as_tuple()
919+
expected_digit_tuple = (0, (1, 2, 0, 0), -2)
920+
self.assertEqual(value, expected_digit_tuple)
921+
922+
def test_string_quantized_value_for_decimal(self):
923+
field = serializers.DecimalField(max_digits=4, decimal_places=2)
924+
value = field.to_internal_value('12').as_tuple()
925+
expected_digit_tuple = (0, (1, 2, 0, 0), -2)
926+
self.assertEqual(value, expected_digit_tuple)
927+
928+
def test_part_precision_string_quantized_value_for_decimal(self):
929+
field = serializers.DecimalField(max_digits=4, decimal_places=2)
930+
value = field.to_internal_value('12.0').as_tuple()
931+
expected_digit_tuple = (0, (1, 2, 0, 0), -2)
932+
self.assertEqual(value, expected_digit_tuple)
933+
934+
915935
class TestNoDecimalPlaces(FieldValues):
916936
valid_inputs = {
917937
'0.12345': Decimal('0.12345'),

0 commit comments

Comments
 (0)