Fixed #18986 -- Improved error message for missing files

in CachedStaticFilesStorage. Thanks zyegfryed for his work on the patch.
This commit is contained in:
Aymeric Augustin 2013-04-28 16:45:05 +02:00
parent f7f69cf7dd
commit 90fe9141de
4 changed files with 27 additions and 2 deletions

View File

@ -116,6 +116,12 @@ class Command(NoArgsCommand):
processor = self.storage.post_process(found_files, processor = self.storage.post_process(found_files,
dry_run=self.dry_run) dry_run=self.dry_run)
for original_path, processed_path, processed in processor: for original_path, processed_path, processed in processor:
if isinstance(processed, Exception):
self.stderr.write("Post-processing '%s' failed!" % original_path)
# Add a blank line before the traceback, otherwise it's
# too easy to miss the relevant part of the error message.
self.stderr.write("")
raise processed
if processed: if processed:
self.log("Post-processed '%s' as '%s'" % self.log("Post-processed '%s' as '%s'" %
(original_path, processed_path), level=1) (original_path, processed_path), level=1)

View File

@ -251,7 +251,10 @@ class CachedFilesMixin(object):
for patterns in self._patterns.values(): for patterns in self._patterns.values():
for pattern, template in patterns: for pattern, template in patterns:
converter = self.url_converter(name, template) converter = self.url_converter(name, template)
try:
content = pattern.sub(converter, content) content = pattern.sub(converter, content)
except ValueError as exc:
yield name, None, exc
if hashed_file_exists: if hashed_file_exists:
self.delete(hashed_name) self.delete(hashed_name)
# then save the processed result # then save the processed result

View File

@ -0,0 +1 @@
@import url("missing.css");

View File

@ -244,7 +244,7 @@ class TestCollection(CollectionTestCase, TestDefaults):
class TestCollectionClear(CollectionTestCase): class TestCollectionClear(CollectionTestCase):
""" """
Test the ``--clear`` option of the ``collectstatic`` managemenet command. Test the ``--clear`` option of the ``collectstatic`` management command.
""" """
def run_collectstatic(self, **kwargs): def run_collectstatic(self, **kwargs):
clear_filepath = os.path.join(settings.STATIC_ROOT, 'cleared.txt') clear_filepath = os.path.join(settings.STATIC_ROOT, 'cleared.txt')
@ -550,6 +550,21 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
self.assertNotIn(b"cached/other.css", content) self.assertNotIn(b"cached/other.css", content)
self.assertIn(b"other.d41d8cd98f00.css", content) self.assertIn(b"other.d41d8cd98f00.css", content)
@override_settings(
STATICFILES_DIRS=(os.path.join(TEST_ROOT, 'project', 'faulty'),),
STATICFILES_FINDERS=('django.contrib.staticfiles.finders.FileSystemFinder',),
)
def test_post_processing_failure(self):
"""
Test that post_processing indicates the origin of the error when it
fails. Regression test for #18986.
"""
finders._finders.clear()
err = six.StringIO()
with self.assertRaises(Exception) as cm:
call_command('collectstatic', interactive=False, verbosity=0, stderr=err)
self.assertEqual("Post-processing 'faulty.css' failed!\n\n", err.getvalue())
# we set DEBUG to False here since the template tag wouldn't work otherwise # we set DEBUG to False here since the template tag wouldn't work otherwise
@override_settings(**dict(TEST_SETTINGS, @override_settings(**dict(TEST_SETTINGS,