From e2112edd9ac6a5f1877a62dd1c88d2d1726350de Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Fri, 6 Jun 2014 23:41:15 -0400 Subject: [PATCH] Fixed #22772 -- Defer wizard temporary files deletion. --- django/contrib/formtools/tests/wizard/storage.py | 3 ++- django/contrib/formtools/wizard/storage/base.py | 9 +++++++-- 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)