Browse Source

Refs #28428 -- Made FileSystemStorage.save() to support pathlib.Path.

Hasan Ramezani 5 years ago
parent
commit
17752003a8

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

@@ -291,7 +291,7 @@ class FileSystemStorage(Storage):
             os.chmod(full_path, self.file_permissions_mode)
             os.chmod(full_path, self.file_permissions_mode)
 
 
         # Store filenames with forward slashes, even on Windows.
         # Store filenames with forward slashes, even on Windows.
-        return name.replace('\\', '/')
+        return str(name).replace('\\', '/')
 
 
     def delete(self, name):
     def delete(self, name):
         assert name, "The name argument is not allowed to be empty."
         assert name, "The name argument is not allowed to be empty."

+ 5 - 0
docs/ref/files/storage.txt

@@ -69,6 +69,11 @@ The ``FileSystemStorage`` class
         time of the last metadata change, and on others (like Windows), it's
         time of the last metadata change, and on others (like Windows), it's
         the creation time of the file.
         the creation time of the file.
 
 
+.. versionchanged:: 3.1
+
+    Support for :class:`pathlib.Path` was added to the
+    ``FileSystemStorage.save()`` method.
+
 The ``Storage`` class
 The ``Storage`` class
 =====================
 =====================
 
 

+ 1 - 1
docs/releases/3.1.txt

@@ -124,7 +124,7 @@ Email
 File Storage
 File Storage
 ~~~~~~~~~~~~
 ~~~~~~~~~~~~
 
 
-* ...
+* ``FileSystemStorage.save()`` method now supports :class:`pathlib.Path`.
 
 
 File Uploads
 File Uploads
 ~~~~~~~~~~~~
 ~~~~~~~~~~~~

+ 3 - 3
tests/file_storage/tests.py

@@ -545,7 +545,7 @@ class FileStorageTests(SimpleTestCase):
         p = Path('test.file')
         p = Path('test.file')
         self.assertFalse(self.storage.exists(p))
         self.assertFalse(self.storage.exists(p))
         f = ContentFile('custom contents')
         f = ContentFile('custom contents')
-        f_name = self.storage.save(str(p), f)
+        f_name = self.storage.save(p, f)
         # Storage basic methods.
         # Storage basic methods.
         self.assertEqual(self.storage.path(p), os.path.join(self.temp_dir, p))
         self.assertEqual(self.storage.path(p), os.path.join(self.temp_dir, p))
         self.assertEqual(self.storage.size(p), 15)
         self.assertEqual(self.storage.size(p), 15)
@@ -560,10 +560,10 @@ class CustomStorage(FileSystemStorage):
         """
         """
         Append numbers to duplicate files rather than underscores, like Trac.
         Append numbers to duplicate files rather than underscores, like Trac.
         """
         """
-        basename, *ext = name.split('.')
+        basename, *ext = os.path.splitext(name)
         number = 2
         number = 2
         while self.exists(name):
         while self.exists(name):
-            name = '.'.join([basename, str(number)] + ext)
+            name = ''.join([basename, '.', str(number)] + ext)
             number += 1
             number += 1
 
 
         return name
         return name