#32949: decimal.InvalidOperation error on DecimalField form field
---------------------------------+------------------------------------
     Reporter:  yakimka          |                    Owner:  nobody
         Type:  Bug              |                   Status:  new
    Component:  Forms            |                  Version:  3.2
     Severity:  Release blocker  |               Resolution:
     Keywords:                   |             Triage Stage:  Accepted
    Has patch:  1                |      Needs documentation:  1
  Needs tests:  0                |  Patch needs improvement:  1
Easy pickings:  0                |                    UI/UX:  0
---------------------------------+------------------------------------
Changes (by Carlton Gibson):

 * needs_better_patch:  0 => 1
 * stage:  Unreviewed => Accepted
 * severity:  Normal => Release blocker
 * needs_docs:  0 => 1


Comment:

 Thanks for the report.

 This is a regression in cc3d24d7d577f174937a0744d886c4c7123cfa85.

 The #7777 originally added handling of `NaN` and `Inf` in `DecimalField`
 (in 692fd7da5e5bfe1533c40f94999ea42f9b986356).
 It looked redundant but wasn't because `MaxValueValidator` does not handle
 `Decimal('NaN')`.

 Here's a minimal diff showing that:

 {{{
 diff --git a/tests/validators/tests.py b/tests/validators/tests.py
 index e39d0e3a1c..42665c6ccb 100644
 --- a/tests/validators/tests.py
 +++ b/tests/validators/tests.py
 @@ -214,6 +214,7 @@ TEST_DATA = [

      (MaxValueValidator(0), 1, ValidationError),
      (MaxValueValidator(NOW), NOW + timedelta(days=1), ValidationError),
 +    (MaxValueValidator(Decimal('NaN')), 1, ValidationError),

      (MinValueValidator(-10), -10, None),
      (MinValueValidator(-10), 10, None),
 }}}

 Results in:

 {{{
 ======================================================================
 ERROR: test_validators (validators.tests.TestValidators)
 [MaxValueValidator] (value=1)
 ----------------------------------------------------------------------
 Traceback (most recent call last):
   File "...django/tests/validators/tests.py", line 355, in test_validators
     validator(value)
   File "...django/django/core/validators.py", line 358, in __call__
     if self.compare(cleaned, limit_value):
   File "...django/django/core/validators.py", line 383, in compare
     return a > b
 decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
 }}}

 You PR here should (partially?) revert
 cc3d24d7d577f174937a0744d886c4c7123cfa85 (see #31806 and
 [https://github.com/django/django/pull/13212/ the PR for discussion and
 related commits]).

 Add `max_value` to the existing `test_enter_a_numer_error()` case:

 {{{
 diff --git a/tests/forms_tests/field_tests/test_decimalfield.py
 b/tests/forms_tests/field_tests/test_decimalfield.py
 index c8b044722e..04c555c4ad 100644
 --- a/tests/forms_tests/field_tests/test_decimalfield.py
 +++ b/tests/forms_tests/field_tests/test_decimalfield.py
 @@ -49,7 +49,7 @@ class DecimalFieldTest(FormFieldAssertionsMixin,
 SimpleTestCase):
          self.assertIsNone(f.min_value)

      def test_enter_a_number_error(self):
 -        f = DecimalField(max_digits=4, decimal_places=2)
 +        f = DecimalField(max_value=1, max_digits=4, decimal_places=2)
          values = (
 }}}

 It looks as if test `test_value_placeholder_with_decimal_field
 (forms_tests.tests.test_validators.ValidatorCustomMessageTests)` will need
 adjusting.

 A release note in 3.2.6.txt will be needed.
 Good spot.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32949#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.035b1a15efc961cd3a6063cf5cef29ee%40djangoproject.com.

Reply via email to