Author: jezdez
Date: 2011-09-21 08:58:21 -0700 (Wed, 21 Sep 2011)
New Revision: 16862

Added:
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/img/
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/img/window.png
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/window.css
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/img/
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/img/relative.png
Modified:
   django/trunk/django/contrib/staticfiles/storage.py
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/relative.css
   
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/styles.css
   django/trunk/tests/regressiontests/staticfiles_tests/tests.py
Log:
Fixed the relative static file resolution of the CachedStaticFilesStorage 
backend and the post processing of deeply nested static files.

Modified: django/trunk/django/contrib/staticfiles/storage.py
===================================================================
--- django/trunk/django/contrib/staticfiles/storage.py  2011-09-21 14:20:18 UTC 
(rev 16861)
+++ django/trunk/django/contrib/staticfiles/storage.py  2011-09-21 15:58:21 UTC 
(rev 16862)
@@ -113,13 +113,22 @@
                 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

Added: 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/img/window.png
===================================================================
--- 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/img/window.png
                            (rev 0)
+++ 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/img/window.png
    2011-09-21 15:58:21 UTC (rev 16862)
@@ -0,0 +1,4 @@
+‰PNG
+ 
+   
+IHDR             © ¥–   –IDAT8ËÅÕm À  ОÀ NíT¸‰›t!i"¾Z4Y“eÁ¼0 ¤”Ð9‡! |  cµ  
4` Ë ¨ò nÁ Ð6ÞÀ=8 §ðœ¢ [k‡ %à å:íÚ¶èª3 ²h H@ J°1¦> ø ª>}õ…RßR’Ñ m~é   Ó 
P”PnÀmê{ §IZ  ® ï=æœQ+Šõ á 5Ý…¹¡L    IEND®B`‚
\ No newline at end of file

Added: 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/window.css
===================================================================
--- 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/window.css
                                (rev 0)
+++ 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/css/window.css
        2011-09-21 15:58:21 UTC (rev 16862)
@@ -0,0 +1,3 @@
+body {
+    background: #d3d6d8 url("img/window.png");
+}
\ No newline at end of file

Added: 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/img/relative.png
===================================================================
--- 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/img/relative.png
                              (rev 0)
+++ 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/img/relative.png
      2011-09-21 15:58:21 UTC (rev 16862)
@@ -0,0 +1,4 @@
+‰PNG
+ 
+   
+IHDR             © ¥–   –IDAT8ËÅÕm À  ОÀ NíT¸‰›t!i"¾Z4Y“eÁ¼0 ¤”Ð9‡! |  cµ  
4` Ë ¨ò nÁ Ð6ÞÀ=8 §ðœ¢ [k‡ %à å:íÚ¶èª3 ²h H@ J°1¦> ø ª>}õ…RßR’Ñ m~é   Ó 
P”PnÀmê{ §IZ  ® ï=æœQ+Šõ á 5Ý…¹¡L    IEND®B`‚
\ No newline at end of file

Modified: 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/relative.css
===================================================================
--- 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/relative.css
  2011-09-21 14:20:18 UTC (rev 16861)
+++ 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/relative.css
  2011-09-21 15:58:21 UTC (rev 16862)
@@ -1,2 +1,5 @@
 @import url("../cached/styles.css");
-@import url("absolute.css");
\ No newline at end of file
+@import url("absolute.css");
+body {
+    background: #d3d6d8 url(img/relative.png);
+}
\ No newline at end of file

Modified: 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/styles.css
===================================================================
--- 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/styles.css
    2011-09-21 14:20:18 UTC (rev 16861)
+++ 
django/trunk/tests/regressiontests/staticfiles_tests/project/documents/cached/styles.css
    2011-09-21 15:58:21 UTC (rev 16862)
@@ -1 +1 @@
-@import url("cached/other.css");
\ No newline at end of file
+@import url("other.css");
\ No newline at end of file

Modified: django/trunk/tests/regressiontests/staticfiles_tests/tests.py
===================================================================
--- django/trunk/tests/regressiontests/staticfiles_tests/tests.py       
2011-09-21 14:20:18 UTC (rev 16861)
+++ django/trunk/tests/regressiontests/staticfiles_tests/tests.py       
2011-09-21 15:58:21 UTC (rev 16862)
@@ -300,11 +300,11 @@
             """, "/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 @@
         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,17 +324,27 @@
         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")
         self.assertEqual(relpath, "cached/url.615e21601e4b.css")

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to