diff --git a/django/core/files/utils.py b/django/core/files/utils.py index 8cc212fe1f..2656fa7188 100644 --- a/django/core/files/utils.py +++ b/django/core/files/utils.py @@ -1,3 +1,6 @@ +from django.utils import six + + class FileProxyMixin(object): """ A mixin class used to forward file methods to an underlaying file @@ -24,6 +27,8 @@ class FileProxyMixin(object): write = property(lambda self: self.file.write) writelines = property(lambda self: self.file.writelines) xreadlines = property(lambda self: self.file.xreadlines) + if six.PY3: + seekable = property(lambda self: self.file.seekable) def __iter__(self): return iter(self.file) diff --git a/docs/ref/files/file.txt b/docs/ref/files/file.txt index fd5a915426..74343d10f8 100644 --- a/docs/ref/files/file.txt +++ b/docs/ref/files/file.txt @@ -89,7 +89,12 @@ The ``File`` Class the following attributes and methods of its ``file`` object: ``encoding``, ``fileno``, ``flush``, ``isatty``, ``newlines``, ``read``, ``readinto``, ``readlines``, ``seek``, ``softspace``, ``tell``, - ``truncate``, ``writelines``, ``xreadlines``. + ``truncate``, ``writelines``, ``xreadlines``. If you are using + Python 3, the ``seekable`` method is also available. + + .. versionchanged:: 1.9 + + The ``seekable`` method was added. .. currentmodule:: django.core.files.base diff --git a/docs/releases/1.9.txt b/docs/releases/1.9.txt index 5be8f233b5..38e6723d30 100644 --- a/docs/releases/1.9.txt +++ b/docs/releases/1.9.txt @@ -200,6 +200,9 @@ File Storage ` is now called when the :attr:`~django.db.models.FileField.upload_to` is a callable. +* :class:`~django.core.files.File` now has the ``seekable()`` method when using + Python 3. + File Uploads ^^^^^^^^^^^^ diff --git a/tests/files/tests.py b/tests/files/tests.py index cd2ccaf9f1..2ce4d0139d 100644 --- a/tests/files/tests.py +++ b/tests/files/tests.py @@ -120,6 +120,19 @@ class FileTests(unittest.TestCase): f = File(StringIO('one\ntwo\nthree')) self.assertEqual(list(f), ['one\n', 'two\n', 'three']) + def test_seekable(self): + """ + File.seekable() should be available on Python 3. + """ + with tempfile.TemporaryFile() as temp: + temp.write(b"contents\n") + test_file = File(temp, name="something.txt") + if six.PY2: + self.assertFalse(hasattr(test_file, 'seekable')) + if six.PY3: + self.assertTrue(hasattr(test_file, 'seekable')) + self.assertTrue(test_file.seekable()) + class NoNameFileTestCase(unittest.TestCase): """