fields.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. from werkzeug.datastructures import FileStorage
  2. from wtforms import fields
  3. from ...upload import BS3FileUploadFieldWidget, BS3ImageUploadFieldWidget
  4. try:
  5. from wtforms.fields.core import _unset_value as unset_value
  6. except ImportError:
  7. from wtforms.utils import unset_value
  8. def is_empty(file_object):
  9. file_object.seek(0)
  10. first_char = file_object.read(1)
  11. file_object.seek(0)
  12. return not bool(first_char)
  13. class MongoFileField(fields.FileField):
  14. """
  15. GridFS file field.
  16. """
  17. widget = BS3FileUploadFieldWidget()
  18. def __init__(self, label=None, validators=None, **kwargs):
  19. super().__init__(label, validators, **kwargs)
  20. self._should_delete = False
  21. def process(self, formdata, data=unset_value, **kwargs):
  22. if formdata:
  23. marker = "_%s-delete" % self.name
  24. if marker in formdata:
  25. self._should_delete = True
  26. return super().process(formdata, data, **kwargs)
  27. def populate_obj(self, obj, name):
  28. field = getattr(obj, name, None)
  29. if field is not None:
  30. # If field should be deleted, clean it up
  31. if self._should_delete:
  32. field.delete()
  33. return
  34. if isinstance(self.data, FileStorage) and not is_empty(self.data.stream):
  35. if not field.grid_id:
  36. func = field.put
  37. else:
  38. func = field.replace
  39. func(
  40. self.data.stream,
  41. filename=self.data.filename,
  42. content_type=self.data.content_type,
  43. )
  44. class MongoImageField(MongoFileField):
  45. """
  46. GridFS file field.
  47. """
  48. widget = BS3ImageUploadFieldWidget()