Re: formencode validator DateConverter in 1.2

"Matthew Wilson" <[email protected]> Fri, 9 Jan 2009 13:31:44 -0500
Newsgroups gmane.comp.python.formencode
Message-ID <[email protected]>
On Fri, Jan 9, 2009 at 5:25 AM, Michael van Tellingen
<[email protected]> wrote:
> Hello everyone,
>
> I always use the DateConverter for validating dates in my formencode
> schemas. However i've recently tried upgrading to
> formencode 1.2 but unfortunatly it doesn't support dashes as separators
> anymore.
>
> To summarize; the following did work in 1.1 but doesn't in 1.2:
> validators.DateConverter(month_style='dd-mm-yyyy')
>
> The offending code in 1.2 is:
>
>     def __init__(self, *args, **kw):
>         super(DateConverter, self).__init__(*args, **kw)
>         if not self.month_style in ('dd/mm/yyyy', 'mm/dd/yyyy'):
>             raise TypeError("Bad month_style: %r" % self.month_style)
>
> Is it possible that this get's fixed in the trunk? Thanks ;-)

I wrote a slightly different DateConverter that accepts a list of
expected formats.  This eliminates the need for really complex regular
expressions.

Here's the code for it.  The docstring has some example uses (and tests).

from formencode.validators import FancyValidator

class WorseDateConverter(FancyValidator):

    """
    Requires a list of valid date format strings.

    >>> wdc = WorseDateConverter(['%m-%d-%Y',  '%m/%d/%Y', '%Y-%m-%d'])
    >>> wdc.to_python('09-06-2008')
    datetime.date(2008, 9, 6)
    >>> wdc.to_python('09/06/2008')
    datetime.date(2008, 9, 6)
    >>> wdc.to_python('2008-09-06')
    datetime.date(2008, 9, 6)
    >>> wdc.to_python('2008/09/06') # slashes instead of dashes.
    Traceback (most recent call last):
        ...
    Invalid: I couldn't parse '2008/09/06' with any of my formats!
    """

    def __init__(self, dateformats):
        self.dateformats = dateformats

    def to_python(self, value, state=None):

        if value is None:
            return

        for datefmt in self.dateformats:

            try:
                return datetime.strptime(value, datefmt).date()

            except ValueError:
                pass

        else:
            msg = "I couldn't parse '%s' with any of my formats!" % value

            raise Invalid(msg, value, state)

    def from_python(self, value, state=None):
        if value is None:
            return None
        else:
            return value.strftime(self.dateformats[0])

Maybe that helps.

Matt

-- 
Matthew Wilson
[email protected]
http://tplus1.com

------------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It is the best place to buy or sell services for
just about anything Open Source.
http://p.sf.net/sfu/Xq1LFB