filer.fields.multistorage_file: 54 total statements, 0.0% covered

Generated: Wed 2013-03-13 10:33 CET

Source file: /media/Envs/Envs/filer-gallery/lib/python2.7/site-packages/filer/fields/multistorage_file.py

Stats: 0 executed, 49 missed, 5 excluded, 48 ignored

  1. #-*- coding: utf-8 -*-
  2. from django.core.files.base import File
  3. from django.core.files.storage import Storage
  4. from easy_thumbnails import fields as easy_thumbnails_fields, \
  5. files as easy_thumbnails_files
  6. from filer import settings as filer_settings
  7. from filer.utils.filer_easy_thumbnails import ThumbnailerNameMixin
  8. STORAGES = {
  9. 'public': filer_settings.FILER_PUBLICMEDIA_STORAGE,
  10. 'private': filer_settings.FILER_PRIVATEMEDIA_STORAGE,
  11. }
  12. THUMBNAIL_STORAGES = {
  13. 'public': filer_settings.FILER_PUBLICMEDIA_THUMBNAIL_STORAGE,
  14. 'private': filer_settings.FILER_PRIVATEMEDIA_THUMBNAIL_STORAGE,
  15. }
  16. THUMBNAIL_OPTIONS = {
  17. 'public': filer_settings.FILER_PUBLICMEDIA_THUMBNAIL_OPTIONS,
  18. 'private': filer_settings.FILER_PRIVATEMEDIA_THUMBNAIL_OPTIONS,
  19. }
  20. def generate_filename_multistorage(instance, filename):
  21. if instance.is_public:
  22. upload_to = filer_settings.FILER_PUBLICMEDIA_UPLOAD_TO
  23. else:
  24. upload_to = filer_settings.FILER_PRIVATEMEDIA_UPLOAD_TO
  25. if callable(upload_to):
  26. return upload_to(instance, filename)
  27. else:
  28. return upload_to
  29. class MultiStorageFieldFile(ThumbnailerNameMixin,
  30. easy_thumbnails_files.ThumbnailerFieldFile):
  31. def __init__(self, instance, field, name):
  32. """
  33. This is a little weird, but I couldn't find a better solution.
  34. Thumbnailer.__init__ is called first for proper object inizialization.
  35. Then we override some attributes defined at runtime with properties.
  36. We cannot simply call super().__init__ because filer Field objects
  37. doesn't have a storage attribute.
  38. """
  39. easy_thumbnails_files.Thumbnailer.__init__(self, None, name)
  40. self.instance = instance
  41. self.field = field
  42. self._committed = True
  43. self.storages = self.field.storages
  44. self.thumbnail_storages = self.field.thumbnail_storages
  45. self.thumbnail_options = self.field.thumbnail_options
  46. self.storage = self._storage
  47. self.source_storage = self._source_storage
  48. self.thumbnail_storage = self._thumbnail_storage
  49. self.thumbnail_basedir = self._thumbnail_base_dir
  50. @property
  51. def _storage(self):
  52. if self.instance.is_public:
  53. return self.storages['public']
  54. else:
  55. return self.storages['private']
  56. @property
  57. def _source_storage(self):
  58. if self.instance.is_public:
  59. return self.storages['public']
  60. else:
  61. return self.storages['private']
  62. @property
  63. def _thumbnail_storage(self):
  64. if self.instance.is_public:
  65. return self.thumbnail_storages['public']
  66. else:
  67. return self.thumbnail_storages['private']
  68. @property
  69. def _thumbnail_base_dir(self):
  70. if self.instance.is_public:
  71. return self.thumbnail_options['public'].get('base_dir', '')
  72. else:
  73. return self.thumbnail_options['private'].get('base_dir', '')
  74. def save(self, name, content, save=True):
  75. content.seek(0) # Ensure we upload the whole file
  76. super(MultiStorageFieldFile, self).save(name, content, save)
  77. class MultiStorageFileField(easy_thumbnails_fields.ThumbnailerField):
  78. attr_class = MultiStorageFieldFile
  79. def __init__(self, verbose_name=None, name=None,
  80. storages=None, thumbnail_storages=None, thumbnail_options=None, **kwargs):
  81. self.storages = storages or STORAGES
  82. self.thumbnail_storages = thumbnail_storages or THUMBNAIL_STORAGES
  83. self.thumbnail_options = thumbnail_options or THUMBNAIL_OPTIONS
  84. super(easy_thumbnails_fields.ThumbnailerField, self).__init__(
  85. verbose_name=verbose_name, name=name,
  86. upload_to=generate_filename_multistorage,
  87. storage=None, **kwargs)