Commit 4e70ad11 authored by Claude Paroz's avatar Claude Paroz
Browse files

Made FileSystemStorage accept both text and byte streams

Thanks Alexey Boriskin for his help on the patch.
parent b5240d25
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -195,10 +195,17 @@ class FileSystemStorage(Storage):
                    fd = os.open(full_path, os.O_WRONLY | os.O_CREAT | os.O_EXCL | getattr(os, 'O_BINARY', 0))
                    try:
                        locks.lock(fd, locks.LOCK_EX)
                        _file = None
                        for chunk in content.chunks():
                            os.write(fd, chunk)
                            if _file is None:
                                mode = 'wb' if isinstance(chunk, bytes) else 'wt'
                                _file = os.fdopen(fd, mode)
                            _file.write(chunk)
                    finally:
                        locks.unlock(fd)
                        if _file is not None:
                            _file.close()
                        else:
                            os.close(fd)
            except OSError as e:
                if e.errno == errno.EEXIST:
+11 −0
Original line number Diff line number Diff line
@@ -356,6 +356,17 @@ class FileStorageTests(unittest.TestCase):
        finally:
            os.remove = real_remove

    def test_file_chunks_error(self):
        """
        Test behaviour when file.chunks() is raising an error
        """
        f1 = ContentFile('chunks fails')
        def failing_chunks():
            raise IOError
        f1.chunks = failing_chunks
        with self.assertRaises(IOError):
            self.storage.save('error.file', f1)


class CustomStorage(FileSystemStorage):
    def get_available_name(self, name):