mirror of https://github.com/django/django.git
Fixed #16703 -- Raise an exception if the storage location of the DefaultStorageFinder is empty.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16863 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
eb5df8e98d
commit
c4cc875643
|
@ -3,7 +3,7 @@ from django.conf import settings
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.core.files.storage import default_storage, Storage, FileSystemStorage
|
from django.core.files.storage import default_storage, Storage, FileSystemStorage
|
||||||
from django.utils.datastructures import SortedDict
|
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.importlib import import_module
|
||||||
from django.utils._os import safe_join
|
from django.utils._os import safe_join
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ class AppDirectoriesFinder(BaseFinder):
|
||||||
List all files in all app storages.
|
List all files in all app storages.
|
||||||
"""
|
"""
|
||||||
for storage in self.storages.itervalues():
|
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):
|
for path in utils.get_files(storage, ignore_patterns):
|
||||||
yield path, storage
|
yield path, storage
|
||||||
|
|
||||||
|
@ -210,12 +210,21 @@ class BaseStorageFinder(BaseFinder):
|
||||||
for path in utils.get_files(self.storage, ignore_patterns):
|
for path in utils.get_files(self.storage, ignore_patterns):
|
||||||
yield path, self.storage
|
yield path, self.storage
|
||||||
|
|
||||||
|
|
||||||
class DefaultStorageFinder(BaseStorageFinder):
|
class DefaultStorageFinder(BaseStorageFinder):
|
||||||
"""
|
"""
|
||||||
A static files finder that uses the default storage backend.
|
A static files finder that uses the default storage backend.
|
||||||
"""
|
"""
|
||||||
storage = default_storage
|
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):
|
def find(path, all=False):
|
||||||
"""
|
"""
|
||||||
|
@ -237,10 +246,12 @@ def find(path, all=False):
|
||||||
# No match.
|
# No match.
|
||||||
return all and [] or None
|
return all and [] or None
|
||||||
|
|
||||||
|
|
||||||
def get_finders():
|
def get_finders():
|
||||||
for finder_path in settings.STATICFILES_FINDERS:
|
for finder_path in settings.STATICFILES_FINDERS:
|
||||||
yield get_finder(finder_path)
|
yield get_finder(finder_path)
|
||||||
|
|
||||||
|
|
||||||
def _get_finder(import_path):
|
def _get_finder(import_path):
|
||||||
"""
|
"""
|
||||||
Imports the staticfiles finder class described by import_path, where
|
Imports the staticfiles finder class described by import_path, where
|
||||||
|
|
|
@ -12,7 +12,8 @@ from django.utils.encoding import force_unicode, filepath_to_uri
|
||||||
from django.utils.functional import LazyObject
|
from django.utils.functional import LazyObject
|
||||||
from django.utils.importlib import import_module
|
from django.utils.importlib import import_module
|
||||||
from django.utils.text import get_valid_filename
|
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')
|
__all__ = ('Storage', 'FileSystemStorage', 'DefaultStorage', 'default_storage')
|
||||||
|
|
||||||
|
@ -145,9 +146,10 @@ class FileSystemStorage(Storage):
|
||||||
def __init__(self, location=None, base_url=None):
|
def __init__(self, location=None, base_url=None):
|
||||||
if location is None:
|
if location is None:
|
||||||
location = settings.MEDIA_ROOT
|
location = settings.MEDIA_ROOT
|
||||||
|
self.base_location = location
|
||||||
|
self.location = abspathu(self.base_location)
|
||||||
if base_url is None:
|
if base_url is None:
|
||||||
base_url = settings.MEDIA_URL
|
base_url = settings.MEDIA_URL
|
||||||
self.location = os.path.abspath(location)
|
|
||||||
self.base_url = base_url
|
self.base_url = base_url
|
||||||
|
|
||||||
def _open(self, name, mode='rb'):
|
def _open(self, name, mode='rb'):
|
||||||
|
|
|
@ -96,6 +96,14 @@ class FileStorageTests(unittest.TestCase):
|
||||||
shutil.rmtree(self.temp_dir)
|
shutil.rmtree(self.temp_dir)
|
||||||
shutil.rmtree(self.temp_dir2)
|
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):
|
def test_file_access_options(self):
|
||||||
"""
|
"""
|
||||||
Standard file access options are available, and work as expected.
|
Standard file access options are available, and work as expected.
|
||||||
|
|
|
@ -496,6 +496,9 @@ class TestMiscFinder(TestCase):
|
||||||
"""
|
"""
|
||||||
A few misc finder tests.
|
A few misc finder tests.
|
||||||
"""
|
"""
|
||||||
|
def setUp(self):
|
||||||
|
default_storage._wrapped = empty
|
||||||
|
|
||||||
def test_get_finder(self):
|
def test_get_finder(self):
|
||||||
self.assertTrue(isinstance(finders.get_finder(
|
self.assertTrue(isinstance(finders.get_finder(
|
||||||
'django.contrib.staticfiles.finders.FileSystemFinder'),
|
'django.contrib.staticfiles.finders.FileSystemFinder'),
|
||||||
|
@ -509,13 +512,17 @@ class TestMiscFinder(TestCase):
|
||||||
self.assertRaises(ImproperlyConfigured,
|
self.assertRaises(ImproperlyConfigured,
|
||||||
finders.get_finder, 'foo.bar.FooBarFinder')
|
finders.get_finder, 'foo.bar.FooBarFinder')
|
||||||
|
|
||||||
|
@override_settings(STATICFILES_DIRS='a string')
|
||||||
def test_non_tuple_raises_exception(self):
|
def test_non_tuple_raises_exception(self):
|
||||||
"""
|
"""
|
||||||
We can't determine if STATICFILES_DIRS is set correctly just by
|
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.
|
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):
|
class TestTemplateTag(StaticFilesTestCase):
|
||||||
|
|
Loading…
Reference in New Issue