Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/django/core/files/storage/handler.py: 36%
39 statements
« prev ^ index » next coverage.py v7.0.5, created at 2023-01-17 06:13 +0000
« prev ^ index » next coverage.py v7.0.5, created at 2023-01-17 06:13 +0000
1from django.conf import DEFAULT_STORAGE_ALIAS, STATICFILES_STORAGE_ALIAS, settings
2from django.core.exceptions import ImproperlyConfigured
3from django.utils.functional import cached_property
4from django.utils.module_loading import import_string
7class InvalidStorageError(ImproperlyConfigured):
8 pass
11class StorageHandler:
12 def __init__(self, backends=None):
13 # backends is an optional dict of storage backend definitions
14 # (structured like settings.STORAGES).
15 self._backends = backends
16 self._storages = {}
18 @cached_property
19 def backends(self):
20 if self._backends is None:
21 self._backends = settings.STORAGES.copy()
22 # RemovedInDjango51Warning.
23 if settings.is_overridden("DEFAULT_FILE_STORAGE"):
24 self._backends[DEFAULT_STORAGE_ALIAS] = {
25 "BACKEND": settings.DEFAULT_FILE_STORAGE
26 }
27 if settings.is_overridden("STATICFILES_STORAGE"):
28 self._backends[STATICFILES_STORAGE_ALIAS] = {
29 "BACKEND": settings.STATICFILES_STORAGE
30 }
31 return self._backends
33 def __getitem__(self, alias):
34 try:
35 return self._storages[alias]
36 except KeyError:
37 try:
38 params = self.backends[alias]
39 except KeyError:
40 raise InvalidStorageError(
41 f"Could not find config for '{alias}' in settings.STORAGES."
42 )
43 storage = self.create_storage(params)
44 self._storages[alias] = storage
45 return storage
47 def create_storage(self, params):
48 params = params.copy()
49 backend = params.pop("BACKEND")
50 options = params.pop("OPTIONS", {})
51 try:
52 storage_cls = import_string(backend)
53 except ImportError as e:
54 raise InvalidStorageError(f"Could not find backend {backend!r}: {e}") from e
55 return storage_cls(**options)