summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2016-01-06 23:34:55 -0500
committerSimon Charette <charette.s@gmail.com>2016-01-07 12:04:39 -0500
commit56c461a0d7c1cbb9d5709bda817579c7ee18d474 (patch)
tree7174f775f36a6c3406c4cf8f1432e84224aabb70 /django
parent6ea7b6776c79b7a30b32c4f0c1f2658bc49dfe6c (diff)
Fixed #26038 -- Changed FileSystemStorage defaults on setting change.
Thanks to Dave Voutila for the report and Tim for the review.
Diffstat (limited to 'django')
-rw-r--r--django/core/files/storage.py62
-rw-r--r--django/test/signals.py10
2 files changed, 45 insertions, 27 deletions
diff --git a/django/core/files/storage.py b/django/core/files/storage.py
index efd8fc13b7..208884e1cf 100644
--- a/django/core/files/storage.py
+++ b/django/core/files/storage.py
@@ -6,11 +6,12 @@ from django.conf import settings
from django.core.exceptions import SuspiciousFileOperation
from django.core.files import File, locks
from django.core.files.move import file_move_safe
+from django.core.signals import setting_changed
from django.utils._os import abspathu, safe_join
from django.utils.crypto import get_random_string
from django.utils.deconstruct import deconstructible
from django.utils.encoding import filepath_to_uri, force_text
-from django.utils.functional import LazyObject
+from django.utils.functional import LazyObject, cached_property
from django.utils.module_loading import import_string
from django.utils.six.moves.urllib.parse import urljoin
from django.utils.text import get_valid_filename
@@ -165,24 +166,49 @@ class FileSystemStorage(Storage):
"""
def __init__(self, location=None, base_url=None, file_permissions_mode=None,
- directory_permissions_mode=None):
- if location is None:
- location = settings.MEDIA_ROOT
- self.base_location = location
- self.location = abspathu(self.base_location)
- if base_url is None:
- base_url = settings.MEDIA_URL
- elif not base_url.endswith('/'):
+ directory_permissions_mode=None):
+ self._location = location
+ if base_url is not None and not base_url.endswith('/'):
base_url += '/'
- self.base_url = base_url
- self.file_permissions_mode = (
- file_permissions_mode if file_permissions_mode is not None
- else settings.FILE_UPLOAD_PERMISSIONS
- )
- self.directory_permissions_mode = (
- directory_permissions_mode if directory_permissions_mode is not None
- else settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS
- )
+ self._base_url = base_url
+ self._file_permissions_mode = file_permissions_mode
+ self._directory_permissions_mode = directory_permissions_mode
+ setting_changed.connect(self._clear_cached_properties)
+
+ def _clear_cached_properties(self, setting, **kwargs):
+ """Reset setting based property values."""
+ if setting == 'MEDIA_ROOT':
+ self.__dict__.pop('base_location', None)
+ self.__dict__.pop('location', None)
+ elif setting == 'MEDIA_URL':
+ self.__dict__.pop('base_url', None)
+ elif setting == 'FILE_UPLOAD_PERMISSIONS':
+ self.__dict__.pop('file_permissions_mode', None)
+ elif setting == 'FILE_UPLOAD_DIRECTORY_PERMISSIONS':
+ self.__dict__.pop('directory_permissions_mode', None)
+
+ def _value_or_setting(self, value, setting):
+ return setting if value is None else value
+
+ @cached_property
+ def base_location(self):
+ return self._value_or_setting(self._location, settings.MEDIA_ROOT)
+
+ @cached_property
+ def location(self):
+ return abspathu(self.base_location)
+
+ @cached_property
+ def base_url(self):
+ return self._value_or_setting(self._base_url, settings.MEDIA_URL)
+
+ @cached_property
+ def file_permissions_mode(self):
+ return self._value_or_setting(self._file_permissions_mode, settings.FILE_UPLOAD_PERMISSIONS)
+
+ @cached_property
+ def directory_permissions_mode(self):
+ return self._value_or_setting(self._directory_permissions_mode, settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS)
def _open(self, name, mode='rb'):
return File(open(self.path(name), mode))
diff --git a/django/test/signals.py b/django/test/signals.py
index a647e2895b..1a86b1f846 100644
--- a/django/test/signals.py
+++ b/django/test/signals.py
@@ -120,15 +120,7 @@ def language_changed(**kwargs):
@receiver(setting_changed)
def file_storage_changed(**kwargs):
- file_storage_settings = {
- 'DEFAULT_FILE_STORAGE',
- 'FILE_UPLOAD_DIRECTORY_PERMISSIONS',
- 'FILE_UPLOAD_PERMISSIONS',
- 'MEDIA_ROOT',
- 'MEDIA_URL',
- }
-
- if kwargs['setting'] in file_storage_settings:
+ if kwargs['setting'] == 'DEFAULT_FILE_STORAGE':
from django.core.files.storage import default_storage
default_storage._wrapped = empty