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

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 

5 

6 

7class InvalidStorageError(ImproperlyConfigured): 

8 pass 

9 

10 

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 = {} 

17 

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 

32 

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 

46 

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)