From: Barry W. <ba...@py...> - 2005-01-08 22:27:14
|
Okay, here's what I've come up with to do conversions to/from Python datetimes. class DateTimeValidator(validators.DateValidator): def fromPython(self, value, state): return value.strftime('%Y-%m-%d %H:%M:%S') def toPython(self, value, state): stime =3D time.strptime(value, '%Y-%m-%d %H:%M:%S') secs =3D time.mktime(stime) return datetime.datetime.fromtimestamp(secs) class MySODateTimeCol(SODateTimeCol): def __init__(self, **kw): SODateTimeCol.__init__(self, **kw) self.validator =3D validators.All.join( DateTimeValidator(), self.validator) class MyDateTimeCol(Col): baseClass =3D MySODateTimeCol This seems to work fine and I can live with it, but I had one thing that confused me, probably because I still don't fully grok how the validators and converters work. If I omit DateTimeValidator.fromPython(), then I get a traceback when I try to set a MyDateTimeCol. For example: class Notice(sqlobject.SQLObject): retrieved =3D MyDateTimeCol() text =3D StringCol() # later now =3D datetime.datetime.now() notice.set(text=3Dtext, retrieved=3Dnow) # ...traceback... File "/home/barry/projects/replybot/botlib/reply.py", line 36, in get_res= ponse notice.set(text=3Dtext, retrieved=3Dnow) File "/home/barry/projects/SQLObject/sqlobject/main.py", line 817, in set value =3D toPython(dbValue, self._SO_validatorState) File "/home/barry/projects/replybot/botlib/database.py", line 23, in toPy= thon stime =3D time.strptime(value, '%Y-%m-%d %H:%M:%S') File "/usr/local/lib/python2.4/_strptime.py", line 290, in strptime found =3D format_regex.match(data_string) TypeError: expected string or buffer This happens because main.py is finding a fromPython() that returns the datetime object unconverted, so when set() turns around and calls toPython on the value returned by fromPython, my fromPython gets a datetime when it only expected a string. I'm not sure if it's expected that validators.DateValidator.fromPython() should always return a string or not, but if I add that in my subclass, it seems like everything works. Anyway, there's the code FWIW. -Barry |