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
-~----------~----~----~----~------~----~------~--~---

Reply via email to