On Sunday, January 20, 2013 11:52:59 PM UTC-6, Bill Thayer wrote:
>
> Borrowing code from SQLFORM.dictform I think I'm close to rendering nested
> dicts dumped from json:
>
> The browser is simply writing a bunch of the
> <gluon.html.(SPAN|FIELDSET)objects. I did try to return xml(form) but
> received an error saying:
> Generator expression must be parenthesized if not sole argument
>
> from contrib.simplejson import loads, dumps
> from types import *
> AUTOTYPES = {
> type(u''): ('unicode', None), ##Added
> type(''): ('string', None),
> type(True): ('boolean', None),
> type(1): ('integer', IS_INT_IN_RANGE(-1e12, +1e12)),
> type(1.0): ('double', IS_FLOAT_IN_RANGE()),
> type([]): ('list:string', None),
> type({}): ('text', IS_JSON()), ##Added
> type(datetime.date.today()): ('date', IS_DATE()),
> type(datetime.datetime.today()): ('datetime', IS_DATETIME())
> }
> def makefields(dictionary):
> """ Code modified from SQLFORM.dictform to recursivley process nested
> dicts """
> fields = []
> for key, value in sorted(dictionary.items()):
> #dbg.set_trace()
> t, requires = AUTOTYPES.get(type(value), (None, None))
> if t and isinstance(value,dict): ## added the type checking for
> value to see if is a dict
> fields.append(SPAN('{}'.format(key))) ## Needed to identify
> the nested dict
> fields.extend(makefields(value)) ## basic recursion
> elif t:
> fields.append(FIELDSET('{}'.format(key),
> INPUT(_name='{}'.format(key),
> _type='{}'.format('text'),
> #perhaps the AUTOTYPES should set t?
> _value='{}'.format(value),
> value='{}'.format(value),
> requires=requires)))
>
> return fields
>
> @auth.requires_login()
> def edit_parameters():
> """Display a form to edit the parameters rendered from a json object """
>
> table=db[request.args[0]]
> record=table(request.args[1])
> dictionary = record.parameters ## a json field type
>
> form = FORM('Edit Parameters', INPUT(_type='submit'), _action='',
> _method='post')
> fields=makefields(dictionary)
> form.insert(1,fields)
>
> dbg.set_trace()
> if form.validate(keepvalues=True):
> record.parameters.update(form.vars)
> table.update(record)
>
> return form
>
>
>
--