Author: jacob
Date: 2009-04-18 15:29:55 -0500 (Sat, 18 Apr 2009)
New Revision: 10588

Modified:
   django/trunk/django/forms/forms.py
   django/trunk/tests/regressiontests/admin_views/models.py
   django/trunk/tests/regressiontests/admin_views/tests.py
Log:
Fixed #10002: inline file uploads now correctly display prior data. Thanks, 
dgouldin.

Modified: django/trunk/django/forms/forms.py
===================================================================
--- django/trunk/django/forms/forms.py  2009-04-18 20:17:17 UTC (rev 10587)
+++ django/trunk/django/forms/forms.py  2009-04-18 20:29:55 UTC (rev 10588)
@@ -380,7 +380,10 @@
             if callable(data):
                 data = data()
         else:
-            data = self.data
+            if isinstance(self.field, FileField) and self.data is None:
+                data = self.form.initial.get(self.name, self.field.initial)
+            else:
+                data = self.data
         if not only_initial:
             name = self.html_name
         else:

Modified: django/trunk/tests/regressiontests/admin_views/models.py
===================================================================
--- django/trunk/tests/regressiontests/admin_views/models.py    2009-04-18 
20:17:17 UTC (rev 10587)
+++ django/trunk/tests/regressiontests/admin_views/models.py    2009-04-18 
20:29:55 UTC (rev 10588)
@@ -1,4 +1,7 @@
 # -*- coding: utf-8 -*-
+import tempfile
+import os
+from django.core.files.storage import FileSystemStorage
 from django.db import models
 from django.contrib import admin
 from django.core.mail import EmailMessage
@@ -291,6 +294,27 @@
 class OldSubscriberAdmin(admin.ModelAdmin):
     actions = None
 
+temp_storage = FileSystemStorage(tempfile.mkdtemp())
+UPLOAD_TO = os.path.join(temp_storage.location, 'test_upload')
+
+class Gallery(models.Model):
+    name = models.CharField(max_length=100)
+
+class Picture(models.Model):
+    name = models.CharField(max_length=100)
+    image = models.FileField(storage=temp_storage, upload_to='test_upload')
+    gallery = models.ForeignKey(Gallery, related_name="pictures")
+
+class PictureInline(admin.TabularInline):
+    model = Picture
+    extra = 1
+
+class GalleryAdmin(admin.ModelAdmin):
+    inlines = [PictureInline]
+
+class PictureAdmin(admin.ModelAdmin):
+    pass
+
 admin.site.register(Article, ArticleAdmin)
 admin.site.register(CustomArticle, CustomArticleAdmin)
 admin.site.register(Section, save_as=True, inlines=[ArticleInline])
@@ -306,6 +330,8 @@
 admin.site.register(Parent, ParentAdmin)
 admin.site.register(EmptyModel, EmptyModelAdmin)
 admin.site.register(Fabric, FabricAdmin)
+admin.site.register(Gallery, GalleryAdmin)
+admin.site.register(Picture, PictureAdmin)
 
 # We intentionally register Promo and ChapterXtra1 but not Chapter nor 
ChapterXtra2.
 # That way we cover all four cases:

Modified: django/trunk/tests/regressiontests/admin_views/tests.py
===================================================================
--- django/trunk/tests/regressiontests/admin_views/tests.py     2009-04-18 
20:17:17 UTC (rev 10587)
+++ django/trunk/tests/regressiontests/admin_views/tests.py     2009-04-18 
20:29:55 UTC (rev 10588)
@@ -2,7 +2,9 @@
 
 import re
 import datetime
+import os
 
+from django.core.files import temp as tempfile
 from django.test import TestCase
 from django.contrib.auth.models import User, Permission
 from django.contrib.contenttypes.models import ContentType
@@ -13,7 +15,10 @@
 from django.utils.html import escape
 
 # local test models
-from models import Article, CustomArticle, Section, ModelWithStringPrimaryKey, 
Person, Persona, FooAccount, BarAccount, Subscriber, ExternalSubscriber, 
Podcast, EmptyModel
+from models import (Article, BarAccount, CustomArticle, EmptyModel,
+                    ExternalSubscriber, FooAccount, Gallery,
+                    ModelWithStringPrimaryKey, Person, Persona, Picture,
+                    Podcast, Section, Subscriber)
 
 try:
     set
@@ -1039,7 +1044,6 @@
         response = self.client.get('/test_admin/admin/admin_views/parent/add/')
         self.failUnlessEqual(response.status_code, 200)
 
-
 class AdminCustomQuerysetTest(TestCase):
     fixtures = ['admin-views-users.xml']
 
@@ -1062,3 +1066,47 @@
                 self.assertEqual(response.status_code, 200)
             else:
                 self.assertEqual(response.status_code, 404)
+
+class AdminInlineFileUploadTest(TestCase):
+    fixtures = ['admin-views-users.xml', 'admin-views-actions.xml']
+    urlbit = 'admin'
+
+    def setUp(self):
+        self.client.login(username='super', password='secret')
+        
+        # Set up test Picture and Gallery.
+        # These must be set up here instead of in fixtures in order to allow 
Picture
+        # to use a NamedTemporaryFile.
+        tdir = tempfile.gettempdir()
+        file1 = tempfile.NamedTemporaryFile(suffix=".file1", dir=tdir)
+        file1.write('a' * (2 ** 21))
+        filename = file1.name
+        file1.close()
+        g = Gallery(name="Test Gallery")
+        g.save()
+        p = Picture(name="Test Picture", image=filename, gallery=g)
+        p.save()
+
+    def tearDown(self):
+        self.client.logout()
+
+    def test_inline_file_upload_edit_validation_error_post(self):
+        """
+        Test that inline file uploads correctly display prior data (#10002). 
+        """
+        post_data = {
+            "name": u"Test Gallery",
+            "pictures-TOTAL_FORMS": u"2",
+            "pictures-INITIAL_FORMS": u"1",
+            "pictures-0-id": u"1",
+            "pictures-0-gallery": u"1",
+            "pictures-0-name": "Test Picture",
+            "pictures-0-image": "",
+            "pictures-1-id": "",
+            "pictures-1-gallery": "1",
+            "pictures-1-name": "Test Picture 2",
+            "pictures-1-image": "",
+        }
+        response = self.client.post('/test_admin/%s/admin_views/gallery/1/' % 
self.urlbit, post_data)
+        self.failUnless(response._container[0].find("Currently:") > -1)
+


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

Reply via email to