I'm resubmitting as this has not been fixed. I understand the problem better and have a workaround.
My application runs on GAE and has been stuck on 2.9.12.
Runs fine in web2py test environment and with 2.9.12 (pre pyDAL)
In both production and SDK GAE various pages fail.
This failure relates to using a set in a validator:
...
banks = db(db.CoA.Type == 'Bank')
form=SQLFORM.factory(
Field('bank', 'reference CoA', requires=IS_EMPTY_OR(IS_IN_DB(banks, 'CoA.id','%(Name)s'))),
...
In the model:
db.define_table('CoA',
Field('Type', 'string', default='Expense', requires = IS_IN_SET(['Bank', 'Asset/Liability', 'Revenue/Expense'])),
Field('Name', 'string', unique = True),
Field('Balance', 'decimal(9,2)'), #used to maintain PayPal and Bank balances
Field('Notes', 'text'),
format='%(Name)s')
db.CoA.Name.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db, 'CoA.Name')]
GAE SDK log error attached.
Note IS_IN_DB works fine with IS_IN_SET(db, ...) - I use it all over the place.
In validators.py line 584 is in an if...else construct that tries to check for 'gae'. This test is wrong, the adapter name would be 'google:datastore' which would run the else clause. I tried this and established that the else clause also fails. It looks to me as if this historical work around in validators.py is broken, quite apart from how to fix the test. Perhaps the implementation of 'set' can be changed to be agnostic?
The workaround for me was to use IS_IN_SET instead:
...
banks = []
coa = db(
db.CoA.id > 0).select(orderby=
db.CoA.Name)
for c in coa:
if c.Type == 'Bank':
banks.append((
c.id, c.Name))
...
form=SQLFORM.factory(
Field('bank', 'reference CoA', requires=IS_EMPTY_OR(IS_IN_SET(banks))),
...