These excellent posts from Alberto Valverde in " Need help
understanding decorators"
explain a lot how @validate and @error_handling together


http://groups.google.com/group/turbogears/browse_frm/thread/110eb08dd357b675/396ea9bc8a1d7d42



On 26 mai, 19:57, aspineux <[EMAIL PROTECTED]> wrote:
> On 26 mai, 15:35, Jorge Godoy <[EMAIL PROTECTED]> wrote:
>
>
>
> Hi Jorge, thanks for your valuable answer.
>
> > I'd rather use a custom validator.  The logic is clearer, you write less
> > repetitive code, you reuse more components, no changes to TG are required,
> > you can have all that *now*.
>
> I rewrote my sample using a chained validator doing all the job of
> user creation.
> I put it at the end, but I didn't test it for real !
>
> 1. I put most of the code from the controller in the validator.
> 2. The validator extend the field_dict it got for validation with some
> result of the processing
> 3. These new values can then be used by the controller notice the
> user.
>
> (2) is the sensitive part. I know it works, but I don't know if I can
> do that.
>
>
>
> > Also, your changes imply in changing how TG is working with FormEncode.
>
> > What I see is that this would bring more harm than good and would add extra
> > code that needed to be maintained in TG.
>
> This is the price for any new feature :-)
>
>
>
> > On the other hand, nothing prevents you from coding that: you can create new
> > decorators and make them do what you want.  There are three dicts that you
> > can use  (that I remember right now, maybe there's something more): you can
> > get your submited data with a **kwargs dictionary, you can check (/set?)
> > validation errors on tg_errors and you can send back values on a dict of 
> > your
> > own to be redisplayed on the form.
>
> I don't understand how @validate and @error_handler can do their job.
> To replay the controller that display the form, @error_handler should
> have a copy of the previous request, to redo exactly the same.
> Second after the replay of the controller, @error_handler should
> modify the returned data to enforce the one the user filled in in the
> previous screen !
> Can you clarify ? If you know :-)
>
>
>
> > So, even though there's no written code on TG core that does what you want,
> > you can get it to work like that in, lets say, one weekend.
>
> I looked the @validate and @error_handler code but no easy to
> understand ....
> This will require more than a weekend :-)
>
> Anyway if I get lots of support from people :-) ... maybe
>
> Here is my code.
> Is it what you had in mind ?
>
> class NewUserValidation(formencode.FormValidator):
>
>     def validate_python(self, field_dict, state):
>         if field_dict['password1']!=field_dict['password2']:
>             raise turbogears.validators.Invalid('Passwords dont
> match', field_dict, state, error_dict={'password2': 'Password dont
> match' })
>
>         newuser=model.User(user_name=user_name, password=password)
>         session.save(newuser)
>         try:
>             session.flush()
>         except:
>             raise turbogears.validators.Invalid('Username already in
> use', field_dict, state, error_dict={'user_name': 'choose another
> username' })
>
>         # Extend field_dict with interesting results
>
>         field_dict['user_id']=newuser.user_id
>
> class FormNewUser(widgets.TableForm):
>     fields = [
>         widgets.TextField('user_name', label='User login',
> validator=validators.String(not_empty=True)),
>         widgets.PasswordField('password', label="Password" ,
> validator=validators.NotEmpty ()) ,
>         widgets.PasswordField('password2', label="Password (Repeat)" ,
> validator=validators.NotEmpty()) ,
>     ]
>     validator = validators.Schema(
>         chained_validators = [NewUserValidation()]
>     )
>     submit_text = "Create User"
>
> @turbogears.expose()
> @validate(form=new_user_form)
> @error_handler(index)
> def user_create(self, user_id, **kwargs):
>
>     turbogears.flash("User successfuly added, user_id=!" % user_id)
>     raise turbogears.redirect('show_user', dict(user_id=user_id))


--~--~---------~--~----~------------~-------~--~----~
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