diff options
| author | Gaël Utard <gael.utard@eedf.fr> | 2025-02-15 15:55:33 +0100 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2025-02-17 14:06:03 +0100 |
| commit | a9d03c409406f3f95f692bc5545ebacc7f4e2e4f (patch) | |
| tree | 9746260f5fecfcc55555c0c934649ff2aedfacd5 | |
| parent | 20e965e869d657a3a24ddac6065ee494f283aa18 (diff) | |
[5.1.x] Fixed #36191 -- Truncated the overwritten file content in FileSystemStorage.
Backport of 0d1dd6bba0c18b7feb6caa5cbd8df80fbac54afd from main.
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/core/files/storage/filesystem.py | 4 | ||||
| -rw-r--r-- | docs/releases/5.1.7.txt | 4 | ||||
| -rw-r--r-- | tests/file_storage/tests.py | 12 |
4 files changed, 19 insertions, 2 deletions
@@ -361,6 +361,7 @@ answer newbie questions, and generally made Django that much better: Fraser Nevett <mail@nevett.org> Gabriel Grant <g@briel.ca> Gabriel Hurley <gabriel@strikeawe.com> + Gaël Utard gandalf@owca.info Garry Lawrence Garry Polley <garrympolley@gmail.com> diff --git a/django/core/files/storage/filesystem.py b/django/core/files/storage/filesystem.py index bf2b9caad4..1bd9aa0a6c 100644 --- a/django/core/files/storage/filesystem.py +++ b/django/core/files/storage/filesystem.py @@ -129,11 +129,11 @@ class FileSystemStorage(Storage, StorageSettingsMixin): ) # RemovedInDjango60Warning: when the deprecation ends, replace with: # if self._allow_overwrite: - # open_flags = open_flags & ~os.O_EXCL + # open_flags = open_flags & ~os.O_EXCL | os.O_TRUNC if self.OS_OPEN_FLAGS != open_flags: open_flags = self.OS_OPEN_FLAGS elif self._allow_overwrite: - open_flags = open_flags & ~os.O_EXCL + open_flags = open_flags & ~os.O_EXCL | os.O_TRUNC fd = os.open(full_path, open_flags, 0o666) _file = None try: diff --git a/docs/releases/5.1.7.txt b/docs/releases/5.1.7.txt index e184da6aca..deda4f2f92 100644 --- a/docs/releases/5.1.7.txt +++ b/docs/releases/5.1.7.txt @@ -12,3 +12,7 @@ Bugfixes * Fixed a bug in Django 5.1 where the ``{% querystring %}`` template tag returned an empty string rather than ``"?"`` when all parameters had been removed from the query string (:ticket:`36182`). + +* Fixed a bug in Django 5.1 where ``FileSystemStorage``, with + ``allow_overwrite`` set to ``True``, did not truncate the overwritten file + content (:ticket:`36191`). diff --git a/tests/file_storage/tests.py b/tests/file_storage/tests.py index 9b643128d1..7f0a68b0c5 100644 --- a/tests/file_storage/tests.py +++ b/tests/file_storage/tests.py @@ -704,6 +704,18 @@ class OverwritingStorageTests(FileStorageTests): finally: self.storage.delete(name) + def test_save_overwrite_behavior_truncate(self): + name = "test.file" + original_content = b"content extra extra extra" + new_smaller_content = b"content" + self.storage.save(name, ContentFile(original_content)) + try: + self.storage.save(name, ContentFile(new_smaller_content)) + with self.storage.open(name) as fp: + self.assertEqual(fp.read(), new_smaller_content) + finally: + self.storage.delete(name) + def test_save_overwrite_behavior_temp_file(self): """Saving to same file name twice overwrites the first file.""" name = "test.file" |
