You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.8 KiB
53 lines
1.8 KiB
#
|
|
# Get from https://github.com/Niklas9/django-unixdatetimefield
|
|
#
|
|
import datetime
|
|
import time
|
|
|
|
import django.db.models as models
|
|
|
|
|
|
class UnixDateTimeField(models.DateTimeField):
|
|
|
|
# TODO(niklas9):
|
|
# * should we take care of transforming between time zones in any way here ?
|
|
# * get default datetime format from settings ?
|
|
DEFAULT_DATETIME_FMT = '%Y-%m-%d %H:%M:%S'
|
|
TZ_CONST = '+'
|
|
# TODO(niklas9):
|
|
# * metaclass below just for Django < 1.9, fix a if stmt for it?
|
|
#__metaclass__ = models.SubfieldBase
|
|
description = "Unix timestamp integer to datetime object"
|
|
|
|
def get_internal_type(self):
|
|
return 'PositiveIntegerField'
|
|
|
|
def to_python(self, val):
|
|
if val is None or isinstance(val, datetime.datetime):
|
|
return val
|
|
if isinstance(val, datetime.date):
|
|
return datetime.datetime(val.year, val.month, val.day)
|
|
elif self._is_string(val):
|
|
# TODO(niklas9):
|
|
# * not addressing time zone support as todo above for now
|
|
if self.TZ_CONST in val:
|
|
val = val.split(self.TZ_CONST)[0]
|
|
return datetime.datetime.strptime(val, self.DEFAULT_DATETIME_FMT)
|
|
else:
|
|
return datetime.datetime.fromtimestamp(float(val))
|
|
|
|
def _is_string(value, val):
|
|
return isinstance(val, str)
|
|
|
|
def get_db_prep_value(self, val, *args, **kwargs):
|
|
if val is None:
|
|
if self.default == models.fields.NOT_PROVIDED: return None
|
|
return self.default
|
|
return int(time.mktime(val.timetuple()))
|
|
|
|
def value_to_string(self, obj):
|
|
val = self._get_val_from_obj(obj)
|
|
return self.to_python(val).strftime(self.DEFAULT_DATETIME_FMT)
|
|
|
|
def from_db_value(self, val, expression, connection, context):
|
|
return self.to_python(val)
|