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
--
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/pylons-discuss?hl=en.