validators.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from sqlalchemy.orm.exc import NoResultFound
  2. from wtforms import ValidationError
  3. try:
  4. from wtforms.validators import InputRequired
  5. except ImportError:
  6. from wtforms.validators import Required as InputRequired
  7. class Unique(object):
  8. """Checks field value unicity against specified table field.
  9. :param get_session:
  10. A function that return a SQAlchemy Session.
  11. :param model:
  12. The model to check unicity against.
  13. :param column:
  14. The unique column.
  15. :param message:
  16. The error message.
  17. """
  18. field_flags = ('unique', )
  19. def __init__(self, db_session, model, column, message=None):
  20. self.db_session = db_session
  21. self.model = model
  22. self.column = column
  23. self.message = message
  24. def __call__(self, form, field):
  25. # databases allow multiple NULL values for unique columns
  26. if field.data is None:
  27. return
  28. try:
  29. obj = (self.db_session.query(self.model)
  30. .filter(self.column == field.data)
  31. .one())
  32. if not hasattr(form, '_obj') or not form._obj == obj:
  33. if self.message is None:
  34. self.message = field.gettext(u'Already exists.')
  35. raise ValidationError(self.message)
  36. except NoResultFound:
  37. pass
  38. class ItemsRequired(InputRequired):
  39. """
  40. A version of the ``InputRequired`` validator that works with relations,
  41. to require a minimum number of related items.
  42. """
  43. def __init__(self, min=1, message=None):
  44. super(ItemsRequired, self).__init__(message=message)
  45. self.min = min
  46. def __call__(self, form, field):
  47. if len(field.data) < self.min:
  48. if self.message is None:
  49. message = field.ngettext(
  50. u"At least %(num)d item is required",
  51. u"At least %(num)d items are required",
  52. self.min
  53. )
  54. else:
  55. message = self.message
  56. raise ValidationError(message)