I forgot about widget... My working time is split in differents aspect related to my project so I am lost sometimes when I am back to web2py... And I have some difficulties to follow the rhythm of the novelties...
I appreciate your help a lot Anthony. Richard On Wed, Jun 22, 2011 at 5:40 PM, Anthony <[email protected]> wrote: > 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.**d**b[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,(**tupl**e,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,(**tupl**e,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([**r**equest.vars.field2],error_* >>>>> *mess**age='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-**Validator**s<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 >>>>>>>> >>>>>>>> >>>>>>>> >>>>>> >>>>> >>>> >>

