Author: phd
Date: 2005-10-18 14:53:04 +0000 (Tue, 18 Oct 2005)
New Revision: 1121
Modified:
SQLObject/branches/0.7-bugfix/sqlobject/col.py
SQLObject/branches/0.7-bugfix/sqlobject/converters.py
SQLObject/branches/0.7-bugfix/sqlobject/tests/test_datetime.py
Log:
Merged a patch from the revision 1120 from the trunk: added TimeCol and tests; a number of enhancements in date/time validators.
Modified: SQLObject/branches/0.7-bugfix/sqlobject/col.py
===================================================================
--- SQLObject/branches/0.7-bugfix/sqlobject/col.py 2005-10-18 14:52:21 UTC (rev 1120)
+++ SQLObject/branches/0.7-bugfix/sqlobject/col.py 2005-10-18 14:53:04 UTC (rev 1121)
@@ -60,6 +60,7 @@
if mxdatetime_available:
DateTimeType = type(DateTime.now())
+ TimeType = type(DateTime.Time())
if datetime_available:
default_datetime_implementation = DATETIME_IMPLEMENTATION
@@ -829,27 +830,33 @@
def to_python(self, value, state):
if value is None:
return None
- if isinstance(value, (datetime.date, datetime.datetime, sqlbuilder.SQLExpression)):
+ if isinstance(value, (datetime.datetime, datetime.date, datetime.time, sqlbuilder.SQLExpression)):
return value
- if mxdatetime_available and isinstance(value, DateTimeType):
- # convert mxDateTime instance to datetime
- if (self.format.find("%H") >= 0) or (self.format.find("%T")) >= 0:
- return datetime.datetime(value.year, value.month, value.day,
- value.hour, value.minute, int(value.second))
- else:
- return datetime.date(value.year, value.month, value.day)
+ if mxdatetime_available:
+ if isinstance(value, DateTimeType):
+ # convert mxDateTime instance to datetime
+ if (self.format.find("%H") >= 0) or (self.format.find("%T")) >= 0:
+ return datetime.datetime(value.year, value.month, value.day,
+ value.hour, value.minute, int(value.second))
+ else:
+ return datetime.date(value.year, value.month, value.day)
+ elif isinstance(value, TimeType):
+ # convert mxTime instance to time
+ if self.format.find("%d") >= 0:
+ return datetime.timedelta(seconds=value.seconds)
+ else:
+ return datetime.time(value.hour, value.minute, int(value.second))
try:
stime = time.strptime(value, self.format)
except:
raise validators.Invalid("expected an date/time string of the '%s' format in the DateTimeCol '%s', got %s %r instead" % \
(self.format, self.name, type(value), value), value, state)
- secs = time.mktime(stime)
- return datetime.datetime.fromtimestamp(secs)
+ return datetime.datetime(*stime[:7])
def from_python(self, value, state):
if value is None:
return None
- if isinstance(value, (datetime.date, datetime.datetime, sqlbuilder.SQLExpression)):
+ if isinstance(value, (datetime.datetime, datetime.date, datetime.time, sqlbuilder.SQLExpression)):
return value
if hasattr(value, "strftime"):
return value.strftime(self.format)
@@ -861,7 +868,7 @@
def to_python(self, value, state):
if value is None:
return None
- if isinstance(value, (DateTimeType, sqlbuilder.SQLExpression)):
+ if isinstance(value, (DateTimeType, TimeType, sqlbuilder.SQLExpression)):
return value
if datetime_available: # convert datetime instance to mxDateTime
if isinstance(value, datetime.datetime):
@@ -869,6 +876,8 @@
value.hour, value.minute, value.second)
elif isinstance(value, datetime.date):
return DateTime.Date(value.year, value.month, value.day)
+ elif isinstance(value, datetime.time):
+ return DateTime.Time(value.hour, value.minute, value.second)
try:
stime = time.strptime(value, self.format)
except:
@@ -879,7 +888,7 @@
def from_python(self, value, state):
if value is None:
return None
- if isinstance(value, (DateTimeType, sqlbuilder.SQLExpression)):
+ if isinstance(value, (DateTimeType, TimeType, sqlbuilder.SQLExpression)):
return value
if hasattr(value, "strftime"):
return value.strftime(self.format)
@@ -940,9 +949,11 @@
if datetime_available:
class DateValidator(DateTimeValidator):
def to_python(self, value, state):
+ if isinstance(value, datetime.date):
+ return value
value = super(DateValidator, self).to_python(value, state)
if isinstance(value, datetime.datetime):
- value = datetime.date(value.year, value.month, value.day)
+ value = value.date()
return value
from_python = to_python
@@ -988,6 +999,57 @@
baseClass = SODateCol
+if datetime_available:
+ class TimeValidator(DateTimeValidator):
+ def to_python(self, value, state):
+ if isinstance(value, datetime.time):
+ return value
+ value = super(TimeValidator, self).to_python(value, state)
+ if isinstance(value, datetime.datetime):
+ value = value.time()
+ return value
+
+class SOTimeCol(SOCol):
+ timeFormat = '%H:%M:%S'
+
+ def __init__(self, **kw):
+ timeFormat = popKey(kw, 'timeFormat')
+ if timeFormat:
+ self.timeFormat = timeFormat
+ SOCol.__init__(self, **kw)
+
+ def createValidators(self):
+ _validators = super(SOTimeCol, self).createValidators()
+ if default_datetime_implementation == DATETIME_IMPLEMENTATION:
+ validatorClass = TimeValidator
+ elif default_datetime_implementation == MXDATETIME_IMPLEMENTATION:
+ validatorClass = MXDateTimeValidator
+ if default_datetime_implementation:
+ _validators.insert(0, validatorClass(name=self.name, format=self.timeFormat))
+ return _validators
+
+ def _mysqlType(self):
+ return 'TIME'
+
+ def _postgresType(self):
+ return 'TIME'
+
+ def _sybaseType(self):
+ return 'TIME'
+
+ def _sqliteType(self):
+ return 'TIME'
+
+ def _firebirdType(self):
+ return 'TIME'
+
+ def _maxdbType(self):
+ return 'TIME'
+
+class TimeCol(Col):
+ baseClass = SOTimeCol
+
+
class SODecimalCol(SOCol):
def __init__(self, **kw):
Modified: SQLObject/branches/0.7-bugfix/sqlobject/converters.py
===================================================================
--- SQLObject/branches/0.7-bugfix/sqlobject/converters.py 2005-10-18 14:52:21 UTC (rev 1120)
+++ SQLObject/branches/0.7-bugfix/sqlobject/converters.py 2005-10-18 14:53:04 UTC (rev 1121)
@@ -3,15 +3,17 @@
try:
import mx.DateTime.ISO
origISOStr = mx.DateTime.ISO.strGMT
- from mx.DateTime import DateTimeType
+ from mx.DateTime import DateTimeType, DateTimeDeltaType
except ImportError:
try:
import DateTime.ISO
origISOStr = DateTime.ISO.strGMT
- from DateTime import DateTimeType
+ from DateTime import DateTimeType, DateTimeDeltaType
except ImportError:
origISOStr = None
DateTimeType = None
+ DateTimeDeltaType = None
+
import time
try:
import datetime
@@ -163,6 +165,11 @@
registerConverter(DateTimeType, DateTimeConverter)
+ def TimeConverter(value, db):
+ return "'%s'" % value.strftime("%T")
+
+ registerConverter(DateTimeDeltaType, TimeConverter)
+
def NoneConverter(value, db):
return "NULL"
Modified: SQLObject/branches/0.7-bugfix/sqlobject/tests/test_datetime.py
===================================================================
--- SQLObject/branches/0.7-bugfix/sqlobject/tests/test_datetime.py 2005-10-18 14:52:21 UTC (rev 1120)
+++ SQLObject/branches/0.7-bugfix/sqlobject/tests/test_datetime.py 2005-10-18 14:53:04 UTC (rev 1121)
@@ -8,18 +8,18 @@
if datetime_available:
col.default_datetime_implementation = DATETIME_IMPLEMENTATION
- from datetime import date, datetime
- now = datetime.now
+ from datetime import datetime, date, time
class DateTime1(SQLObject):
col1 = DateTimeCol()
col2 = DateCol()
+ col3 = TimeCol()
def test_dateTime():
setupClass(DateTime1)
- _now = now()
+ _now = datetime.now()
_today = date.today()
- dt1 = DateTime1(col1=_now, col2=_today)
+ dt1 = DateTime1(col1=_now, col2=_today, col3=_now.time())
assert isinstance(dt1.col1, datetime)
assert dt1.col1.year == _now.year
@@ -34,19 +34,25 @@
assert dt1.col2.month == _today.month
assert dt1.col2.day == _today.day
+ assert isinstance(dt1.col3, time)
+ assert dt1.col3.hour == _now.hour
+ assert dt1.col3.minute == _now.minute
+ assert dt1.col3.second == int(_now.second)
+
if mxdatetime_available:
col.default_datetime_implementation = MXDATETIME_IMPLEMENTATION
- from mx.DateTime import now
+ from mx.DateTime import now, Time
class DateTime2(SQLObject):
col1 = DateTimeCol()
col2 = DateCol(dateFormat="%Y-%m-%d %H:%M:%S")
# mxDateTime does not have a separate date type
+ col3 = TimeCol()
def test_mxDateTime():
setupClass(DateTime2)
_now = now()
- dt2 = DateTime2(col1=_now, col2=_now)
+ dt2 = DateTime2(col1=_now, col2=_now, col3=Time(_now.hour, _now.minute, int(_now.second)))
assert isinstance(dt2.col1, col.DateTimeType)
assert dt2.col1.year == _now.year
@@ -63,3 +69,8 @@
assert dt2.col1.hour == _now.hour
assert dt2.col1.minute == _now.minute
assert dt2.col1.second == int(_now.second)
+
+ assert isinstance(dt2.col3, (col.DateTimeType, col.TimeType))
+ assert dt2.col3.hour == _now.hour
+ assert dt2.col3.minute == _now.minute
+ assert dt2.col3.second == int(_now.second)
|