Commit e93e0c03 authored by Carson Gee's avatar Carson Gee Committed by Tim Graham
Browse files

Fixed #24963 -- Added File.seekable() on Python 3.

parent 3c593ba7
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
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)
+6 −1
Original line number Diff line number Diff line
@@ -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

+3 −0
Original line number Diff line number Diff line
@@ -200,6 +200,9 @@ File Storage
  <django.core.files.storage.Storage.get_valid_name>` 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
^^^^^^^^^^^^

+13 −0
Original line number Diff line number Diff line
@@ -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):
    """