forms.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #*************************************************************************
  2. # Copyright © 2015 JiangLin. All rights reserved.
  3. # File Name: forms.py
  4. # Author:JiangLin
  5. # Mail:xiyang0807@gmail.com
  6. # Created Time: 2015-10-29 07:09:54
  7. #*************************************************************************
  8. #!/usr/bin/env python
  9. # -*- coding=UTF-8 -*-
  10. import re
  11. from flask import flash, jsonify
  12. from wtforms.validators import (ValidationError, StopValidation,
  13. Regexp, HostnameValidation)
  14. from wtforms.compat import string_types
  15. def flash_errors(form):
  16. for field, errors in form.errors.items():
  17. flash(u"%s %s" % (
  18. getattr(form, field).label.text,
  19. errors[0]
  20. ))
  21. break
  22. def return_errors(form):
  23. for field, errors in form.errors.items():
  24. data = (u"%s %s"% (getattr(form, field).label.text, errors[0]))
  25. break
  26. return jsonify(judge=False, error=data)
  27. class Length(object):
  28. def __init__(self, min=-1, max=-1, message=None):
  29. assert min != -1 or max != -1, 'At least one of `min` or `max` must be specified.'
  30. assert max == -1 or min <= max, '`min` cannot be more than `max`.'
  31. self.min = min
  32. self.max = max
  33. self.message = message
  34. def __call__(self, form, field):
  35. l = field.data and len(field.data) or 0
  36. if l < self.min or self.max != -1 and l > self.max:
  37. message = self.message
  38. if message is None:
  39. if self.max == -1:
  40. message = field.ngettext(
  41. '输入长度至少 %(min)d 个字符.',
  42. '输入长度至少 %(min)d 个字符.',
  43. self.min)
  44. elif self.min == -1:
  45. message = field.ngettext(
  46. '输入长度不能超过 %(min)d 个字符.',
  47. '输入长度不能超过 %(min)d 个字符.',
  48. self.max)
  49. else:
  50. message = field.gettext(
  51. '输入长度应在 %(min)d 到 %(max)d 个字符之间.')
  52. raise ValidationError(
  53. message %
  54. dict(
  55. min=self.min,
  56. max=self.max,
  57. length=l))
  58. class DataRequired(object):
  59. field_flags = ('required', )
  60. def __init__(self, message=None):
  61. self.message = message
  62. def __call__(self, form, field):
  63. if not field.data or isinstance(
  64. field.data, string_types) and not field.data.strip():
  65. if self.message is None:
  66. message = field.gettext('输入不能为空.')
  67. else:
  68. message = self.message
  69. field.errors[:] = []
  70. raise StopValidation(message)
  71. class Email(Regexp):
  72. def __init__(self, message=None):
  73. self.validate_hostname = HostnameValidation(
  74. require_tld=True,
  75. )
  76. super(Email, self).__init__(r'^.+@([^.@][^@]+)$',
  77. re.IGNORECASE,
  78. message)
  79. def __call__(self, form, field):
  80. message = self.message
  81. if message is None:
  82. message = field.gettext('错误的邮箱地址.')
  83. match = super(Email, self).__call__(form, field, message)
  84. if not self.validate_hostname(match.group(1)):
  85. raise ValidationError(message)
  86. class EqualTo(object):
  87. def __init__(self, fieldname, message=None):
  88. self.fieldname = fieldname
  89. self.message = message
  90. def __call__(self, form, field):
  91. try:
  92. other = form[self.fieldname]
  93. except KeyError:
  94. raise ValidationError(
  95. field.gettext("Invalid field name '%s'.") %
  96. self.fieldname)
  97. if field.data != other.data:
  98. d = {'other_label': hasattr(
  99. other,
  100. 'label') and other.label.text or self.fieldname,
  101. 'other_name': self.fieldname}
  102. message = self.message
  103. if message is None:
  104. message = field.gettext(
  105. '输入必须与 %(other_name)s 相同.')
  106. raise ValidationError(message % d)