Hi,

I am following the example for TurboGears 1.0 Unified Form Data
Validation :

    http://docs.turbogears.org/1.0/UnifiedControllers

I've created a fairly complicated example where the same method
handles an add & edit form using TurboGears 1.0.7 & FormEncode 1.0.1 .

The form layout is dynamic, it depends on user permission and workflow
state to determine the fields that are present and if they are
editable etc.

I am finding I can add an entry if there are no form validation erros
in the form data, but my form falls over when I try to render the form
for correction because the form is getting an internal error from
the validation error.

I know if I suppress rendering of the individual order lines then it
doesn't fall over. Also if I comment out the validate decorator in the
index method, all is well too. Ideally I'd like to catch the error and
have it rendered in line in the form.

Below I've attached the index method of my OrderController, the error
trace for the

Validators are attached to each element in the form as it is built
dynamically.
The template for the order form just has the following rendering code:
        <p py:content="form.display(value=form_data, repetitions=repetitions,
formname='Order')">Order Form</p>


My questions for the forum are:
1. Why are validation errors being triggered upon template rendering
after I have already caught them with the get_errors method?
2. Is there a simple way to render the form without triggering the
validation errors?
3. I know there is a CRUD module written for TurboGears 1.0 . Does it
lead to cleaner code than my current index method?
4. Are there any fundamentally better ways of approaching form
validation when dealing with dynamic forms?


Thanks,
Chris Guest


    @expose(template="webordering.templates.order_form")
    @identity.require(identity.not_anonymous())
    def index(self, id='', tg_errors=None, *args, **kw):

        plu_classes, plu_classes_data, maxOrderLines, pluClassNum =
self._get_plu_classes()

        displayBlankPlu = True
        user = identity.current.user
        group_names = [g.group_name for g in
identity.current.user.groups]
        id = id or kw.get('id','')
        if id:
            mode, displayBlankPlu, status_code =
self._get_display_options(id, user, group_names)

        if kw:
            # form data has been posted.
            if id:
                # edit an existing order
                form_args = dict(mode=mode, status_code=form_data
['status_code'], outerRepetitions=pluClassNum,
innerRepetitions=maxOrderLines)
                form =  get_order_form(**form_args)
            else:
                # add a new order.
                store_id = kw.get('store_id', None)
                store_options = self._get_store_options(store_id,
user)
                form_args = dict(mode='add', status_code='PEND',
store_options=store_options, outerRepetitions=pluClassNum,
innerRepetitions=maxOrderLines)
                form = get_order_form(**form_args)

            @validate(form=form)
            def get_errors(self, tg_errors=None, **data):
                log.info('OrderController.index.get_errors data=
%r'%data)
                return tg_errors, data

            tg_errors, form_data = get_errors(self, **kw)

            # errors = [(param,inv) for param, inv in tg_errors.items
()]
            if not tg_errors:
                # Perform some action with the data in **data.  **kw
still contains the raw data.
                flash_message, oh = self._process(*args, **form_data)
                flash(flash_message)
                redirect(oh.get_url().replace('/order',''))

            else:
                if id:
                    flash("Errors were encountered.")
                    params = self._edit(plu_classes_data, mode, id,
form_data, displayBlankPlu, *args, **kw)
                else:
                    flash("Errors were encountered.")
                    params = self._add(plu_classes_data, form_data,
displayBlankPlu, *args, **kw)
                params['template'] =
'webordering.templates.order_form'

        else:
            # no data posted
            form_data = None
            if id:
                # edit - retrieve record from database.
                params = self._edit(plu_classes_data, mode, id,
form_data, displayBlankPlu, *args, **kw)
            else:
                # new - enter blank form.
                params = self._add(plu_classes_data, form_data,
displayBlankPlu, *args, **kw)
                log.info('OrderController.index -> else: type=%r'%type
(params))
            if 'makeInvoiceURL' not in params:
                params['makeInvoiceURL'] = False
        params.update(get_sidebars())
        return params




500 Internal error

The server encountered an unexpected condition which prevented it from
fulfilling the request.

Page handler: <bound method OrderController.index of
<webordering.controllers.OrderController object at 0xb745096c>>
Traceback (most recent call last):
  File "/usr/local/lib/python2.4/site-packages/CherryPy-2.3.0-
py2.4.egg/cherrypy/_cphttptools.py", line 121, in _run
    self.main()
  File "/usr/local/lib/python2.4/site-packages/CherryPy-2.3.0-
