Commit 3b966c2b authored by Jon Dufresne's avatar Jon Dufresne Committed by Claude Paroz
Browse files

Fixed #24229 -- Changed IntegerField to clean floats representing integers

parent fa9cb5dc
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -236,6 +236,7 @@ class IntegerField(Field):
    default_error_messages = {
        'invalid': _('Enter a whole number.'),
    }
    re_decimal = re.compile(r'\.0*\s*$')

    def __init__(self, max_value=None, min_value=None, *args, **kwargs):
        self.max_value, self.min_value = max_value, min_value
@@ -259,8 +260,9 @@ class IntegerField(Field):
            return None
        if self.localize:
            value = formats.sanitize_separators(value)
        # Strip trailing decimal and zeros.
        try:
            value = int(str(value))
            value = int(self.re_decimal.sub('', str(value)))
        except (ValueError, TypeError):
            raise ValidationError(self.error_messages['invalid'], code='invalid')
        return value
+17 −0
Original line number Diff line number Diff line
@@ -247,6 +247,23 @@ class FieldsTests(SimpleTestCase):
        f1 = IntegerField(localize=True)
        self.assertWidgetRendersTo(f1, '<input id="id_f" name="f" type="text" />')

    def test_integerfield_float(self):
        f = IntegerField()
        self.assertEqual(1, f.clean(1.0))
        self.assertEqual(1, f.clean('1.0'))
        self.assertEqual(1, f.clean(b'1.0'))
        self.assertEqual(1, f.clean(' 1.0 '))
        self.assertEqual(1, f.clean('1.'))
        self.assertEqual(1, f.clean(' 1. '))
        self.assertRaisesMessage(ValidationError, "'Enter a whole number.'", f.clean, '1.5')
        self.assertRaisesMessage(ValidationError, "'Enter a whole number.'", f.clean, '')

    def test_integerfield_big_num(self):
        f = IntegerField()
        self.assertEqual(9223372036854775808, f.clean(9223372036854775808))
        self.assertEqual(9223372036854775808, f.clean('9223372036854775808'))
        self.assertEqual(9223372036854775808, f.clean('9223372036854775808.0'))

    def test_integerfield_subclass(self):
        """
        Test that class-defined widget is not overwritten by __init__ (#22245).