Re: Writing a validator to look for cookie data

Ian Bicking <[email protected]> Thu, 12 Mar 2009 13:18:51 -0500
Newsgroups gmane.comp.python.formencode
Message-ID <[email protected]>
For something like this, I usually handle this stuff with unencoded
values.  That is, I don't hit the validator at all when rendering the
form.  I'd just get the defaults like:

if req.method == 'POST':
    defaults = req.POST.mixed()
    force_defaults = True
else:
    defaults = {}
    force_defaults = False
defaults.update(cgi.parse_qs(req.cookies.get('form_defaults', '')))
defaults.update(req.GET.mixed())
body = htmlfill.render(form, defaults, force_defaults=force_defaults)

If you want to use a validator, I'd use it on the line "defaults={}",
and replace that with something that grabs the encoded values from
some existing model, then runs "defaults =
schema.from_python(values)".

On Thu, Mar 12, 2009 at 12:39 PM, Matthew Wilson <[email protected]> wrote:
> I store fields from form submissions into a cookie, and then when a
> user hits a form, I prepopulate the form with that data.
>
> I want to write a validator that first tries to get values from the
> query string, and if that is None, then the validator should check the
> cookie.
>
> Here is what I have:
>
> class LookInCookie(FancyValidator):
>    """
>    Retrieves something from the cookie.  Depends on a state with an
>    attribute named 'simple_cookie'.
>    """
>
>    def __init__(self, k, d=None):
>        """
>        Return k from the cookie, or d if it isn't there.
>        """
>        self.k, self.d = k, d
>
>    def to_python(self, value, state=None):
>
>        log.debug("Inside LookInCookie.to_python with locals: %s"
>            % locals())
>
>        if hasattr(state, 'simple_cookie') \
>        and state.simple_cookie.has_key(self.k):
>
>            return state.simple_cookie[self.k]
>
>        else:
>            return self.d
>
> Then I tried to combine this validator with Any() like this:
>
>>>> from turbogears.util import Bunch
>>>> s = Bunch(simple_cookie={'city':1})
>>>> v = Any(LookInCookie('city'), validators.Int())
>>>> v.to_python('99', s)
> 99
>>>> v.to_python('abc', s)
> 1
>
> So far, so good!  First, the Int validator runs, then when Int fails,
> I get the value from the cookie s.
>
> However, here's where things fall apart.  When there is no value
> passed in, nothing comes back out!
>
>>>> v.to_python('', s)
>>>> v.to_python(None, s)
>
>
> How do I force validators to run even when the value is missing?
>
> More generally, is there a better solution to what I'm trying to do?
>
> --
> Matthew Wilson
> [email protected]
> http://tplus1.com
>
> ------------------------------------------------------------------------------
> Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
> powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
> easily build your RIAs with Flex Builder, the Eclipse(TM)based development
> software that enables intelligent coding and step-through debugging.
> Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
> _______________________________________________
> FormEncode-discuss mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/formencode-discuss
>



-- 
Ian Bicking  |  http://blog.ianbicking.org

------------------------------------------------------------------------------
Apps built with the Adobe(R) Flex(R) framework and Flex Builder(TM) are
powering Web 2.0 with engaging, cross-platform capabilities. Quickly and
easily build your RIAs with Flex Builder, the Eclipse(TM)based development
software that enables intelligent coding and step-through debugging.
Download the free 60 day trial. http://p.sf.net/sfu/www-adobe-com
_______________________________________________
FormEncode-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/formencode-discuss