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:
parent
05e14e8eaf
commit
b2f5ac1656
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue