summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2014-06-06 23:41:15 -0400
committerSimon Charette <charette.s@gmail.com>2014-06-07 19:57:58 -0400
commit2b13576c8f48bde808f58621ff26e5b1ab3ed4c1 (patch)
tree4b2fd5592a90640bacbdc461066f8edfa882dd44
parent211ff288a03ba4623399e222d15a33075e958f0a (diff)
[1.7.x] Fixed #22772 -- Defer wizard temporary files deletion.
Backport of e2112edd9a from master
-rw-r--r--django/contrib/formtools/tests/wizard/storage.py3
-rw-r--r--django/contrib/formtools/wizard/storage/base.py9
2 files changed, 9 insertions, 3 deletions
diff --git a/django/contrib/formtools/tests/wizard/storage.py b/django/contrib/formtools/tests/wizard/storage.py
index cec2c01599..b047b1135d 100644
--- a/django/contrib/formtools/tests/wizard/storage.py
+++ b/django/contrib/formtools/tests/wizard/storage.py
@@ -3,7 +3,7 @@ from importlib import import_module
import os
import tempfile
-from django.http import HttpRequest
+from django.http import HttpRequest, HttpResponse
from django.conf import settings
from django.contrib.auth.models import User
from django.core.files.storage import FileSystemStorage
@@ -107,4 +107,5 @@ class TestStorage(object):
self.assertTrue(storage.file_storage.exists(tmp_name))
storage.reset()
+ storage.update_response(HttpResponse())
self.assertFalse(storage.file_storage.exists(tmp_name))
diff --git a/django/contrib/formtools/wizard/storage/base.py b/django/contrib/formtools/wizard/storage/base.py
index f9ef9d6e49..a0c0ac0658 100644
--- a/django/contrib/formtools/wizard/storage/base.py
+++ b/django/contrib/formtools/wizard/storage/base.py
@@ -17,6 +17,7 @@ class BaseStorage(object):
self.request = request
self.file_storage = file_storage
self._files = {}
+ self._tmp_files = []
def init_data(self):
self.data = {
@@ -27,11 +28,13 @@ class BaseStorage(object):
}
def reset(self):
- # Delete temporary files before breaking reference to them.
+ # Store unused temporary file names in order to delete them
+ # at the end of the response cycle through a callback attached in
+ # `update_response`.
wizard_files = self.data[self.step_files_key]
for step_files in six.itervalues(wizard_files):
for step_file in six.itervalues(step_files):
- self.file_storage.delete(step_file['tmp_name'])
+ self._tmp_files.append(step_file['tmp_name'])
self.init_data()
def _get_current_step(self):
@@ -118,6 +121,8 @@ class BaseStorage(object):
for file in self._files.values():
if not file.closed:
file.close()
+ for tmp_file in self._tmp_files:
+ self.file_storage.delete(tmp_file)
if hasattr(response, 'render'):
response.add_post_render_callback(post_render_callback)