Hi Massimo,

Thanks for trying to help. Perhaps I did not clearly explain the
point.

I hope to add an IS_NOT_EMPTY() constraint to any "list:reference
table_name" field. My previous snippet is copied from web2py book, but
in my real need, that "list:reference" field is not necessary a tag.
So I'm not going to plugin_tagging or plugin_wiki direction. Instead
you can think about a booking system inside a company.

db.define_table('employee', Field('name'))
db.define_table('appointment',
    Field('subject', 'string'),
    Field('participants', 'list:reference employee'),
    )

So I don't need any comma-separated-employee-name UI. In fact the
default widget for list:reference is already great. What I need is
just make sure any appointment will have at least one participant.

Can we somehow hook a IS_NOT_EMPTY() into list:reference 's default
widget? Thanks!

Regards,
Ray (a.k.a. Iceberg)


On Jul 24, 3:16 pm, Massimo Di Pierro <[email protected]>
wrote:
> I understand and what you need to do is a bit more complex than needs
> to be. For this reason we have plugin_tagging and tagging in
> plugin_wiki. Another approach is the following...
>
> class TAGGING:
>     def __call__(self,field,value):
>           return INPUT(_name='%s_%s' % (field._tablename,field.name),
>                        _value=', '.join(r.name for r in
> db(db.tag.id.belongs(value or [])).select()),
>                        requires = self.validate)
>     def validate(self,tags):
>           names = [x.strip() for x in tags.split(',')]
>           ids = [r.id for r in
> db(db.tag.name.belongs(names)).select()]
>           if len(ids) < len(names):
>               return (ids, "one of the tags is invalid or repeated")
>           return (ids,None)
>
> db.define_table('tag',
>                 Field('name', requires=IS_NOT_EMPTY()), format='%
> (name)s')
> db.define_table('product',
>                 Field('name', requires=IS_NOT_EMPTY()),
>                 Field('tags', 'list:reference tag',widget=TAGGING()),)
>
> def testme():
>     return {
>         'a': crud.update(db.product, request.args(0)),
>         'b': crud.select(db.product),
>         }
>
> The custom TAGGING widget renders the list of IDS as a a list of comma-
> separated names. You can also cache the mapping between ids and tag
> names for speed.

Reply via email to