storage.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import os
  2. from datetime import UTC, datetime, timedelta
  3. from django.conf import settings
  4. from django.contrib.staticfiles.storage import ManifestStaticFilesStorage
  5. from django.core.files import storage
  6. class DummyStorage(storage.Storage):
  7. """
  8. A storage class that implements get_modified_time() but raises
  9. NotImplementedError for path().
  10. """
  11. def _save(self, name, content):
  12. return "dummy"
  13. def delete(self, name):
  14. pass
  15. def exists(self, name):
  16. pass
  17. def get_modified_time(self, name):
  18. return datetime(1970, 1, 1, tzinfo=UTC)
  19. class PathNotImplementedStorage(storage.Storage):
  20. def _save(self, name, content):
  21. return "dummy"
  22. def _path(self, name):
  23. return os.path.join(settings.STATIC_ROOT, name)
  24. def exists(self, name):
  25. return os.path.exists(self._path(name))
  26. def listdir(self, path):
  27. path = self._path(path)
  28. directories, files = [], []
  29. with os.scandir(path) as entries:
  30. for entry in entries:
  31. if entry.is_dir():
  32. directories.append(entry.name)
  33. else:
  34. files.append(entry.name)
  35. return directories, files
  36. def delete(self, name):
  37. name = self._path(name)
  38. try:
  39. os.remove(name)
  40. except FileNotFoundError:
  41. pass
  42. def path(self, name):
  43. raise NotImplementedError
  44. class NeverCopyRemoteStorage(PathNotImplementedStorage):
  45. """
  46. Return a future modified time for all files so that nothing is collected.
  47. """
  48. def get_modified_time(self, name):
  49. return datetime.now() + timedelta(days=30)
  50. class QueryStringStorage(storage.Storage):
  51. def url(self, path):
  52. return path + "?a=b&c=d"
  53. class SimpleStorage(ManifestStaticFilesStorage):
  54. def file_hash(self, name, content=None):
  55. return "deploy12345"
  56. class ExtraPatternsStorage(ManifestStaticFilesStorage):
  57. """
  58. A storage class to test pattern substitutions with more than one pattern
  59. entry. The added pattern rewrites strings like "url(...)" to JS_URL("...").
  60. """
  61. patterns = tuple(ManifestStaticFilesStorage.patterns) + (
  62. (
  63. "*.js",
  64. (
  65. (
  66. r"""(?P<matched>url\(['"]{0,1}\s*(?P<url>.*?)["']{0,1}\))""",
  67. 'JS_URL("%(url)s")',
  68. ),
  69. ),
  70. ),
  71. )
  72. class NoneHashStorage(ManifestStaticFilesStorage):
  73. def file_hash(self, name, content=None):
  74. return None
  75. class NoPostProcessReplacedPathStorage(ManifestStaticFilesStorage):
  76. max_post_process_passes = 0