Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #16703 -- Raise an exception if the storage location of the Def…

…aultStorageFinder is empty.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16863 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit c4cc8756437de2c9b508910ebe84f75a8d98d699 1 parent eb5df8e
@jezdez jezdez authored
View
15 django/contrib/staticfiles/finders.py
@@ -3,7 +3,7 @@
from django.core.exceptions import ImproperlyConfigured
from django.core.files.storage import default_storage, Storage, FileSystemStorage
from django.utils.datastructures import SortedDict
-from django.utils.functional import memoize, LazyObject
+from django.utils.functional import empty, memoize, LazyObject
from django.utils.importlib import import_module
from django.utils._os import safe_join
@@ -133,7 +133,7 @@ def list(self, ignore_patterns):
List all files in all app storages.
"""
for storage in self.storages.itervalues():
- if storage.exists(''): # check if storage location exists
+ if storage.exists(''): # check if storage location exists
for path in utils.get_files(storage, ignore_patterns):
yield path, storage
@@ -210,12 +210,21 @@ def list(self, ignore_patterns):
for path in utils.get_files(self.storage, ignore_patterns):
yield path, self.storage
+
class DefaultStorageFinder(BaseStorageFinder):
"""
A static files finder that uses the default storage backend.
"""
storage = default_storage
+ def __init__(self, *args, **kwargs):
+ super(DefaultStorageFinder, self).__init__(*args, **kwargs)
+ base_location = getattr(self.storage, 'base_location', empty)
+ if not base_location:
+ raise ImproperlyConfigured("The storage backend of the "
+ "staticfiles finder %r doesn't have "
+ "a valid location." % self.__class__)
+
def find(path, all=False):
"""
@@ -237,10 +246,12 @@ def find(path, all=False):
# No match.
return all and [] or None
+
def get_finders():
for finder_path in settings.STATICFILES_FINDERS:
yield get_finder(finder_path)
+
def _get_finder(import_path):
"""
Imports the staticfiles finder class described by import_path, where
View
6 django/core/files/storage.py
@@ -12,7 +12,8 @@
from django.utils.functional import LazyObject
from django.utils.importlib import import_module
from django.utils.text import get_valid_filename
-from django.utils._os import safe_join
+from django.utils._os import safe_join, abspathu
+
__all__ = ('Storage', 'FileSystemStorage', 'DefaultStorage', 'default_storage')
@@ -145,9 +146,10 @@ class FileSystemStorage(Storage):
def __init__(self, location=None, base_url=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
- self.location = os.path.abspath(location)
self.base_url = base_url
def _open(self, name, mode='rb'):
View
8 tests/regressiontests/file_storage/tests.py
@@ -96,6 +96,14 @@ def tearDown(self):
shutil.rmtree(self.temp_dir)
shutil.rmtree(self.temp_dir2)
+ def test_emtpy_location(self):
+ """
+ Makes sure an exception is raised if the location is empty
+ """
+ storage = self.storage_class(location='')
+ self.assertEqual(storage.base_location, '')
+ self.assertEqual(storage.location, os.getcwd())
+
def test_file_access_options(self):
"""
Standard file access options are available, and work as expected.
View
11 tests/regressiontests/staticfiles_tests/tests.py
@@ -496,6 +496,9 @@ class TestMiscFinder(TestCase):
"""
A few misc finder tests.
"""
+ def setUp(self):
+ default_storage._wrapped = empty
+
def test_get_finder(self):
self.assertTrue(isinstance(finders.get_finder(
'django.contrib.staticfiles.finders.FileSystemFinder'),
@@ -509,13 +512,17 @@ def test_get_finder_bad_module(self):
self.assertRaises(ImproperlyConfigured,
finders.get_finder, 'foo.bar.FooBarFinder')
+ @override_settings(STATICFILES_DIRS='a string')
def test_non_tuple_raises_exception(self):
"""
We can't determine if STATICFILES_DIRS is set correctly just by
looking at the type, but we can determine if it's definitely wrong.
"""
- with self.settings(STATICFILES_DIRS='a string'):
- self.assertRaises(ImproperlyConfigured, finders.FileSystemFinder)
+ self.assertRaises(ImproperlyConfigured, finders.FileSystemFinder)
+
+ @override_settings(MEDIA_ROOT='')
+ def test_location_empty(self):
+ self.assertRaises(ImproperlyConfigured, finders.DefaultStorageFinder)
class TestTemplateTag(StaticFilesTestCase):
Please sign in to comment.
Something went wrong with that request. Please try again.