Yes, you can always set your own widgets -- there are defaults, but you can change them. See http://web2py.com/book/default/chapter/07#Widgets.
On Wednesday, June 22, 2011 5:05:58 PM UTC-4, Richard wrote: > FINALLY! > > Thank you Anthony... > > Now works perfectly... > > With this syntax : > > db.ref_tregistry.fnaregistry_id.requires =\ > [IS_EMPTY_OR(IS_IN_DB(db,'table.field1')), > ONLY_ONE_CAN_BE_FILLED([request.vars.field2],error_message='Select a > volume or an folder')] > > It was drive me nuts to rewrite the IS_IN_DB to include my > ONLY_ONE_CAN_BE_FILLED() validator... I was thinking hmm... What will I have > to do with all the other validator... ;-) > > Regards > > Richard > > > > On Wed, Jun 22, 2011 at 4:38 PM, Anthony <[email protected]> wrote: > >> How about you just do this somewhere: >> >> db.table.field1.widget=SQLFORM.widgets.options.widget >> >> or >> >> db.define_table('table', Field('field', requires=..., >> widget=SQLFORM.widgets.options.widget)) >> >> Does that bring the drop-down back to your field? >> >> Anthony >> >> On Wednesday, June 22, 2011 4:07:22 PM UTC-4, Richard wrote: >> >>> I try to hack a bit with IS_IN_DB to include a "ornull=" option that >>> give this : >>> >>> class IS_IN_DB_DEV_ORNULL(): >>> """ >>> example:: >>> >>> INPUT(_type='text', _name='name', >>> requires=IS_IN_DB(db, db.mytable.myfield, zero='')) >>> >>> used for reference fields, rendered as a dropbox >>> """ >>> >>> def __init__( >>> self, >>> dbset, >>> field, >>> label=None, >>> error_message='value not in database', >>> orderby=None, >>> groupby=None, >>> cache=None, >>> multiple=False, >>> zero='', >>> sort=False, >>> _and=None, >>> ornull=None, >>> null=None, >>> ): >>> from dal import Table >>> if isinstance(field,Table): field = field._id >>> >>> if hasattr(dbset, 'define_table'): >>> self.dbset = dbset() >>> else: >>> self.dbset = dbset >>> self.field = field >>> (ktable, kfield) = str(self.field).split('.') >>> if not label: >>> label = '%%(%s)s' % kfield >>> if isinstance(label,str): >>> if regex1.match(str(label)): >>> label = '%%(%s)s' % str(label).split('.')[-1] >>> ks = regex2.findall(label) >>> if not kfield in ks: >>> ks += [kfield] >>> fields = ks >>> else: >>> ks = [kfield] >>> fields = 'all' >>> self.fields = fields >>> self.label = label >>> self.ktable = ktable >>> self.kfield = kfield >>> self.ks = ks >>> self.error_message = error_message >>> self.theset = None >>> self.orderby = orderby >>> self.groupby = groupby >>> self.cache = cache >>> self.multiple = multiple >>> self.zero = zero >>> self.sort = sort >>> self._and = _and >>> self.ornull = ornull >>> self.null = null >>> >>> def set_self_id(self, id): >>> if self._and: >>> self._and.record_id = id >>> >>> def build_set(self): >>> if self.fields == 'all': >>> fields = [f for f in self.dbset.db[self.ktable]] >>> else: >>> fields = [self.dbset.db[self.ktable][k] for k in self.fields] >>> if self.dbset.db._dbname != 'gae': >>> orderby = self.orderby or reduce(lambda a,b:a|b,fields) >>> groupby = self.groupby >>> dd = dict(orderby=orderby, groupby=groupby, cache=self.cache) >>> records = self.dbset.select(*fields, **dd) >>> else: >>> orderby = self.orderby or reduce(lambda a,b:a|b,(f for f in >>> fields if not f.name=='id')) >>> dd = dict(orderby=orderby, cache=self.cache) >>> records = self.dbset.select(self.dbset.**db[self.ktable].ALL, >>> **dd) >>> self.theset = [str(r[self.kfield]) for r in records] >>> if isinstance(self.label,str): >>> self.labels = [self.label % dict(r) for r in records] >>> else: >>> self.labels = [self.label(r) for r in records] >>> >>> def options(self): >>> self.build_set() >>> items = [(k, self.labels[i]) for (i, k) in >>> enumerate(self.theset)] >>> if self.sort: >>> items.sort(options_sorter) >>> if self.zero != None and not self.multiple: >>> items.insert(0,('',self.zero)) >>> return items >>> >>> def __call__(self, value): >>> unused_value, empty = is_empty(value) >>> """if self.multiple: >>> if isinstance(value,list): >>> values=value >>> elif value: >>> values = [value] >>> else: >>> values = [] >>> if isinstance(self.multiple,(**tuple,list)) and \ >>> not self.multiple[0]<=len(values)<** >>> self.multiple[1]: >>> return (values, translate(self.error_message)) >>> if not [x for x in values if not x in self.theset]: >>> return (values, None) >>> elif self.theset: >>> if value in self.theset: >>> if self._and: >>> return self._and(value) >>> else: >>> return (value, None)""" >>> if self.ornull: >>> if self.multiple: >>> if isinstance(value,list): >>> values=value >>> elif value: >>> values = [value] >>> else: >>> values = [] >>> if isinstance(self.multiple,(**tuple,list)) and \ >>> not self.multiple[0]<=len(values)<** >>> self.multiple[1]: >>> return (values, translate(self.error_message)) >>> if not [x for x in values if not x in self.theset]: >>> return (values, None) >>> elif self.theset: >>> if value in self.theset: >>> if self._and: >>> return self._and(value) >>> else: >>> return (value, None) >>> if empty: >>> return (self.null, None) >>> else: >>> (ktable, kfield) = str(self.field).split('.') >>> field = self.dbset.db[ktable][kfield] >>> if self.dbset(field == value).count(): >>> if self._and: >>> return self._and(value) >>> else: >>> return (value, None) >>> return (value, translate(self.error_message)) >>> >>> >>> But I am still stock with the NULL in both field that goes trought the >>> database overriding my ONLY_ONE_CAN_BE_FILLED() validator... >>> >>> I also try to add a _and= option to my ONLY_ONE_CAN_BE_FILLED() >>> validator, but remove the dropbox... >>> >>> The only solution that I can see now is to merge IS_IN_DB >>> with ONLY_ONE_CAN_BE_FILLED() that is not going to be really DRY... >>> >>> If someone can see an other solution, I am really open to the idea... >>> >>> Richard >>> >>> >>> On Wed, Jun 22, 2011 at 10:31 AM, Richard Vézina <[email protected]>wrote: >>> >>>> Hello Anthony, >>>> >>>> The "_and=" works perfectly and bring back the dropbox, but as you >>>> mention, not all the logic of the validator that I pass in the _and= >>>> option >>>> is working... The IS_EMPTY_OR is overriding the >>>> >>>> Here the proper syntax to get the dropbox : >>>> >>>> db.table.field1.requires =\ >>>> IS_EMPTY_OR(IS_IN_DB(db,'**table.field1'), >>>> >>>> _and=ONLY_ONE_CAN_BE_FILLED([**request.vars.field2],error_**message='Select >>>> >>>> only one'))) >>>> >>>> I try to remove the IS_EMPTY_OR, but as expected the >>>> IS_IN_DB prevent insertion of a null... >>>> >>>> Don't know what the best option to make it works properly... >>>> >>>> Adding option to IS_EMPTY_OR() to allow inter independency with >>>> my ONLY_ONE_CAN_BE_FILLED() or make a _and= option to >>>> my ONLY_ONE_CAN_BE_FILLED() to make it works with IS_IN_DB?? >>>> >>>> Richard >>>> >>>> On Tue, Jun 21, 2011 at 9:11 PM, Richard Vézina <[email protected]>wrote: >>>> >>>>> Great thanks Anthony, I will try that tomorrow first time and I will >>>>> report back. >>>>> >>>>> Richard >>>>> >>>>> >>>>> On Tue, Jun 21, 2011 at 5:35 PM, Anthony <[email protected]> wrote: >>>>> >>>>>> When you need to use additional validators with IS_IN_DB but still >>>>>> want the dropbox, you can add the additional validators to the IS_IN_DB >>>>>> validator via its '_and' argument -- see http://web2py.com/book/** >>>>>> default/chapter/07#Database-**Validators<http://web2py.com/book/default/chapter/07#Database-Validators>. >>>>>> >>>>>> However, I'm not sure if that works when IS_IN_DB is inside an >>>>>> IS_NULL_OR >>>>>> validator. (Actually, IS_NULL_OR has been deprecated in favor of >>>>>> IS_EMPTY_OR.) >>>>>> >>>>>> Anthony >>>>>> >>>>>> On Tuesday, June 21, 2011 5:16:12 PM UTC-4, Richard wrote: >>>>>> >>>>>>> Hello, >>>>>>> >>>>>>> I would like to know if the problem I face coming from the validator >>>>>>> that I write or is a IS_IN_DB behavior in case of multiple validators?? >>>>>>> >>>>>>> Here my validator : >>>>>>> >>>>>>> class ONLY_ONE_CAN_BE_FILLED(object)****: >>>>>>> """Class representing a validator requiring at least one >>>>>>> non-empty field in a set. """ >>>>>>> def __init__( >>>>>>> self, >>>>>>> others, >>>>>>> error_message='Enter a value in at least one field' >>>>>>> ): >>>>>>> self.others = others >>>>>>> self.error_message = error_message >>>>>>> >>>>>>> def __call__(self, value): >>>>>>> okay = (value, None) >>>>>>> error = (value, self.error_message) >>>>>>> values = [] >>>>>>> values.append(value) >>>>>>> values.extend(self.others) >>>>>>> empties = [] >>>>>>> for v in values: >>>>>>> unused_v, empty = is_empty(v) >>>>>>> empties.append(empty) >>>>>>> if empties.count(False) == 1: >>>>>>> return okay >>>>>>> else: >>>>>>> return error >>>>>>> >>>>>>> >>>>>>> But when i use it like this I lost my dropbox for the FK field1 : >>>>>>> >>>>>>> db.table.field1.requires =\ >>>>>>> [IS_NULL_OR(IS_IN_DB(db,'other****table.id<http://othertable.id> >>>>>>> ','%(fieldrepresent)s'****,orderby=('fieldrepresent'))), >>>>>>> ONLY_ONE_CAN_BE_FILLED([**reque**st.vars.field2],error_** >>>>>>> message=**'Select a volume or an folder')] >>>>>>> >>>>>>> I remember I read something about IS_IN_DB and [IS_IN_DB]... >>>>>>> >>>>>>> Can I have the dropbox and the multiple validators at the same time?? >>>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> Richard >>>>>>> >>>>>>> >>>>>>> >>>>> >>>> >>> >

