Created
January 13, 2014 18:55
-
-
Save smcoll/8405914 to your computer and use it in GitHub Desktop.
Django ModelField for timezone-naive datetimes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
from django.core import exceptions | |
from django.db.models import DateTimeField | |
from django.utils.dateparse import parse_date, parse_datetime | |
from django.utils.translation import ugettext_lazy as _ | |
from south.modelsinspector import add_introspection_rules | |
add_introspection_rules([], ["^myproject\.myapp\.fields\.NaiveDateTimeField"]) | |
class NaiveDateTimeField(DateTimeField): | |
""" DateTimeField implementation which is explicitly timezone-naive. | |
Note: | |
- only tested for Postgres backend | |
TODO: perhaps update default_error_messages to remove TZ info | |
TODO: test support for other database backends | |
""" | |
description = _("Timezone-naive date (with time)") | |
def to_python(self, value): | |
if value is None: | |
return value | |
if isinstance(value, datetime.datetime): | |
return value | |
if isinstance(value, datetime.date): | |
return datetime.datetime(value.year, value.month, value.day) | |
try: | |
parsed = parse_datetime(value) | |
if parsed is not None: | |
return parsed | |
except ValueError: | |
raise exceptions.ValidationError( | |
self.error_messages['invalid_datetime'], | |
code='invalid_datetime', | |
params={'value': value}, | |
) | |
try: | |
parsed = parse_date(value) | |
if parsed is not None: | |
return datetime.datetime(parsed.year, parsed.month, parsed.day) | |
except ValueError: | |
raise exceptions.ValidationError( | |
self.error_messages['invalid_date'], | |
code='invalid_date', | |
params={'value': value}, | |
) | |
raise exceptions.ValidationError( | |
self.error_messages['invalid'], | |
code='invalid', | |
params={'value': value}, | |
) | |
def db_type(self, connection): | |
if connection.settings_dict['ENGINE'] == 'django.db.backends.mysql': | |
return 'datetime' | |
else: | |
return 'timestamp' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment