Question on serializing null date field using below packages.

56 views
Skip to first unread message

Clemens Herschel

unread,
Aug 26, 2012, 5:33:02 PM8/26/12
to pylons-...@googlegroups.com


Pyramid 1.3a4
colander 0.9.5
deform 0.9.5
SQLalchemy 0.7.3
SQLite 3.7.9

In below code snippet, entering date in first record, subsequent edits
work fine.
If no value is entered though, a python None is required in date field.
On subsequent edits of row , a colander.Invalid occurs
Invalid: {'travel_dt':u'"None" is not a date object'}

If assign colander.null to risk.travel_dt, an error occurs before
rendering.
a sqlalchemy.exc.StatementError occurs:
StatementError: SQLite Date type only accepts Python date objects as input
TypeError:Sqlite Date type only
'UPDATE risk SET travel_dt=? WHERE risk.id = ?' [{'travel_dt':
<colander.null>, u'risk_id': 1}]


from time import gmtime, strftime
from pyramid.view import view_config
from pyramid.httpexceptions import HTTPFound
import colander
import deform
from peppercorn import parse
import transaction
from deform.widget import DateInputWidget
from sqlalchemy import func
from pyramid.response import Response
from datetime import datetime
from phr.models import (
DBSession,
Risk,
)
class Schema(colander.MappingSchema):
travel_dt = colander.SchemaNode(
colander.Date(),
widget=DateInputWidget(),
missing=unicode(''),
title = 'last travel Date outside US',
description='Enter date you last travelled outside US')
dbsession = DBSession()
risk = Risk()
schema = Schema()

@view_config(route_name='soc_history.add_edit',
renderer='phr:templates/addform.mak')
def add_edit(request):
risk = Risk()
if request.session['ptntid'] <> None:
ptntid = request.session['ptntid']
cnt = dbsession.query(func.count(Risk.ptntid)).scalar()
if cnt == 0:
risk_form = deform.Form(schema, buttons=('submit',))
if 'submit' in request.POST:
controls = request.POST.items()
try:
appstruct = risk_form.validate(controls)
except deform.ValidationFailure, e:
return {'form':e.render()}
for key, value in request.POST.items():
setattr(risk, key, value)
dtascii = risk.travel_dt.encode('ascii')
if dtascii <> '':
date_object = datetime.strptime(dtascii, '%Y-%m-%d')
risk.travel_dt = date_object
else:
risk.travel_dt = None
risk.ptntid = ptntid
risk.id = None
dbsession.add(risk)
transaction.commit()
return HTTPFound(location = '/entry')
return {'form':risk_form.render()}
if cnt == 1:
risk = dbsession.query(Risk).filter_by(ptntid=ptntid).one()
risk_form = deform.Form(schema, buttons=('submit',))
if 'submit' in request.POST:
controls = request.POST.items()
try:
appstruct = risk_form.validate(controls)
except deform.ValidationFailure, e:
return {'form':e.render()}
for key, value in request.POST.items():
setattr(risk, key, value)
controls = request.POST.items()
fieldict = parse(controls)
pv_dt = fieldict['travel_dt']
dtascii = pv_dt.encode('ascii')
if dtascii <> '':
date_object = datetime.strptime(dtascii, '%Y-%m-%d')
risk.travel_dt = date_object
else:
risk.travel_dt = None
transaction.commit()
return HTTPFound(location = '/entry')
###2 lines to uncomment for attempt to fix colander error.
#if risk.travel_dt==None:
# risk.travel_dt = colander.null

appstruct ={
'travel_dt':risk.travel_dt,
}
return {'form':risk_form.render(appstruct)}

else:
return HTTPFound(location = '/welcome')


This has been driving me crazy. Thanks for any help.

Clemens Herschel

Reply all
Reply to author
Forward
0 new messages