widgets.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from wtforms import widgets
  2. from flask.globals import _request_ctx_stack
  3. from flask_admin.babel import gettext, ngettext
  4. from flask_admin import helpers as h
  5. __all__ = ['Select2Widget', 'DatePickerWidget', 'DateTimePickerWidget', 'RenderTemplateWidget', 'Select2TagsWidget', ]
  6. def _is_bootstrap3():
  7. view = h.get_current_view()
  8. return view and view.admin.template_mode == 'bootstrap3'
  9. class Select2Widget(widgets.Select):
  10. """
  11. `Select2 <https://github.com/ivaynberg/select2>`_ styled select widget.
  12. You must include select2.js, form-x.x.x.js and select2 stylesheet for it to
  13. work.
  14. """
  15. def __call__(self, field, **kwargs):
  16. kwargs.setdefault('data-role', u'select2')
  17. allow_blank = getattr(field, 'allow_blank', False)
  18. if allow_blank and not self.multiple:
  19. kwargs['data-allow-blank'] = u'1'
  20. return super(Select2Widget, self).__call__(field, **kwargs)
  21. class Select2TagsWidget(widgets.TextInput):
  22. """`Select2 <http://ivaynberg.github.com/select2/#tags>`_ styled text widget.
  23. You must include select2.js, form-x.x.x.js and select2 stylesheet for it to work.
  24. """
  25. def __call__(self, field, **kwargs):
  26. kwargs.setdefault('data-role', u'select2-tags')
  27. return super(Select2TagsWidget, self).__call__(field, **kwargs)
  28. class DatePickerWidget(widgets.TextInput):
  29. """
  30. Date picker widget.
  31. You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work.
  32. """
  33. def __call__(self, field, **kwargs):
  34. kwargs.setdefault('data-role', u'datepicker')
  35. kwargs.setdefault('data-date-format', u'YYYY-MM-DD')
  36. self.date_format = kwargs['data-date-format']
  37. return super(DatePickerWidget, self).__call__(field, **kwargs)
  38. class DateTimePickerWidget(widgets.TextInput):
  39. """
  40. Datetime picker widget.
  41. You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work.
  42. """
  43. def __call__(self, field, **kwargs):
  44. kwargs.setdefault('data-role', u'datetimepicker')
  45. kwargs.setdefault('data-date-format', u'YYYY-MM-DD HH:mm:ss')
  46. return super(DateTimePickerWidget, self).__call__(field, **kwargs)
  47. class TimePickerWidget(widgets.TextInput):
  48. """
  49. Date picker widget.
  50. You must include bootstrap-datepicker.js and form-x.x.x.js for styling to work.
  51. """
  52. def __call__(self, field, **kwargs):
  53. kwargs.setdefault('data-role', u'timepicker')
  54. kwargs.setdefault('data-date-format', u'HH:mm:ss')
  55. return super(TimePickerWidget, self).__call__(field, **kwargs)
  56. class RenderTemplateWidget(object):
  57. """
  58. WTForms widget that renders Jinja2 template
  59. """
  60. def __init__(self, template):
  61. """
  62. Constructor
  63. :param template:
  64. Template path
  65. """
  66. self.template = template
  67. def __call__(self, field, **kwargs):
  68. ctx = _request_ctx_stack.top
  69. jinja_env = ctx.app.jinja_env
  70. kwargs.update({
  71. 'field': field,
  72. '_gettext': gettext,
  73. '_ngettext': ngettext,
  74. 'h': h,
  75. })
  76. template = jinja_env.get_template(self.template)
  77. return template.render(kwargs)