Thank you.
On Mar 1, 12:09 pm, Massimo Di Pierro <massimo.dipie...@gmail.com> wrote: > These two statements are incompatible: > > Field('status', 'list:string'), > .... > db.buckslips.status.requires = IS_IN_SET(...., multiple=False) > > If status is a list of strings you must allow multiple elements in the > list. So: > > Field('status', 'string'), > .... > db.buckslips.status.requires = IS_IN_SET(...., multiple=False) > > or > > Field('status', 'list:string'), > .... > db.buckslips.status.requires = IS_IN_SET(...., multiple=True) > > > > > > > > On Thursday, 1 March 2012 10:56:03 UTC-6, Cliff wrote: > > > Massimo, > > > Thank you. > > > As always, if I'm doing something wrong I would be delighted to know > > it. > > > From the limited checking I have been able to do, I think the problem > > is in the SELECT helper, not in the validator. > > > Anyway, here's the code. > > > ## model > > db.define_table('buckslip_types', > > Field('name', length=32), > > ) > > > db.define_table('buckslips', > > Field('type', db.buckslip_types), > > Field('status', 'list:string'), > > Field('date_received', 'datetime'), > > Field('date_approved', 'datetime'), > > Field('date_posted', 'datetime'), > > Field('comments', 'text'), > > Field('document_filename', length=256), > > Field('document','upload') > > ) > > db.buckslips.type.requires = IS_IN_DB(db, 'buckslip_types.id', > > '%(name)s', zero=None) > > db.buckslips.status.requires = IS_IN_SET(['received', 'approved', > > 'disapproved', 'posted'], > > multiple=False > > ) > > > ## controller buckslips.py > > def edit(): > > record = db.buckslips(request.args[-1]) or redirect(URL('index')) > > url = URL('download') > > > db.buckslips.document.writable = False > > # db.buckslips.status.widget = my_select_widget > > fields=['date_received', 'status', 'document', 'comments'] > > > form = SQLFORM(db.buckslips, record, deletable=False, > > upload=url, fields=fields, > > ) > > > if request.vars.document!=None: > > form.vars.document_filename= request.vars.document.filename > > if form.process().accepted: > > response.flash = 'form accepted' > > elif form.errors: > > response.flash = 'form has errors' > > > return dict(form=form) > > > On Mar 1, 11:26 am, Massimo Di Pierro <massimo.dipie...@gmail.com> > > wrote: > > > Can you provide an example of IS_IN_SET not working so we can fix it? By > > > the way, there was a change in IS_IN_SET in trunk and that may have > > fixed > > > your problem. > > > > On Thursday, 1 March 2012 09:05:51 UTC-6, Cliff wrote: > > > > > Running 1.99.4 > > > > > I have not been able to get the IS_IN_SET validator to work properly. > > > > I don't know why this should be. > > > > > When used with SQLFORM to edit a record, the select field refuses to > > > > show the current value of the field. Instead it shows the first value > > > > in the list or the zero value for the field. > > > > > So I made an alternative widget. The code consists of two functions, > > > > below. > > > > > If you are having similar problems, feel free to use it. > > > > > The _style definition at the end of the call is there to make sure I > > > > was seeing my widget instead of the default. It is not necessary for > > > > the widget to work. > > > > > ############################################################ > > > > > def is_it_selected(current_value, option, multiple): > > > > if len(current_value) == 1 or not multiple: > > > > current_value=current_value[0] > > > > if current_value==option: > > > > out = 'selected' > > > > else: > > > > out = None > > > > else: > > > > if option in current_value: > > > > out='selected' > > > > else: > > > > out=None > > > > return out > > > > > def my_select_widget(field,value): > > > > # diagnostics uncomment to learn > > > > #print 'value' > > > > #print value > > > > #print 'type(value)' > > > > #print type(value) > > > > > f = str(field) > > > > f_name = f.split('.')[-1] > > > > f_id = f.replace('.', '_') > > > > f_requires = db[request.controller][f_name].requires > > > > the_set = f_requires.theset > > > > the_multiple = f_requires.multiple > > > > option_set = [] > > > > for t in the_set: > > > > is_selected = is_it_selected(value, t, the_multiple) > > > > option_set.append(OPTION(t, _selected = is_selected)) > > > > return SELECT(option_set, _name='status', _id='buckslips_status', > > > > _style='color:red;' > > > > )