Author: kmtracey
Date: 2008-11-04 13:54:28 -0600 (Tue, 04 Nov 2008)
New Revision: 9335

Modified:
   django/branches/releases/1.0.X/
   django/branches/releases/1.0.X/AUTHORS
   django/branches/releases/1.0.X/django/forms/models.py
   django/branches/releases/1.0.X/tests/modeltests/model_forms/models.py
Log:
[1.0.X] Fixed #9418 -- When saving a model form, defer saving of file-type 
fields until after other fields, so that callable upload_to methods can use 
data from the other fields. Thanks to Bernd Schlapsi for the report and initial 
patch.

[9334] from trunk.



Property changes on: django/branches/releases/1.0.X
___________________________________________________________________
Name: svnmerge-integrated
   - 
/django/trunk:1-9097,9099-9102,9104-9109,9111,9113-9144,9146-9151,9153-9156,9158-9159,9161-9187,9189-9247,9249-9262,9264-9277,9279-9298,9301-9302,9305-9330
   + 
/django/trunk:1-9097,9099-9102,9104-9109,9111,9113-9144,9146-9151,9153-9156,9158-9159,9161-9187,9189-9247,9249-9262,9264-9277,9279-9298,9301-9302,9305-9331,9333-9334

Modified: django/branches/releases/1.0.X/AUTHORS
===================================================================
--- django/branches/releases/1.0.X/AUTHORS      2008-11-04 19:48:35 UTC (rev 
9334)
+++ django/branches/releases/1.0.X/AUTHORS      2008-11-04 19:54:28 UTC (rev 
9335)
@@ -342,6 +342,7 @@
     Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
     Vinay Sajip <[EMAIL PROTECTED]>
     David Schein
+    Bernd Schlapsi
     [EMAIL PROTECTED]
     Ilya Semenov <[EMAIL PROTECTED]>
     [EMAIL PROTECTED]

Modified: django/branches/releases/1.0.X/django/forms/models.py
===================================================================
--- django/branches/releases/1.0.X/django/forms/models.py       2008-11-04 
19:48:35 UTC (rev 9334)
+++ django/branches/releases/1.0.X/django/forms/models.py       2008-11-04 
19:54:28 UTC (rev 9335)
@@ -41,6 +41,7 @@
         raise ValueError("The %s could not be %s because the data didn't"
                          " validate." % (opts.object_name, fail_message))
     cleaned_data = form.cleaned_data
+    file_field_list = []
     for f in opts.fields:
         if not f.editable or isinstance(f, models.AutoField) \
                 or not f.name in cleaned_data:
@@ -49,7 +50,16 @@
             continue
         if exclude and f.name in exclude:
             continue
+        # Defer saving file-type fields until after the other fields, so a
+        # callable upload_to can use the values from other fields.
+        if isinstance(f, models.FileField):
+            file_field_list.append(f)
+        else:
+            f.save_form_data(instance, cleaned_data[f.name])
+            
+    for f in file_field_list:
         f.save_form_data(instance, cleaned_data[f.name])
+        
     # Wrap up the saving of m2m data as a function.
     def save_m2m():
         opts = instance._meta

Modified: django/branches/releases/1.0.X/tests/modeltests/model_forms/models.py
===================================================================
--- django/branches/releases/1.0.X/tests/modeltests/model_forms/models.py       
2008-11-04 19:48:35 UTC (rev 9334)
+++ django/branches/releases/1.0.X/tests/modeltests/model_forms/models.py       
2008-11-04 19:54:28 UTC (rev 9335)
@@ -99,6 +99,10 @@
         return self.description
 
 class ImageFile(models.Model):
+    def custom_upload_path(self, filename):
+        path = self.path or 'tests'
+        return '%s/%s' % (path, filename)
+    
     description = models.CharField(max_length=20)
     try:
         # If PIL is available, try testing PIL.
@@ -106,9 +110,10 @@
         # for PyPy, you need to check for the underlying modules
         # If PIL is not available, this test is equivalent to TextFile above.
         from PIL import Image, _imaging
-        image = models.ImageField(storage=temp_storage, upload_to='tests')
+        image = models.ImageField(storage=temp_storage, 
upload_to=custom_upload_path)
     except ImportError:
-        image = models.FileField(storage=temp_storage, upload_to='tests')
+        image = models.FileField(storage=temp_storage, 
upload_to=custom_upload_path)
+    path = models.CharField(max_length=16, blank=True, default='')
 
     def __unicode__(self):
         return self.description
@@ -1122,6 +1127,15 @@
 <...FieldFile: tests/test3.png>
 >>> instance.delete()
 
+# Test callable upload_to behavior that's dependent on the value of another 
field in the model
+>>> f = ImageFileForm(data={'description': u'And a final one', 'path': 'foo'}, 
files={'image': SimpleUploadedFile('test4.png', image_data)})
+>>> f.is_valid()
+True
+>>> instance = f.save()
+>>> instance.image
+<...FieldFile: foo/test4.png>
+>>> instance.delete()
+
 # Media on a ModelForm ########################################################
 
 # Similar to a regular Form class you can define custom media to be used on


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to