py2.4.egg/cherrypy/_cphttptools.py", line 264, in main
    body = page_handler(*virtual_path, **self.params)
  File "<string>", line 3, in index
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 358, in expose
    output = database.run_with_transaction(
  File "<string>", line 5, in run_with_transaction
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/database.py", line 407, in sa_rwt
    retval = func(*args, **kw)
  File "<string>", line 5, in _expose
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 373, in <lambda>
    mapping, fragment, args, kw)))
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 423, in _execute_func
    return _process_output(output, template, format, content_type,
mapping, fragment)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/controllers.py", line 88, in _process_output
    fragment=fragment)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/view/base.py", line 161, in render
    return engine.render(**kw)
  File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 206, in render
    output=output, format=format)
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
__init__.py", line 301, in serialize
    raise_template_error(module=self.__module__)
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
__init__.py", line 299, in serialize
    return serializer.serialize(self, encoding, fragment, format)
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 107, in serialize
    text = ''.join(self.generate(stream, encoding, fragment, format))
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 629, in generate
    for ev, item in self.apply_filters(stream, format):
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 165, in format_stream
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
serialization.py", line 477, in inject_meta_tags
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 41, in apply_matches
    templates[:i] + templates[i+1:], apply_func):
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 41, in apply_matches
    templates[:i] + templates[i+1:], apply_func):
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
    for ev, item in stream:
  File "/home/chris/sup1/WebOrdering/webordering/templates/
order_form.py", line 56, in _match_func
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/meta.py", line 110, in lockwidget
    output = self.__class__.display(self, *args, **kw)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 387, in display
    return super(CompoundWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
    returnval = func(self, *args, **kw)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
    return super(InputWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 294, in display
    return transform(params, self.template_c)
  File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 220, in transform
    return kid.ElementStream(t.transform()).expand()
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 108, in expand
    for ev, item in self._iter:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
    for ev, item in stream:
  File "<string>", line 85, in _pull
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/meta.py", line 110, in lockwidget
    output = self.__class__.display(self, *args, **kw)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 387, in display
    return super(CompoundWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
    returnval = func(self, *args, **kw)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
    return super(InputWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 294, in display
    return transform(params, self.template_c)
  File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 220, in transform
    return kid.ElementStream(t.transform()).expand()
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 108, in expand
    for ev, item in self._iter:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
    for ev, item in stream:
  File "<string>", line 92, in _pull
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 387, in display
    return super(CompoundWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
    returnval = func(self, *args, **kw)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
    return super(InputWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 294, in display
    return transform(params, self.template_c)
  File "/usr/local/lib/python2.4/site-packages/TurboKid-1.0.4-
py2.4.egg/turbokid/kidsupport.py", line 220, in transform
    return kid.ElementStream(t.transform()).expand()
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 108, in expand
    for ev, item in self._iter:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
filter.py", line 26, in apply_matches
    for ev, item in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 179, in _track
    for p in stream:
  File "/usr/local/lib/python2.4/site-packages/kid-0.9.6-py2.4.egg/kid/
parser.py", line 221, in _coalesce
    for ev, item in stream:
  File "<string>", line 104, in _pull
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 52, in _update_path
    returnval = func(self, *args, **kw)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 237, in display
    return super(InputWidget, self).display(value, **params)
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/base.py", line 280, in display
    params["value"] = to_unicode(self.adjust_value(value, **params))
  File "/usr/local/lib/python2.4/site-packages/TurboGears-1.0.7-
py2.4.egg/turbogears/widgets/forms.py", line 233, in adjust_value
    value = self.validator.from_python(value)
  File "/usr/local/lib/python2.4/site-packages/FormEncode-1.0.1-
py2.4.egg/formencode/api.py", line 418, in from_python
    value = self._from_python(value, state)
  File "/usr/local/lib/python2.4/site-packages/FormEncode-1.0.1-
py2.4.egg/formencode/validators.py", line 948, in _to_python
    value, state)
Invalid: Please enter an integer value
Error location in template file '/home/chris/sup1/WebOrdering/
webordering/templates/order_form.kid'
between line 10, column 4 and line 11, column 4:
    <p py:content="form.display(value=form_data,
repetitions=repetitions, f ...

Powered by CherryPy 2.3.0


--~--~---------~--~----~------------~-------~--~----~
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?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to