Fixed #21954: Raise nice error when serializing datetimes with timezones

This commit is contained in:
Andrew Godwin 2014-02-09 11:17:13 +00:00
parent 4f8e8a6ec2
commit 97a8fd4682
2 changed files with 9 additions and 1 deletions

View File

@ -212,7 +212,12 @@ class MigrationWriter(object):
strings.append((k_string, v_string)) strings.append((k_string, v_string))
return "{%s}" % (", ".join("%s: %s" % (k, v) for k, v in strings)), imports return "{%s}" % (", ".join("%s: %s" % (k, v) for k, v in strings)), imports
# Datetimes # Datetimes
elif isinstance(value, (datetime.datetime, datetime.date)): elif isinstance(value, datetime.datetime):
if value.tzinfo is not None:
raise ValueError("Cannot serialize datetime values with timezones. Either use a callable value for default or remove the timezone.")
return repr(value), set(["import datetime"])
# Dates
elif isinstance(value, datetime.date):
return repr(value), set(["import datetime"]) return repr(value), set(["import datetime"])
# Settings references # Settings references
elif isinstance(value, SettingsReference): elif isinstance(value, SettingsReference):

View File

@ -13,6 +13,7 @@ from django.conf import settings
from django.utils import six from django.utils import six
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.utils.timezone import get_default_timezone
class WriterTests(TestCase): class WriterTests(TestCase):
@ -78,6 +79,8 @@ class WriterTests(TestCase):
self.assertSerializedEqual(datetime.datetime.today) self.assertSerializedEqual(datetime.datetime.today)
self.assertSerializedEqual(datetime.date.today()) self.assertSerializedEqual(datetime.date.today())
self.assertSerializedEqual(datetime.date.today) self.assertSerializedEqual(datetime.date.today)
with self.assertRaises(ValueError):
self.assertSerializedEqual(datetime.datetime(2012, 1, 1, 1, 1, tzinfo=get_default_timezone()))
# Classes # Classes
validator = RegexValidator(message="hello") validator = RegexValidator(message="hello")
string, imports = MigrationWriter.serialize(validator) string, imports = MigrationWriter.serialize(validator)