[1.7.x] Fixed #23888 -- Fixed crash in File.__repr__() when name contains unicode.

Backport of 1e9ac504e4 from master
This commit is contained in:
Sergey Fedoseev 2014-11-21 19:26:46 +05:00 committed by Tim Graham
parent 014f699c8b
commit 78fe7ec14f
3 changed files with 12 additions and 9 deletions

View File

@ -3,10 +3,11 @@ from __future__ import unicode_literals
import os import os
from io import BytesIO, StringIO, UnsupportedOperation from io import BytesIO, StringIO, UnsupportedOperation
from django.utils.encoding import smart_text
from django.core.files.utils import FileProxyMixin from django.core.files.utils import FileProxyMixin
from django.utils import six 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 @python_2_unicode_compatible
@ -25,7 +26,7 @@ class File(FileProxyMixin):
return smart_text(self.name or '') return smart_text(self.name or '')
def __repr__(self): 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): def __bool__(self):
return bool(self.name) return bool(self.name)

View File

@ -77,3 +77,6 @@ Bugfixes
* Fixed a crash in migrations when deleting a field that is part of a * Fixed a crash in migrations when deleting a field that is part of a
``index/unique_together`` constraint (:ticket:`23794`). ``index/unique_together`` constraint (:ticket:`23794`).
* Fixed ``django.core.files.File.__repr__()`` when the file's ``name`` contains
Unicode characters (:ticket:`23888`).

View File

@ -26,13 +26,12 @@ except ImproperlyConfigured:
class FileTests(unittest.TestCase): class FileTests(unittest.TestCase):
def test_unicode_uploadedfile_name(self): 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') 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): def test_context_manager(self):
orig_file = tempfile.TemporaryFile() orig_file = tempfile.TemporaryFile()