Fixed the relative static file resolution of the CachedStaticFilesStorage backend and the post processing of deeply nested static files.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16862 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2011-09-21 15:58:21 +00:00
parent 75199e8f6d
commit eb5df8e98d
7 changed files with 40 additions and 15 deletions

View File

@ -113,13 +113,22 @@ class CachedFilesMixin(object):
return matched
name_parts = name.split('/')
# Using posix normpath here to remove duplicates
result = url_parts = posixpath.normpath(url).split('/')
level = url.count('..')
if level:
result = name_parts[:-level - 1] + url_parts[level:]
elif name_parts[:-1]:
result = name_parts[:-1] + url_parts[-1:]
joined_result = '/'.join(result)
url = posixpath.normpath(url)
url_parts = url.split('/')
parent_level, sub_level = url.count('..'), url.count('/')
if url.startswith('/'):
sub_level -= 1
url_parts = url_parts[1:]
if parent_level or not url.startswith('/'):
start, end = parent_level + 1, parent_level
else:
if sub_level:
if sub_level == 1:
parent_level -= 1
start, end = parent_level, sub_level - 1
else:
start, end = 1, sub_level - 1
joined_result = '/'.join(name_parts[:-start] + url_parts[end:])
hashed_url = self.url(joined_result, force=True)
# Return the hashed and normalized version to the file
return 'url("%s")' % hashed_url

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

View File

@ -0,0 +1,3 @@
body {
background: #d3d6d8 url("img/window.png");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

View File

@ -1,2 +1,5 @@
@import url("../cached/styles.css");
@import url("absolute.css");
@import url("absolute.css");
body {
background: #d3d6d8 url(img/relative.png);
}

View File

@ -1 +1 @@
@import url("cached/other.css");
@import url("other.css");

View File

@ -300,11 +300,11 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
""", "/static/test/file.dad0999e4f8f.txt")
self.assertTemplateRenders("""
{% load static from staticfiles %}{% static "cached/styles.css" %}
""", "/static/cached/styles.5653c259030b.css")
""", "/static/cached/styles.93b1147e8552.css")
def test_template_tag_simple_content(self):
relpath = self.cached_file_path("cached/styles.css")
self.assertEqual(relpath, "cached/styles.5653c259030b.css")
self.assertEqual(relpath, "cached/styles.93b1147e8552.css")
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertFalse("cached/other.css" in content, content)
@ -316,7 +316,7 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertFalse("/static/cached/styles.css" in content)
self.assertTrue("/static/cached/styles.5653c259030b.css" in content)
self.assertTrue("/static/cached/styles.93b1147e8552.css" in content)
def test_template_tag_denorm(self):
relpath = self.cached_file_path("cached/denorm.css")
@ -324,16 +324,26 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertFalse("..//cached///styles.css" in content)
self.assertTrue("/static/cached/styles.5653c259030b.css" in content)
self.assertTrue("/static/cached/styles.93b1147e8552.css" in content)
def test_template_tag_relative(self):
relpath = self.cached_file_path("cached/relative.css")
self.assertEqual(relpath, "cached/relative.298ff891a8d4.css")
self.assertEqual(relpath, "cached/relative.8dffb45d91f5.css")
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertFalse("../cached/styles.css" in content)
self.assertFalse('@import "styles.css"' in content)
self.assertTrue("/static/cached/styles.5653c259030b.css" in content)
self.assertTrue("/static/cached/styles.93b1147e8552.css" in content)
self.assertFalse("url(img/relative.png)" in content)
self.assertTrue("/static/cached/img/relative.acae32e4532b.png" in content)
def test_template_tag_deep_relative(self):
relpath = self.cached_file_path("cached/css/window.css")
self.assertEqual(relpath, "cached/css/window.9db38d5169f3.css")
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertFalse('url(img/window.png)' in content)
self.assertTrue('url("/static/cached/css/img/window.acae32e4532b.png")' in content)
def test_template_tag_url(self):
relpath = self.cached_file_path("cached/url.css")