Skip to content

Instantly share code, notes, and snippets.

@smcoll
Created January 13, 2014 18:55
Show Gist options
  • Save smcoll/8405914 to your computer and use it in GitHub Desktop.
Save smcoll/8405914 to your computer and use it in GitHub Desktop.
Django ModelField for timezone-naive datetimes
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