Commit c7c098cf authored by Markus Holtermann's avatar Markus Holtermann Committed by Baptiste Mispelon
Browse files

Fixed #23770 -- Changed serialization strategy for floats with respect to NaN and Inf

Thanks to w0rp for the report
parent b07aa52e
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
from __future__ import unicode_literals

import collections
import datetime
import inspect
import decimal
import collections
from importlib import import_module
import inspect
import math
import os
import re
import sys
@@ -304,7 +305,11 @@ class MigrationWriter(object):
        elif isinstance(value, SettingsReference):
            return "settings.%s" % value.setting_name, {"from django.conf import settings"}
        # Simple types
        elif isinstance(value, six.integer_types + (float, bool, type(None))):
        elif isinstance(value, float):
            if math.isnan(value) or math.isinf(value):
                return 'float("{}")'.format(value), set()
            return repr(value), set()
        elif isinstance(value, six.integer_types + (bool, type(None))):
            return repr(value), set()
        elif isinstance(value, six.binary_type):
            value_repr = repr(value)
+3 −0
Original line number Diff line number Diff line
@@ -49,3 +49,6 @@ Bugfixes

* Allowed usage of ``DateTimeField()`` as ``Transform.output_field``
  (:ticket:`23420`).

* Fixed a migration serializing bug involving ``float("nan")`` and
  ``float("inf")`` (:ticket:23770:).
+5 −0
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
from __future__ import unicode_literals

import datetime
import math
import os
import re
import tokenize
@@ -69,6 +70,10 @@ class WriterTests(TestCase):
        """
        # Basic values
        self.assertSerializedEqual(1)
        self.assertSerializedEqual(1.2)
        self.assertTrue(math.isinf(self.serialize_round_trip(float("inf"))))
        self.assertTrue(math.isinf(self.serialize_round_trip(float("-inf"))))
        self.assertTrue(math.isnan(self.serialize_round_trip(float("nan"))))
        self.assertSerializedEqual(None)
        self.assertSerializedEqual(b"foobar")
        string, imports = MigrationWriter.serialize(b"foobar")