PK
D8ºxùý ý wtforms/__init__.py"""
wtforms
~~~~~~~
What The Forms is a framework-agnostic way of generating HTML forms, handling
form submissions, and validating it.
Check out our trac wiki at http://dev.simplecodes.com/projects/wtforms
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
"""
from wtforms.form import Form
from wtforms.fields import *
from wtforms.validators import ValidationError
from wtforms import validators
_version__ = "devel"
PK
D8ü´© wtforms/fields.py"""
wtforms.fields
~~~~~~~~~~~~~~
TODO
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
"""
from datetime import datetime
from cgi import escape
try:
from functools import partial
except ImportError:
from wtforms.utils import partial
from wtforms.validators import ValidationError
def html_params(**kwargs):
params = []
for k,v in kwargs.iteritems():
if k in ('class_', 'class__'):
k = k[:-1]
k = unicode(k)
v = escape(unicode(v), quote=True)
params.append(u'%s="%s"' % (k, v))
return str.join(' ', params)
class Field(object):
_formfield = True
creation_counter = 0
def __new__(cls, *args, **kwargs):
if 'name' not in kwargs:
x = partial(cls, *args, **kwargs)
x._formfield = True
x.creation_counter = Field.creation_counter
Field.creation_counter += 1
return x
else:
return super(Field, cls).__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
form = kwargs['form']
self.name = kwargs['name']
self.id = kwargs.get('id', form._idprefix + self.name)
if args and isinstance(args[0], basestring):
self._label = args[0]
self.validators = args[1:]
else:
self._label = self.name
self.validators = args
self.data = None
self.errors = []
def __unicode__(self):
return self()
def __call__(self, **kwargs):
raise NotImplementedError
def _get_label(self):
return u'' % (self.id, self._label)
label = property(_get_label)
def _validate(self, *args):
pass
def process_data(self, value, has_formdata):
self.data = value
def process_formdata(self, valuelist):
self.data = valuelist[0]
class SelectField(Field):
def __init__(self, *args, **kwargs):
super(SelectField, self).__init__(*args, **kwargs)
self.checker = kwargs.pop('checker', str)
self.choices = kwargs.pop('choices', None)
def __call__(self, **kwargs):
kwargs.setdefault('id', self.id)
html = u''
return html
def _selected(self, value):
return (self.checker(value) == self.data)
def process_data(self, value, has_formdata):
self.data = self.checker(getattr(value, 'id', value))
def process_formdata(self, valuelist):
self.data = self.checker(valuelist[0])
def _validate(self, *args):
for v, _ in self.choices:
if self.data == v:
break
else:
raise ValidationError('Not a valid choice')
class SelectMultipleField(SelectField):
def __call__(self, **kwargs):
super(SelectMultipleField, self).__call__(multiple="multiple", **kwargs)
def _selected(self, value):
return (self.checker(value) in self.data)
def process_formdata(self, valuelist):
self.data = [self.checker(x) for x in valuelist]
class TextField(Field):
def __call__(self, **kwargs):
kwargs.setdefault('id', self.id)
kwargs.setdefault('type', 'text')
return u'' % html_params(name=self.name, value=self._value(), **kwargs)
def _value(self):
return self.data and unicode(self.data) or u''
class HiddenField(TextField):
def __call__(self, **kwargs):
kwargs.setdefault('type', 'hidden')
return super(HiddenField, self).__call__(**kwargs)
class TextAreaField(TextField):
def __call__(self, **kwargs):
kwargs.setdefault('id', self.id)
return u'' % (html_params(name=self.name, **kwargs), escape(unicode(self._value())))
class PasswordField(TextField):
def __call__(self, **kwargs):
kwargs.setdefault('type', 'password')
return super(PasswordField, self).__call__(**kwargs)
class FileField(TextField):
"""
Can render a file-upload field. Will take any passed filename value, if
any is sent by the browser in the post params. This field will NOT
actually handle the file upload portion, as wtforms does not deal with
individual frameworks' file handling capabilities.
"""
def __call__(self, **kwargs):
kwargs.setdefault('type', 'file')
return super(FileField, self).__call__(**kwargs)
class IntegerField(TextField):
""" Can be represented by a text-input """
def _value(self):
return self.data and unicode(self.data) or u'0'
def process_formdata(self, valuelist):
try:
self.data = int(valuelist[0])
except ValueError:
pass
class BooleanField(Field):
""" Represents a checkbox."""
def __call__(self, **kwargs):
kwargs.setdefault('id', self.id)
kwargs.setdefault('type', 'checkbox')
if self.data:
kwargs['checked'] = u'checked'
return u'' % html_params(name=self.name, value=u'y', **kwargs)
def process_data(self, value, has_formdata):
if has_formdata:
self.data = False
else:
self.data = value
def process_formdata(self, valuelist):
self.data = valuelist[0] == u'y'
class DateTimeField(TextField):
""" Can be represented by one or multiple text-inputs """
def __init__(self, *args, **kwargs):
super(DateTimeField, self).__init__(*args, **kwargs)
self.format = kwargs.pop('format', '%Y-%m-%d %H:%M:%S')
def _value(self):
return self.data and self.data.strftime(self.format) or u''
def process_formdata(self, valuelist):
if valuelist and valuelist[0]:
try:
self.data = datetime.strptime(str.join(' ', valuelist), self.format)
except ValueError:
return u'Date is invalid.'
class SubmitField(BooleanField):
"""Allow checking if a given submit button has been pressed"""
def __call__(self, **kwargs):
kwargs.setdefault('id', self.id)
kwargs.setdefault('type', 'submit')
kwargs.setdefault('value', self._label)
return u'' % html_params(name=self.name, **kwargs)
def process_formdata(self, valuelist):
self.data = (len(valuelist) > 0 and valuelist[0] != u'')
__all__ = ('SelectField', 'SelectMultipleField', 'TextField', 'IntegerField', 'BooleanField', 'DateTimeField', 'PasswordField', 'TextAreaField', 'SubmitField', 'HiddenField', 'FileField')
PK
D8¿¥¡ø¾ ¾ wtforms/form.py"""
wtforms.form
~~~~~~~~~~~~
TODO
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
"""
from wtforms.validators import ValidationError
import types
class Form(object):
def __init__(self, formdata=None, obj=None, prefix='', idprefix='', **kwargs):
if prefix:
prefix += '_'
self._idprefix = idprefix
# populate data from form and optional instance and defaults
self.errors = {}
self._fields = []
has_formdata = bool(formdata)
for name, f in self._unbound_fields:
form_name = prefix + name
field = f(name=form_name, form=self)
self._fields.append((name, field))
setattr(self, name, field)
if name in kwargs:
field.process_data(kwargs[name], has_formdata)
if hasattr(obj, name):
field.process_data(getattr(obj, name), has_formdata)
if has_formdata and form_name in formdata:
field.process_formdata(formdata.getlist(form_name))
def __new__(cls, *args, **kw):
"""
Use the field creation counter to create an ordered list of form fields.
"""
if not hasattr(cls, '_unbound_fields'):
fields = []
for k, v in cls.__dict__.items():
if hasattr(v, '_formfield'):
fields.append((k, v))
fields.sort(lambda x,y: cmp(x[1].creation_counter, y[1].creation_counter))
cls._unbound_fields = fields
return super(Form, cls).__new__(cls, *args, **kw)
def __iter__(self):
for name, field in self._fields:
yield field
def validate(self):
success = True
for name, field in self._fields:
field.errors = []
validators = list(field.validators)
validators.append(field._validate)
inline_validator = getattr(self.__class__, '_validate_%s' % name, None)
if inline_validator is not None:
validators.append(inline_validator)
for validator in validators:
try:
validator(self, field)
except ValueError, e:
field.errors.append(e.args[0])
if field.errors:
success = False
self.errors[name] = field.errors
return success
def _get_data(self):
data = {}
for name, field in self._fields:
data[name] = field.data
return data
data = property(_get_data)
def auto_populate(self, model):
"""
Automatically copy our converted form values into the model object.
This can be very dangerous if not used properly, so make sure to only use
this in forms with proper validators and the right attributes.
"""
for name, field in self._fields:
setattr(model, name, field.data)
PK
D8!ÖoÜ Ü wtforms/utils.py"""
wtforms.utils
~~~~~~~~~~~~~
TODO
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
"""
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
PK
D8¢…Þ¼‘ ‘ wtforms/validators.py"""
wtforms.validators
~~~~~~~~~~~~~~~~~~
TODO
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
"""
import re
class ValidationError(ValueError):
pass
def email(form, field):
if not re.match(r'^.+@[^.].+\.[a-z]{2,4}$', field.data, re.IGNORECASE): # XXX better email regex?
raise ValidationError(u'Invalid email address.')
def length(message=None, min=-1, max=None):
fmt_args = {'min': min, 'max': max}
def _length(form, field):
L = field.data and len(field.data) or 0
if L < min:
raise ValidationError((message or u'Must be at least %(min)i characters.') % fmt_args)
elif max is not None and L > max:
raise ValidationError((message or u'May not be longer than %(max)i characters.') % fmt_args)
return _length
def url(allow_blank=False):
def _url(form, field):
if allow_blank and not field.data:
return
match = re.match(r'[a-z]+://.*', field.data, re.I)
if not match:
raise ValidationError(u'Is not a valid URL.')
return _url
def not_empty(message=None):
def _not_empty(form, field):
if not field.data or not field.data.strip():
raise ValidationError(message or u'Field must not be empty.')
return _not_empty
__all__ = ('ValidationError', 'email', 'length', 'url', 'not_empty')
PK ªF8Jë¾Â7 7 wtforms/__init__.pyc;ò
Hc @ s> d Z d k l Z d k Td k l Z d k l Z d Z d S( sW
wtforms
~~~~~~~
What The Forms is a framework-agnostic way of generating HTML forms, handling
form submissions, and validating it.
Check out our trac wiki at http://dev.simplecodes.com/projects/wtforms
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
( s Form( s *( s ValidationError( s
validatorss develN( s __doc__s wtforms.forms Forms wtforms.fieldss wtforms.validatorss ValidationErrors wtformss
validatorss
_version__( s
_version__s ValidationErrors Forms
validators( ( s. build/bdist.linux-i686/egg/wtforms/__init__.pys ? s
PK ªF8e¢3(³: ³: wtforms/fields.pyc;ò
Hc @ s d Z d k l Z d k l Z y d k l Z Wn e j
o d k l Z n Xd k l Z d „ Z
d e f d „ ƒ YZ d e f d „ ƒ YZ
d
e
f d „ ƒ YZ d e f d
„ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d e f d „ ƒ YZ d d
d d d d d d d d d f Z d S( s§
wtforms.fields
~~~~~~~~~~~~~~
TODO
:copyright: 2007-2008 by James Crasta, Thomas Johansson.
:license: MIT, see LICENSE.txt for details.
( s datetime( s escape( s partial( s ValidationErrorc K s“ g } xv | i ƒ D]h \ } } | d d f j o | d } n t | ƒ } t t | ƒ d t ƒ} | i d | | f ƒ q Wt i
d | ƒ Sd S( Ns class_s class__iÿÿÿÿs quoteu %s="%s"s ( s paramss kwargss iteritemss ks vs unicodes escapes Trues appends strs join( s kwargss ks paramss v( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys html_params s
s Fieldc B sh t Z e Z d Z d „ Z d „ Z d „ Z d „ Z d „ Z e
e ƒ Z d „ Z d „ Z
d „ Z RS(
Ni c O sk d | j o> t | | | Ž } t | _ t i | _ t i d 7_ | Sn t t | ƒ i
| | | Ž Sd S( Ns namei ( s kwargss partials clss argss xs Trues
_formfields Fields creation_counters supers __new__( s clss argss kwargss x( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys __new__ s
c O sš | d } | d | _ | i d | i | i ƒ | _ | o t | d t ƒ o | d | _
| d | _ n | i | _
| | _ t | _
g | _ d S( Ns forms names idi i ( s kwargss forms selfs names gets _idprefixs ids argss
isinstances
basestrings _labels
validatorss Nones datas errors( s selfs argss kwargss form( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys __init__* s
c C s | ƒ Sd S( N( s self( s self( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys __unicode__7 s c K s
t ‚ d S( N( s NotImplementedError( s selfs kwargs( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys __call__: s c C s d | i | i f Sd S( Nu ( s selfs ids _label( s self( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys
_get_label= s c G s d S( N( ( s selfs args( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys _validateA s c C s
| | _ d S( N( s values selfs data( s selfs values has_formdata( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys process_dataD s c C s | d | _ d S( Ni ( s valuelists selfs data( s selfs valuelist( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys process_formdataG s ( s __name__s
__module__s Trues
_formfields creation_counters __new__s __init__s __unicode__s __call__s
_get_labels propertys labels _validates process_datas process_formdata( ( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys Field s
s SelectFieldc B s> t Z d „ Z d „ Z d „ Z d „ Z d „ Z d „ Z RS( Nc O sG t t | ƒ i | | Ž | i d t ƒ | _ | i d t ƒ | _
d S( Ns checkers choices( s supers SelectFields selfs __init__s argss kwargss pops strs checkers Nones choices( s selfs argss kwargs( ( s, build/bdist.linux-i686/egg/wtforms/fields.pys __init__K s c K s« | i d | i ƒ d t d | i | } xj | i D]_ \ } } h d | <} | i | ƒ o d | d