Code

Ticket #7651: 7651-fixes.diff

File 7651-fixes.diff, 5.5 KB (added by axiak, 6 years ago)

Fixes with test for multiple files.

Line 
1Index: django/http/multipartparser.py
2===================================================================
3--- django/http/multipartparser.py      (revision 7857)
4+++ django/http/multipartparser.py      (working copy)
5@@ -136,6 +136,7 @@
6                     # since we cannot be sure a file is complete until
7                     # we hit the next boundary/part of the multipart content.
8                     self.handle_file_complete(old_field_name, counters)
9+                    old_field_name = None
10 
11                 try:
12                     disposition = meta_data['content-disposition'][1]
13Index: django/test/client.py
14===================================================================
15--- django/test/client.py       (revision 7857)
16+++ django/test/client.py       (working copy)
17@@ -90,32 +90,38 @@
18     """
19     lines = []
20     to_str = lambda s: smart_str(s, settings.DEFAULT_CHARSET)
21-    for (key, value) in data.items():
22-        if isinstance(value, file):
23-            lines.extend([
24+
25+    def encode_file(key, value):
26+        lines.extend([
27                 '--' + boundary,
28                 'Content-Disposition: form-data; name="%s"; filename="%s"' \
29                     % (to_str(key), to_str(os.path.basename(value.name))),
30                 'Content-Type: application/octet-stream',
31                 '',
32                 value.read()
33-            ])
34+                ])
35+
36+    for (key, value) in data.items():
37+        if isinstance(value, file):
38+            encode_file(key, value)
39+        elif not isinstance(value, basestring) and is_iterable(value):
40+            for item in value:
41+                if isinstance(item, file):
42+                    encode_file(key, item)
43+                else:
44+                    lines.extend([
45+                            '--' + boundary,
46+                            'Content-Disposition: form-data; name="%s"' % to_str(key),
47+                            '',
48+                            to_str(item)
49+                            ])
50         else:
51-            if not isinstance(value, basestring) and is_iterable(value):
52-                for item in value:
53-                    lines.extend([
54-                        '--' + boundary,
55-                        'Content-Disposition: form-data; name="%s"' % to_str(key),
56-                        '',
57-                        to_str(item)
58-                    ])
59-            else:
60-                lines.extend([
61+            lines.extend([
62                     '--' + boundary,
63                     'Content-Disposition: form-data; name="%s"' % to_str(key),
64                     '',
65                     to_str(value)
66-                ])
67+                    ])
68 
69     lines.extend([
70         '--' + boundary + '--',
71Index: tests/regressiontests/file_uploads/views.py
72===================================================================
73--- tests/regressiontests/file_uploads/views.py (revision 7857)
74+++ tests/regressiontests/file_uploads/views.py (working copy)
75@@ -67,4 +67,14 @@
76     """
77     response = file_upload_echo(request)
78     request.upload_handlers.insert(0, QuotaUploadHandler())
79-    return response
80\ No newline at end of file
81+    return response
82+
83+def file_upload_getlist_count(request):
84+    """
85+    Check the .getlist() function to ensure we receive the correct number of files.
86+    """
87+    file_counts = {}
88+
89+    for key in request.FILES.keys():
90+        file_counts[key] = len(request.FILES.getlist(key))
91+    return HttpResponse(simplejson.dumps(file_counts))
92Index: tests/regressiontests/file_uploads/tests.py
93===================================================================
94--- tests/regressiontests/file_uploads/tests.py (revision 7857)
95+++ tests/regressiontests/file_uploads/tests.py (working copy)
96@@ -147,12 +147,34 @@
97     def test_broken_custom_upload_handler(self):
98         f = tempfile.NamedTemporaryFile()
99         f.write('a' * (2 ** 21))
100-       
101+
102         # AttributeError: You cannot alter upload handlers after the upload has been processed.
103         self.assertRaises(
104             AttributeError,
105             self.client.post,
106-            '/file_uploads/quota/broken/',
107+            '/file_uploads/quota/broken/',
108             {'f': open(f.name)}
109-        )       
110-       
111\ No newline at end of file
112+        )
113+
114+    def test_fileupload_getlist(self):
115+        file1 = tempfile.NamedTemporaryFile()
116+        file1.write('a' * (2 ** 23))
117+
118+        file2 = tempfile.NamedTemporaryFile()
119+        file2.write('a' * (2 * 2 ** 18))
120+
121+        file2a = tempfile.NamedTemporaryFile()
122+        file2a.write('a' * (5 * 2 ** 20))
123+
124+        response = self.client.post('/file_uploads/getlist_count/', {
125+                'file1': open(file1.name),
126+                'field1': u'test',
127+                'field2': u'test3',
128+                'field3': u'test5',
129+                'field4': u'test6',
130+                'field5': u'test7',
131+                'file2': (open(file2.name), open(file2a.name))
132+                })
133+        got = simplejson.loads(response.content)
134+
135+        self.assert_(got.get('file1', 0) == 1 and got.get('file2', 0) == 2)
136Index: tests/regressiontests/file_uploads/urls.py
137===================================================================
138--- tests/regressiontests/file_uploads/urls.py  (revision 7857)
139+++ tests/regressiontests/file_uploads/urls.py  (working copy)
140@@ -7,4 +7,5 @@
141     (r'^echo/$',            views.file_upload_echo),
142     (r'^quota/$',           views.file_upload_quota),
143     (r'^quota/broken/$',    views.file_upload_quota_broken),
144+    (r'^getlist_count/$',   views.file_upload_getlist_count),
145 )