Got it, that makes sense.  Thanks a lot for the help.

On Oct 16, 5:29 pm, mdipierro <[email protected]> wrote:
> the only way to do it efficiently would be to be this:
>
> db.define_table('firm',
>    Field('name'),
>    Field('lname',writable=False,readable=False))
>
> def validate_name(form):
>    form.vars.lname,form.errors.name=IS_IN_DB(db,'firm.lname')
> (form.vars.name.lower())
>
> form=crud.create(db.first,onvalidation=validate_name)
>
> A little cumbersome but I am sure you get the idea.
>
> On Oct 16, 6:04 pm, oneroler <[email protected]> wrote:
>
>
>
> > Thanks for the fast response.  This works perfectly.  You said using
> > like is way less efficient, is there a way to use IS_NOT_IN_DB that
> > would achieve the same goal?
>
> > On Oct 16, 3:45 pm, mdipierro <[email protected]> wrote:
>
> > > Two things...
> > > 1)
>
> > >   db.firm.name.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db,
> > > 'firm.name')]
>
> > > and
>
> > >   db.firm.name.requires = IS_NOT_IN_DB(db, 'firm.name')
>
> > > are equivalent. Is not in db, does not accept empty anyway.
> > > Back to your question.
>
> > > You can make your own validator:
>
> > > class IS_NOT_IN_DB_ANYCASE:
> > >     def __init__(self,db, field, error_message='oops')
> > >         self.db=db
> > >         self.tablename,self.fieldname=field.split('.')
> > >         self.error_message=error_message
> > >     def __call__(self,value):
> > >         if self.db(self.db[self.tablename]
> > > [self.fieldname].like(value)).count():
> > >             return (value,self.error_message)
> > >         return (value,None)
>
> > > db.firm.name.requires = IS_NOT_IN_DB_ANYCASE(db, 'firm.name')
>
> > > but using like is way less efficient that not IS_NOT_IN_DB.
>
> > > On Oct 16, 5:18 pm, oneroler <[email protected]> wrote:
>
> > > > I just started working with web2py and have what is probably a simple
> > > > question on database validation.  Below is what I have in db.py.
> > > > Currently this will allow duplicate names that are in different cases
> > > > (e.g. Firm 1 and firm 1).  I want to make it so that it won't allow
> > > > this but stores the name in the database the way the person enters it,
> > > > so I don't want to convert everything to upper or lowercase and store
> > > > it that way.  Thanks in advance for any help.
>
> > > > db.define_table('firm',
> > > >     Field('name', unique=True))
>
> > > > db.firm.name.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db, 'firm.name')]

Reply via email to