PageRenderTime 55ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/pypress/extensions/forms.py

https://github.com/laoqiu/pypress-tornado
Python | 99 lines | 62 code | 18 blank | 19 comment | 11 complexity | 367afb469b2214567cae5e586bd5ce33 MD5 | raw file
  1. #!/usr/bin/env python
  2. #coding=utf-8
  3. """
  4. forms.py
  5. ~~~~~~~~~~~~~
  6. wtforms extensions for tornado
  7. """
  8. import re
  9. from tornado.escape import _unicode
  10. from wtforms import Form as BaseForm, fields, validators, widgets, ext
  11. from wtforms.fields import BooleanField, DecimalField, DateField, \
  12. DateTimeField, FieldList, FloatField, FormField, \
  13. HiddenField, IntegerField, PasswordField, RadioField, SelectField, \
  14. SelectMultipleField, SubmitField, TextField, TextAreaField
  15. from wtforms.validators import ValidationError, Email, email, EqualTo, equal_to, \
  16. IPAddress, ip_address, Length, length, NumberRange, number_range, \
  17. Optional, optional, Required, required, Regexp, regexp, \
  18. URL, url, AnyOf, any_of, NoneOf, none_of
  19. from wtforms.widgets import CheckboxInput, FileInput, HiddenInput, \
  20. ListWidget, PasswordInput, RadioInput, Select, SubmitInput, \
  21. TableWidget, TextArea, TextInput
  22. try:
  23. import sqlalchemy
  24. _is_sqlalchemy = True
  25. except ImportError:
  26. _is_sqlalchemy = False
  27. if _is_sqlalchemy:
  28. from wtforms.ext.sqlalchemy.fields import QuerySelectField, \
  29. QuerySelectMultipleField
  30. for field in (QuerySelectField,
  31. QuerySelectMultipleField):
  32. setattr(fields, field.__name__, field)
  33. class Form(BaseForm):
  34. """
  35. Example:
  36. >>> user = User.query.get(1)
  37. >>> form = LoginForm(user)
  38. {{ xsrf_form_html }}
  39. {{ form.hiden_tag() }}
  40. {{ form.username }}
  41. """
  42. def __init__(self, formdata=None, *args, **kwargs):
  43. self.obj = kwargs.get('obj', None)
  44. super(Form, self).__init__(formdata, *args, **kwargs)
  45. def process(self, formdata=None, *args, **kwargs):
  46. if formdata is not None and not hasattr(formdata, 'getlist'):
  47. formdata = TornadoInputWrapper(formdata)
  48. super(Form, self).process(formdata, *args, **kwargs)
  49. def hidden_tag(self, *fields):
  50. """
  51. Wraps hidden fields in a hidden DIV tag, in order to keep XHTML
  52. compliance.
  53. """
  54. if not fields:
  55. fields = [f for f in self if isinstance(f, HiddenField)]
  56. rv = []
  57. for field in fields:
  58. if isinstance(field, basestring):
  59. field = getattr(self, field)
  60. rv.append(unicode(field))
  61. return u"".join(rv)
  62. class TornadoInputWrapper(dict):
  63. """
  64. From tornado source-> RequestHandler.get_arguments
  65. """
  66. def getlist(self, name, strip=True):
  67. values = []
  68. for v in self.get(name, []):
  69. v = _unicode(v)
  70. if isinstance(v, unicode):
  71. # Get rid of any weird control chars (unless decoding gave
  72. # us bytes, in which case leave it alone)
  73. v = re.sub(r"[\x00-\x08\x0e-\x1f]", " ", v)
  74. if strip:
  75. v = v.strip()
  76. values.append(v)
  77. return values