widgets.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from wtforms.widgets import HTMLString, html_params
  2. from jinja2 import escape
  3. from mongoengine.fields import GridFSProxy, ImageGridFsProxy
  4. from flask_admin.helpers import get_url
  5. from . import helpers
  6. class MongoFileInput(object):
  7. """
  8. Renders a file input chooser field.
  9. """
  10. template = ('<div>'
  11. ' <i class="icon-file"></i>%(name)s %(size)dk (%(content_type)s)'
  12. ' <input type="checkbox" name="%(marker)s">Delete</input>'
  13. '</div>')
  14. def __call__(self, field, **kwargs):
  15. kwargs.setdefault('id', field.id)
  16. placeholder = ''
  17. if field.data and isinstance(field.data, GridFSProxy):
  18. data = field.data
  19. placeholder = self.template % {
  20. 'name': escape(data.name),
  21. 'content_type': escape(data.content_type),
  22. 'size': data.length // 1024,
  23. 'marker': '_%s-delete' % field.name
  24. }
  25. return HTMLString('%s<input %s>' % (placeholder,
  26. html_params(name=field.name,
  27. type='file',
  28. **kwargs)))
  29. class MongoImageInput(object):
  30. """
  31. Renders a file input chooser field.
  32. """
  33. template = ('<div class="image-thumbnail">'
  34. ' <img src="%(thumb)s"/>'
  35. ' <input type="checkbox" name="%(marker)s">Delete</input>'
  36. '</div>')
  37. def __call__(self, field, **kwargs):
  38. kwargs.setdefault('id', field.id)
  39. placeholder = ''
  40. if field.data and isinstance(field.data, ImageGridFsProxy):
  41. args = helpers.make_thumb_args(field.data)
  42. placeholder = self.template % {
  43. 'thumb': get_url('.api_file_view', **args),
  44. 'marker': '_%s-delete' % field.name
  45. }
  46. return HTMLString('%s<input %s>' % (placeholder,
  47. html_params(name=field.name,
  48. type='file',
  49. **kwargs)))