import datetime
from django.db import models
from django.db.backends.mysql.base import django_conversions
from django.conf import settings
from MySQLdb.constants import FIELD_TYPE
django_conversions.update({FIELD_TYPE.TIME: None})
SECONDS_PER_MIN = 60
SECONDS_PER_HOUR = SECONDS_PER_MIN * 60
SECONDS_PER_DAY = SECONDS_PER_HOUR * 24
class TimeAsTimeDeltaField(models.Field):
"""
Custom field for mapping TIME columns to timedelta values, not times,
so that we can store values greater than 24 hours.
See ticket #354 and http://docs.djangoproject.com/en/1.0/howto/custom-model-fields/#howto-custom-model-fields
"""
__metaclass__ = models.SubfieldBase
def db_type(self):
return 'time'
def to_python(self, value):
if value is None:
return None
if isinstance(value, datetime.timedelta):
return value
hours, minutes, seconds = map(int, value.split(':'))
total_seconds = seconds + (60 * (minutes + (60 * hours)))
result = datetime.timedelta(seconds=total_seconds)
return result
def get_db_prep_value(self, value):
if not value:
return None
total_seconds = value.seconds + (value.days * SECONDS_PER_DAY)
return '%02i:%02i:%02i' % (
total_seconds / SECONDS_PER_HOUR, # hours
total_seconds / SECONDS_PER_MIN - total_seconds / SECONDS_PER_HOUR * 60, # minutes - Total seconds subtract the used hours
total_seconds % SECONDS_PER_MIN # seconds
)
Comments