Commit 1e9ac504 authored by Sergey Fedoseev's avatar Sergey Fedoseev Committed by Tim Graham
Browse files

Fixed #23888 -- Fixed crash in File.__repr__() when name contains unicode.

parent ebb927c4
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -3,10 +3,11 @@ from __future__ import unicode_literals
import os
from io import BytesIO, StringIO, UnsupportedOperation

from django.utils.encoding import smart_text
from django.core.files.utils import FileProxyMixin
from django.utils import six
from django.utils.encoding import force_bytes, python_2_unicode_compatible
from django.utils.encoding import (
    force_bytes, force_str, python_2_unicode_compatible, smart_text,
)


@python_2_unicode_compatible
@@ -25,7 +26,7 @@ class File(FileProxyMixin):
        return smart_text(self.name or '')

    def __repr__(self):
        return "<%s: %s>" % (self.__class__.__name__, self or "None")
        return force_str("<%s: %s>" % (self.__class__.__name__, self or "None"))

    def __bool__(self):
        return bool(self.name)
+3 −0
Original line number Diff line number Diff line
@@ -77,3 +77,6 @@ Bugfixes

* Fixed a crash in migrations when deleting a field that is part of a
  ``index/unique_together`` constraint (:ticket:`23794`).

* Fixed ``django.core.files.File.__repr__()`` when the file's ``name`` contains
  Unicode characters (:ticket:`23888`).
+5 −6
Original line number Diff line number Diff line
@@ -26,13 +26,12 @@ else:

class FileTests(unittest.TestCase):
    def test_unicode_uploadedfile_name(self):
        """
        Regression test for #8156: files with unicode names I can't quite figure
        out the encoding situation between doctest and this file, but the actual
        repr doesn't matter; it just shouldn't return a unicode object.
        """
        uf = UploadedFile(name='¿Cómo?', content_type='text')
        self.assertEqual(type(uf.__repr__()), str)
        self.assertIs(type(repr(uf)), str)

    def test_unicode_file_name(self):
        f = File(None, 'djángö')
        self.assertIs(type(repr(f)), str)

    def test_context_manager(self):
        orig_file = tempfile.TemporaryFile()