Working as much as I have on widgets (use of, not creation of) I've come up 
with a few useful tidbits I'd like to share:

I define a SingleSelectField as:

> W.SingleSelectField('author', label='Author',
>         options=make_list(model.Account, 'No Author'),
>         help_text='Select an author to display in byline information.'),

The make_list function and build_list method are the trick, here.  The 
make_list function prepends an optional empty value to an existing callable 
(which should return a list of tuples).  It also allows you to pass arguments 
to the callable; the primary reason for the function.

> def make_list(c, none_label=None, *args, **kwargs):
>     def _call():
>         return [ [], [(None, none_label)] ][none_label is not None] + \
>                 c.build_list(*args, **kwargs)
>     return _call

The build_list method of my SQLObject classes return a list of tuples suitable 
for use in a select-type widget (single, multiple, radio, or checkbox) by 
performing a simple .select() on itself, passing any arguments it receives to 
the select method.

> @classmethod # of Account
> def build_list(self, *args, **kwargs):
>     return [(a.id, a.full_name) for a in self.select(*args, **kwargs)] 

An alternative and generic build_list function is: (and can be used alongside 
classes using the above method)

> @classmethod # of anything
> def build_list(self, field, *args, **kwargs):
>     return [(a.id, getattr(a, field)) for a in self.select(*args, **kwargs)] 

Any additional arguments to make_list are automatically passed, thus, to the 
select method, allowing you to use SQLBuilder in your arguments to the 
widget.  Take the following examples:

> from model import *
> from datetime import datetime
>
> ..., options=make_list(Account, None,
>          Account.q.enabled, orderBy=Account.q.full_name), ... 
>
> ..., options=make_list(Language, "Unspecified", Language.q.strings > 0), ...
>
> # Alternate method for accounts:
> ..., options=make_list(Account, None, 'user_name'), ...

Note that you can't use both methods within a single class.

Enjoy!

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TurboGears" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/turbogears
-~----------~----~----~----~------~----~------~--~---

Reply via email to