Skip to content

Commit a1b40aa

Browse files
committed
#6 fix: nested files
1 parent 3ac35f7 commit a1b40aa

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

nested_multipart_parser/drf.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ class DrfNestedParser(MultiPartParser):
3030
def parse(self, stream, media_type=None, parser_context=None):
3131
clsDataAndFile = super().parse(stream, media_type, parser_context)
3232

33-
parser = NestedParser(clsDataAndFile.data.dict())
33+
data = clsDataAndFile.data.dict()
34+
data.update(clsDataAndFile.files.dict()) # add files to data
35+
36+
parser = NestedParser(data)
3437
if parser.is_valid():
35-
return DataAndFiles(parser.validate_data, clsDataAndFile.files)
38+
return parser.validate_data
3639
raise ParseError(parser.errors)

setup.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import sys
66
import subprocess
77

8-
9-
# tags = subprocess.check_output("git tag -l | cat", shell=True).decode("utf-8")
10-
# version = list(filter(None, tags.split("\n")))[-1]
11-
version = "v1.3.1"
8+
version = "1.4.0"
129

1310
if sys.argv[-1] == 'publish':
1411
if os.system("pip freeze | grep twine"):

tests/test_drf.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from nested_multipart_parser.drf import DrfNestedParser, NestedParser # noqa: E402
1111
from rest_framework.request import Request # noqa: E402
1212
from rest_framework.exceptions import ParseError # noqa: E402
13-
13+
from django.core.files.uploadedfile import SimpleUploadedFile, InMemoryUploadedFile
1414

1515
def toQueryDict(data):
1616
q = QueryDict(mutable=True)
@@ -212,3 +212,48 @@ def test_views_options_mixed_valid(self):
212212
}
213213

214214
self.assertEqual(results.data, toQueryDict(expected))
215+
216+
def test_nested_files(self):
217+
file = SimpleUploadedFile("file.png", b"file_content", content_type="image/png")
218+
file1 = SimpleUploadedFile("file.pdf", b"file_content", content_type="application/pdf")
219+
220+
data = {
221+
"file": file,
222+
"title": "title",
223+
'files[0].description': 'description',
224+
'files[1].file': file1,
225+
'files[1].description': 'description2',
226+
}
227+
results = self.parser_boundary(data)
228+
229+
# files is not in
230+
expected = {
231+
"file": file,
232+
"title": "title",
233+
"files": [
234+
{
235+
"description": "description",
236+
},
237+
{
238+
"file": file1,
239+
"description": "description2",
240+
}
241+
],
242+
}
243+
data = results.data.dict()
244+
self.assertEqual(len(data), 3)
245+
246+
self.assertIsInstance(data["file"], InMemoryUploadedFile)
247+
self.assertEqual(data["title"], expected["title"])
248+
249+
self.assertEqual(len(data["files"]), 2)
250+
self.assertIsInstance(data["files"], list)
251+
252+
self.assertIsInstance(data["files"][0], dict)
253+
self.assertEqual(len(data["files"][0]), 1)
254+
self.assertEqual(data["files"][0]["description"], "description")
255+
256+
self.assertIsInstance(data["files"][1], dict)
257+
self.assertEqual(len(data["files"][1]), 2)
258+
self.assertEqual(data["files"][1]["description"], "description2")
259+
self.assertIsInstance(data["files"][1]["file"], InMemoryUploadedFile)

0 commit comments

Comments
 (0)