summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Holtermann <info@markusholtermann.eu>2014-11-06 12:29:43 +0100
committerBaptiste Mispelon <bmispelon@gmail.com>2014-11-06 15:30:30 +0100
commitc7c098cf97fbb1416f302c76799058ad63a5f7aa (patch)
treef2999e18d173ecf17161b1b61578b284f2607c79
parentb07aa52e8a8e4c7fdc7265f75ce2e7992e657ae9 (diff)
Fixed #23770 -- Changed serialization strategy for floats with respect to NaN and Inf
Thanks to w0rp for the report
-rw-r--r--django/db/migrations/writer.py11
-rw-r--r--docs/releases/1.7.2.txt3
-rw-r--r--tests/migrations/test_writer.py5
3 files changed, 16 insertions, 3 deletions
diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py
index 3e4faca833..1e093778a5 100644
--- a/django/db/migrations/writer.py
+++ b/django/db/migrations/writer.py
@@ -1,10 +1,11 @@
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)
diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt
index eaaf15507a..3d9a74616b 100644
--- a/docs/releases/1.7.2.txt
+++ b/docs/releases/1.7.2.txt
@@ -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:).
diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py
index f98b2493aa..1dcc8e641a 100644
--- a/tests/migrations/test_writer.py
+++ b/tests/migrations/test_writer.py
@@ -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")