Yeah, maybe I was going a bit overboard trying to DRY things up. Anyway, I
went with your #2 and it worked quite nice.



On Mon, Aug 16, 2010 at 5:01 PM, Ian Wilson <[email protected]>wrote:

> Hey hey hey,
>
> I always make two schemas such as NewUserSchema and EditUserSchema.
>
> You can do this 3 ways:
> 1. have NewUserSchema inherit from EditUserSchema and replace fields as
> needed
> 2. have NewUserSchema and EditUserSchema both inherit from a shared schema
> like UserSchema and replace/add fields as necessary
> 3. create 2 totally different schemas and just repeat all the fields with
> the correct kw arguments
>
> Usually I pick a way that best suits the situation.  Trying to push that
> into your single validator will probably be more work than its worth. I'm
> actually not sure if its possible when inheriting from FancyValidator.
>
> That's my 2 billion cents, hope it helps.
>
> On Mon, Aug 16, 2010 at 1:22 PM, Ryan McKillen <[email protected]>wrote:
>
>> Ian, thanks. Your help is much appreciated.
>>
>> Your `FlexPassword(not_empty=False)` works per the requirements I posted,
>> but I've got another one I hadn't shared previously the prevents me from
>> using it.
>>
>> The crux of my issue is that I'm trying to utilize a single validation
>> schema for both creating new users and allowing existing users to update
>> their account.
>>
>> FlexPassword is named as such because for a new user, it enforces 'not
>> empty' and 'minimum length' conditions, but for an existing user, it allows
>> an empty password. When an existing user submits the form to update their
>> account, they can change whatever fields they want and if they leave their
>> password blank it won't be updated.
>>
>> Here's the code:
>>
>> class FlexPassword(formencode.FancyValidator):
>>     def _to_python(self, value, state):
>>
>>         # Ok for registered users to submit a blank password b/c it will
>> not be changed
>>         if hasattr(state, 'current_user') and len(value) == 0:
>>             return value
>>
>>         if len(value) == 0:
>>             raise formencode.Invalid('Please enter a value', value, state)
>>         elif len(value) < 6:
>>             raise formencode.Invalid('Enter a value at least 6 characters
>> long', value, state)
>>         return value
>>
>> Any other ideas for me?
>>
>>
>> On Mon, Aug 16, 2010 at 12:17 PM, Ian Wilson 
>> <[email protected]>wrote:
>>
>>> Hi,
>>>
>>> I think you want FlexPassword(not_empty=True).  FancyValidator handles
>>> the empty case internally before your method is called.  There might be
>>> another method that overrides this but if you need a custom message for not
>>> empty then you can just override the 'empty' key in messages with your own
>>> message.
>>>
>>> I looked at the code to justify what I said earlier:
>>>
>>> Empty case is handled --
>>> http://bitbucket.org/ianb/formencode/src/tip/formencode/api.py#cl-406
>>>
>>> Your _to_python is used --
>>> http://bitbucket.org/ianb/formencode/src/tip/formencode/api.py#cl-417
>>>
>>> -Ian
>>>
>>>
>>> On Mon, Aug 16, 2010 at 9:56 AM, Ryan <[email protected]> wrote:
>>>
>>>> My controller is calling _to_python on a schema object:
>>>>
>>>>    @validate(schema=UserCreateValidation(), form='new',
>>>> post_only=True)
>>>>    def create(self):
>>>>        # controller code here...
>>>>
>>>> Inside the schema is where I call the validator:
>>>>
>>>>    class UserCreateValidation(formencode.Schema):
>>>>        password = formencode.All(FlexPassword())
>>>>        # more schema code here...
>>>>
>>>> I can't call `FlexPassword#_to_python` because `value` and `state`
>>>> aren't known by the schema.
>>>>
>>>> The `UserCreateValidation` schema includes other validations, so I
>>>> know the controller is calling it even when the password field is
>>>> blank. What's happening though, is the schema seems to ignore
>>>> `password = formencode.All(FlexPassword())` when the password is
>>>> blank.
>>>>
>>>> Do I need to add an additional argument to `formencode#All` to make
>>>> sure it runs `FlexPassword` even when the value is blank?
>>>>
>>>>
>>>> On Aug 13, 5:49 pm, Eric Rasmussen <[email protected]> wrote:
>>>> > Hi Ryan,
>>>> >
>>>> > In your example below, _to_python always works for me if I call it
>>>> directly
>>>> > (as a method of the class). Is there any chance that your controller
>>>> isn't
>>>> > calling it when the value is an empty string? It might help to see how
>>>> your
>>>> > controller is referencing it.
>>>> >
>>>> > Best,
>>>> > Eric
>>>> >
>>>> >
>>>> >
>>>> > On Fri, Aug 13, 2010 at 7:46 AM, Ryan <[email protected]>
>>>> wrote:
>>>> > > I have a custom validator called `FlexPassword`
>>>> >
>>>> > > class FlexPassword(formencode.FancyValidator):
>>>> > >    def _to_python(self, value, state):
>>>> > >        raise formencode.Invalid('validator ran', value, state)
>>>> >
>>>> > > Here's my schema:
>>>> >
>>>> > > password =
>>>> > > formencode.All(formencode.validators.PlainText(not_empty=True),
>>>> > > FlexPassword())
>>>> >
>>>> > > As expected, when no characters are entered, the PlainText error is
>>>> > > raised. Also as expected, when a single character is entered, the
>>>> > > FlexPassword error is raised.
>>>> >
>>>> > > But that's not the schema I want to use. This is:
>>>> >
>>>> > > password = formencode.All(FlexPassword())
>>>> >
>>>> > > Contrary to expectation, when no characters are entered, the
>>>> > > FlexPassword error is not raised. Huh? As expected, when a single
>>>> > > character is entered, the FlexPassword error is raised.
>>>> >
>>>> > > The way I've got it wired up, the form should always fail
>>>> validation,
>>>> > > but with a blank password, it passes. Any insights for me? Thanks.
>>>> >
>>>> > > --
>>>> > > You received this message because you are subscribed to the Google
>>>> Groups
>>>> > > "pylons-discuss" group.
>>>> > > To post to this group, send email to
>>>> [email protected].
>>>> > > To unsubscribe from this group, send email to
>>>> > > [email protected]<pylons-discuss%[email protected]>
>>>> <pylons-discuss%2bunsubscr...@go oglegroups.com>
>>>> > > .
>>>> > > For more options, visit this group at
>>>> > >http://groups.google.com/group/pylons-discuss?hl=en.
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "pylons-discuss" group.
>>>> To post to this group, send email to [email protected].
>>>> To unsubscribe from this group, send email to
>>>> [email protected]<pylons-discuss%[email protected]>
>>>> .
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/pylons-discuss?hl=en.
>>>>
>>>>
>>>  --
>>> You received this message because you are subscribed to the Google Groups
>>> "pylons-discuss" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<pylons-discuss%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/pylons-discuss?hl=en.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "pylons-discuss" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<pylons-discuss%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/pylons-discuss?hl=en.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "pylons-discuss" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<pylons-discuss%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/pylons-discuss?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" 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/pylons-discuss?hl=en.

Reply via email to