Hey,

There are quite a few bugs in SQLFORM when having a field of type 'list' (so 
'list:string', 'list:integer'). First one being when you submit and form and 
there are error's with other fields.

def error_form():
                form = SQLFORM(
                                Field('string', 'string'),
                                Field('list', 'list:string'))

                if form.accepts(request.vars, session, 
onvalidation=_force_string_error):
                                pass

                return dict(form=form)

def _force_string_error(form):
                form.errors.string = "blah blah"

Submitting this form with list being one entry equal to "abc" (so one box, no 
empty box after) will cause on return "abc" being iterated and each value going 
into its own box (so three boxes for list on the form).

I do have a solution for this, it involves modifying gluon/sqlhtml.py (fixes 
involve latest web2py download). The following code can be added after line 
1061:

for fieldname in self.vars:
field = self.table[fieldname]
value = self.vars[fieldname]
if field.type.startswith('list:') and not isinstance(field, (tuple, list)):
self.vars[fieldname] = value and [value] or []

Or in the controller we could have the following:

def error_form():
                form = SQLFORM(
                                Field('string', 'string'),
                                Field('list', 'list:string'))

                if form.accepts(request.vars, session, 
onvalidation=_force_string_error):
                                pass
                elif form.errors:
                                if not isinstance(form.vars['list'], (tuple, 
list)):
                                                form.vars['list'] = 
form.vars['list'] and [form.vars['list']] or []

                return dict(form=form)

The second bug is you cannot set form.errors for a field with type list. I do 
not have a web2py fix for this but I do the following:

def error_form():
                form = SQLFORM(
                                Field('string', 'string'),
                                Field('list', 'list:string'))

                if form.accepts(request.vars, session, 
onvalidation=[_force_string_error, _force_list_error]):
                                pass
                elif form.errors:
                                if not isinstance(form.vars['list'], (tuple, 
list)):
                                                form.vars['list'] = 
form.vars['list'] and [form.vars['list']] or []
                                if form.errors.haskey('list'):
                                                
form.element(_id='no_table_list__row')[1].append(DIV(form.errors.list, 
_class='error'))

                return dict(form=form)

def _force_list_error(form):
                form.errors.list = "blah blah"

Looking to see what Massimo thinks, and also what the rest of the community 
think and/or if you have encountered this issue yourself.

-Eric

This communication, including any attachments, does not necessarily represent 
official policy of Seccuris Inc.
Please see http://www.seccuris.com/Contact-PrivacyPolicy.htm  for further 
details about Seccuris Inc.'s Privacy Policy.
If you have received this communication in error, please notify Seccuris Inc. 
at i...@seccuris.com or at 1-866-644-8442.

Reply via email to