Browse Source

Fixed #26495 -- Added name arg to Storage.save()'s File wrapping.

Maxim Novikov 9 years ago
parent
commit
4d1c229ee5
2 changed files with 24 additions and 1 deletions
  1. 1 1
      django/core/files/storage.py
  2. 23 0
      tests/file_storage/tests.py

+ 1 - 1
django/core/files/storage.py

@@ -48,7 +48,7 @@ class Storage(object):
             name = content.name
 
         if not hasattr(content, 'chunks'):
-            content = File(content)
+            content = File(content, name)
 
         name = self.get_available_name(name, max_length=max_length)
         name = self._save(name, content)

+ 23 - 0
tests/file_storage/tests.py

@@ -644,6 +644,29 @@ class CustomStorageLegacyDatetimeHandlingTests(FileStorageTests):
     storage_class = CustomStorageLegacyDatetimeHandling
 
 
+class DiscardingFalseContentStorage(FileSystemStorage):
+    def _save(self, name, content):
+        if content:
+            return super(DiscardingFalseContentStorage, self)._save(name, content)
+        return ''
+
+
+class DiscardingFalseContentStorageTests(FileStorageTests):
+    storage_class = DiscardingFalseContentStorage
+
+    def test_custom_storage_discarding_empty_content(self):
+        """
+        When Storage.save() wraps a file-like object in File, it should include
+        the name argument so that bool(file) evaluates to True (#26495).
+        """
+        output = six.StringIO('content')
+        self.storage.save('tests/stringio', output)
+        self.assertTrue(self.storage.exists('tests/stringio'))
+
+        with self.storage.open('tests/stringio') as f:
+            self.assertEqual(f.read(), b'content')
+
+
 class FileFieldStorageTests(TestCase):
     def tearDown(self):
         shutil.rmtree(temp_storage_location)