My assumption is that an onvalidation callback has access to the 'fields' list as a local variable. (See code below.) Is that correct?
In pre-1.56 this worked, but in 1.56.1 it crashes with KeyError: 'id' -- leading me to think that myvalidator() is passed a 'fields' list that has ALL fields in the table, instead of the fields array that I passed to SQLFORM -- which I think is how it should be. Note that this is *not* mysql-related, it also occurs with sqlite. Cheers, -Peter # default.py def valtest(): pers = db(db.t2_person.id==t2.person_id).select()[0] fields = ['name','email','telnr','voornaam','achternaam','adres','postcode','plaats','land'] def myvalidator(form): for f in fields: if form.vars[f] =='': form.errors[f]='error' form=SQLFORM(db.t2_person,pers,fields=fields) if form.accepts(request.vars, session, onvalidation=lambda form: myvalidator(form)): redirect(URL(r=request,f='index')) return dict(form=form,p=p) # error ticket tail File "/Library/Python/2.5/site-packages/web2py-1.56.1/applications/ mijnmoem/controllers/default.py", line 104, in <lambda> if form.accepts(request.vars, session, onvalidation=lambda form: myvalidator(form)): File "/Library/Python/2.5/site-packages/web2py-1.56.1/applications/ mijnmoem/controllers/default.py", line 97, in valtest if form.vars[f] =='': form.errors[f]='error' KeyError: 'id' On Feb 8, 7:11 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > yes please run the mod. Email me personally if you could help me with > one more mysql test. > > For the fields issue. Sorry I do not understand. Could you send me a > longer example? > > Massimo > > On Feb 8, 11:53 am, Peter <peter.kleyn...@gmail.com> wrote: > > > So what is your advice, to run with your mod in sqlhtml.py for the > > time being...? > > > Btw, my other issue with 1.56.1 turns out not to be mysql-related. > > The following function is passed as a validator to my SQLFORM > > (slightly simplified): > > def myvalidator(form): > > for f in fields: > > if form.vars[f] =='': form.errors[f]='error' > > > form=SQLFORM(db.t2_person,pers,fields=fields) > > > if form.accepts(request.vars, session, onvalidation=lambda form: > > myvalidator(form)): > > > It appears that pre-1.56 the "fields" list in the onvalidation call > > included only the fields array as passed to SQLFORM, and in 1.56 it > > includes all fields in the database table? Is that possible? At any > > rate, I can repair this by explicitly specifying the fields to be > > validated in the validator function. > > > Cheers, > > -Peter > > > On Feb 8, 6:39 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > I think the problem is that in mysql > > > > db(...).update(..) > > > db(...).delete() > > > > do not seem to return the number of affected records.... > > > > Massimo > > > > On Feb 8, 11:27 am, Peter <peter.kleyn...@gmail.com> wrote: > > > > > Hi Massimo, > > > > > The printed values are " '9' 9L " in both cases. > > > > > Your first suggestion is ineffective, > > > > but the second one solves this problem: > > > > self.table._db(self.table.id==self.record.id).update(**fields) > > > > > I have another issue that seems to be mysql related, I'll post this > > > > separately. > > > > > -Peter > > > > > On Feb 8, 5:22 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > > > I am puzzled. Can you help me debug this? > > > > > > Can you replace in sqlhtml.py > > > > > > self.table[record_id] = fields > > > > > > with > > > > > print repr(record_id), repr(self.record.id) > > > > > self.table[self.record.id] = fields > > > > > > and if it still does not work with > > > > > > print repr(record_id), repr(self.record.id) > > > > > self.table._db > > > > > (self.table.id==self.record.id).update(**fields) > > > > > > Let me know what happens. > > > > > > Massimo > > > > > > On Feb 8, 7:23 am, Peter <peter.kleyn...@gmail.com> wrote: > > > > > > > Until now I was running trunk r660 with MySQL with few problems. > > > > > > With > > > > > > 1.56.1 a few new issues popped up. Code below works OK with 1.56.1 > > > > > > and > > > > > > sqlite, but not with MySQL. Sessions are on the file system (default > > > > > > settings), not in the DB. > > > > > > > If I submit the form without making any changes to it, I get a "no > > > > > > such record" error from sql.py (see error msg below). If I DO make > > > > > > any > > > > > > trivial change to field values in the form, it submits OK and is > > > > > > stored in the database. If I pass t2.person_id to SQLFORM instead of > > > > > > 'pers' , the result is the same. > > > > > > > Could this be some dependency on the old t2 module I still use? > > > > > > Cheers, > > > > > > -Peter > > > > > > > # default.py: > > > > > > def testmysql(): > > > > > > pers = db(db.t2_person.id==t2.person_id).select()[0] > > > > > > form = SQLFORM(db.t2_person,pers) > > > > > > if form.accepts(request.vars,session): > > > > > > redirect(URL(r=request,f='index')) > > > > > > return dict(form=form) > > > > > > > # db.py: > > > > > > db.define_table('t2_person', > > > > > > SQLField('name',length=40,label='MoemID',requires=IS_NOT_EMPTY > > > > > > (),unique=True), > > > > > > SQLField('password','password',requires=CRYPT()), > > > > > > SQLField('email',requires=IS_EMAIL()), > > > > > > SQLField('registration_key',length=64), > > > > > > SQLField('voornaam',default=''), > > > > > > SQLField('achternaam',default='',length=50), > > > > > > SQLField('adres',length=100,label='Straat en > > > > > > huisnr',default=''), > > > > > > SQLField('postcode',length=10,default=''), > > > > > > SQLField('plaats',length=50,default=''), > > > > > > SQLField('land',requires=IS_IN_SET > > > > > > ( COUNTRIES ),default='Nederland' ), > > > > > > SQLField('telnr',length=20,label=T('06-nummer'),default=''), > > > > > > SQLField('foto','upload',default=''), > > > > > > SQLField('wiebenik','text',label='Over jou', default=''), > > > > > > SQLField('created_by_ip',default='10.0.0.1'), > > > > > > SQLField('created_on','datetime',default="1900-01-01 00:00:00")) > > > > > > # validation business rules and widgets all disabled for this test > > > > > > > # error message: > > > > > > Traceback (most recent call last): > > > > > > File "/Library/Python/2.5/site-packages/web2py-1.56.1/gluon/ > > > > > > restricted.py", line 98, in restricted > > > > > > exec ccode in environment > > > > > > File > > > > > > "/Library/Python/2.5/site-packages/web2py-1.56.1/applications/ > > > > > > mijnmoem/controllers/default.py", line 296, in <module> > > > > > > File "/Library/Python/2.5/site-packages/web2py-1.56.1/gluon/ > > > > > > globals.py", line 74, in <lambda> > > > > > > self._caller = lambda f: f() > > > > > > File "/Applications/web2py.app/Contents/Resources/applications/ > > > > > > mijnmoem/modules/t2.py", line 1039, in h > > > > > > return f(*a,**b) > > > > > > File > > > > > > "/Library/Python/2.5/site-packages/web2py-1.56.1/applications/ > > > > > > mijnmoem/controllers/default.py", line 79, in testmysql > > > > > > if form.accepts(request.vars,session): > > > > > > File "/Library/Python/2.5/site-packages/web2py-1.56.1/gluon/ > > > > > > sqlhtml.py", line 529, in accepts > > > > > > self.table[record_id] = fields > > > > > > File > > > > > > "/Library/Python/2.5/site-packages/web2py-1.56.1/gluon/sql.py", > > > > > > line 982, in __setitem__ > > > > > > raise SyntaxError, 'No such record' > > > > > > SyntaxError: No such record --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---