summaryrefslogtreecommitdiff
path: root/parts/django/tests/regressiontests/bug639
diff options
context:
space:
mode:
Diffstat (limited to 'parts/django/tests/regressiontests/bug639')
-rw-r--r--parts/django/tests/regressiontests/bug639/__init__.py0
-rw-r--r--parts/django/tests/regressiontests/bug639/models.py26
-rw-r--r--parts/django/tests/regressiontests/bug639/test.jpgbin0 -> 1780 bytes
-rw-r--r--parts/django/tests/regressiontests/bug639/tests.py41
4 files changed, 67 insertions, 0 deletions
diff --git a/parts/django/tests/regressiontests/bug639/__init__.py b/parts/django/tests/regressiontests/bug639/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/parts/django/tests/regressiontests/bug639/__init__.py
diff --git a/parts/django/tests/regressiontests/bug639/models.py b/parts/django/tests/regressiontests/bug639/models.py
new file mode 100644
index 0000000..b7e3880
--- /dev/null
+++ b/parts/django/tests/regressiontests/bug639/models.py
@@ -0,0 +1,26 @@
+import tempfile
+
+from django.db import models
+from django.core.files.storage import FileSystemStorage
+from django.forms import ModelForm
+
+temp_storage_dir = tempfile.mkdtemp()
+temp_storage = FileSystemStorage(temp_storage_dir)
+
+class Photo(models.Model):
+ title = models.CharField(max_length=30)
+ image = models.FileField(storage=temp_storage, upload_to='tests')
+
+ # Support code for the tests; this keeps track of how many times save()
+ # gets called on each instance.
+ def __init__(self, *args, **kwargs):
+ super(Photo, self).__init__(*args, **kwargs)
+ self._savecount = 0
+
+ def save(self, force_insert=False, force_update=False):
+ super(Photo, self).save(force_insert, force_update)
+ self._savecount += 1
+
+class PhotoForm(ModelForm):
+ class Meta:
+ model = Photo
diff --git a/parts/django/tests/regressiontests/bug639/test.jpg b/parts/django/tests/regressiontests/bug639/test.jpg
new file mode 100644
index 0000000..391b57a
--- /dev/null
+++ b/parts/django/tests/regressiontests/bug639/test.jpg
Binary files differ
diff --git a/parts/django/tests/regressiontests/bug639/tests.py b/parts/django/tests/regressiontests/bug639/tests.py
new file mode 100644
index 0000000..2cc3a8a
--- /dev/null
+++ b/parts/django/tests/regressiontests/bug639/tests.py
@@ -0,0 +1,41 @@
+"""
+Tests for file field behavior, and specifically #639, in which Model.save()
+gets called *again* for each FileField. This test will fail if calling a
+ModelForm's save() method causes Model.save() to be called more than once.
+"""
+
+import os
+import shutil
+import unittest
+
+from django.core.files.uploadedfile import SimpleUploadedFile
+from regressiontests.bug639.models import Photo, PhotoForm, temp_storage_dir
+
+class Bug639Test(unittest.TestCase):
+
+ def testBug639(self):
+ """
+ Simulate a file upload and check how many times Model.save() gets
+ called.
+ """
+ # Grab an image for testing.
+ filename = os.path.join(os.path.dirname(__file__), "test.jpg")
+ img = open(filename, "rb").read()
+
+ # Fake a POST QueryDict and FILES MultiValueDict.
+ data = {'title': 'Testing'}
+ files = {"image": SimpleUploadedFile('test.jpg', img, 'image/jpeg')}
+
+ form = PhotoForm(data=data, files=files)
+ p = form.save()
+
+ # Check the savecount stored on the object (see the model).
+ self.assertEqual(p._savecount, 1)
+
+ def tearDown(self):
+ """
+ Make sure to delete the "uploaded" file to avoid clogging /tmp.
+ """
+ p = Photo.objects.get()
+ p.image.delete(save=False)
+ shutil.rmtree(temp_storage_dir)