Fixed #11857 -- Added missing 'closed' property on TemporaryFile class.

- TemporaryFile now minimally mocks the API of the Python standard
  library class tempfile.NamedTemporaryFile to avoid AttributeError
  exceptions.
- The symbol django.core.files.NamedTemporaryFile is actually assigned
  as a different class on different operating systems.
- The bug only occurred if Django is running on Windows, hence why it
  was hard to diagnose.
This commit is contained in:
Christopher Adams 2013-09-06 14:23:50 -04:00
parent 05e14e8eaf
commit b2f5ac1656
2 changed files with 24 additions and 0 deletions

View File

@ -46,6 +46,15 @@ if os.name == 'nt':
except (OSError): except (OSError):
pass pass
@property
def closed(self):
"""
This attribute needs to be accessible in certain situations,
because this class is supposed to mock the API of the class
tempfile.NamedTemporaryFile in the Python standard library.
"""
return self.file.closed
def __del__(self): def __del__(self):
self.close() self.close()

View File

@ -11,6 +11,7 @@ from django.core.files import File
from django.core.files.move import file_move_safe from django.core.files.move import file_move_safe
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.files.temp import NamedTemporaryFile
from django.test import TestCase from django.test import TestCase
from django.utils.six import StringIO from django.utils.six import StringIO
@ -142,6 +143,20 @@ class FileTests(unittest.TestCase):
self.assertTrue(f.closed) self.assertTrue(f.closed)
self.assertTrue(orig_file.closed) self.assertTrue(orig_file.closed)
def test_namedtemporaryfile_closes(self):
"""
The symbol django.core.files.NamedTemporaryFile is assigned as
a different class on different operating systems. In
any case, the result should minimally mock some of the API of
tempfile.NamedTemporaryFile from the Python standard library.
"""
tempfile = NamedTemporaryFile()
self.assertTrue(hasattr(tempfile, "closed"))
self.assertFalse(tempfile.closed)
tempfile.close()
self.assertTrue(tempfile.closed)
def test_file_mode(self): def test_file_mode(self):
# Should not set mode to None if it is not present. # Should not set mode to None if it is not present.
# See #14681, stdlib gzip module crashes if mode is set to None # See #14681, stdlib gzip module crashes if mode is set to None