def post(self, request, pk=None, format=None): course_pk = pk course = get_object_or_404(Course, pk=pk) file_param = 'file' if file_param not in request.FILES: raise exceptions.APIException("Error: missing '%s' parameter in upload" % file_param) elif len(request.FILES) == 0: raise exceptions.APIException("Error: no files uploaded") response_data = [] logger.debug("File uploads: %s" % request.FILES.getlist(file_param)) files = processFileUploads(request.FILES.getlist(file_param)) for file_upload in files: logger.debug("Processing file upload: %s" % file_upload.name) data = request.data.copy() data['course_id'] = course.pk serializer = ResourceSerializer(data=data, context={'request': request}, file_upload=file_upload) if serializer.is_valid(): serializer.save() response_data.append(serializer.data) else: logger.error(serializer.errors) return Response(response_data + [serializer.errors], status=status.HTTP_400_BAD_REQUEST) return Response(response_data, status=status.HTTP_201_CREATED)
def testProcessFileUploads(self, mock_is_zipfile, mock_zip): testZip = MockZipFile() testZip.write(self.test_files['test.png']['filename']) testZip.write(self.test_files['empty.jpg']['filename']) files = [testZip] mock_zip.return_value = testZip mock_is_zipfile.return_value = True files = processFileUploads(files) self.assertEqual(len(files), 2) self.assertNotIn(testZip, files) testZip.write('some_directory/') files = [testZip] files = processFileUploads(files) self.assertEqual(len(files), 2) self.assertNotIn('some_directory/', files)