def get(self, request, app, model): Model = apps.get_model(app, model) if self.has_export_permission(request.user, Model): return queryset_as_csv_response(Model.objects.all(), is_stream=True) else: raise PermissionDenied
def test_queryset_csv_response(self): for i in range(0, 10): self.IntegerTestModel.objects.create(number=i) expected = b"""Id,Number\r\n1,0\r\n2,1\r\n3,2\r\n4,3\r\n5,4\r\n6,5\r\n7,6\r\n8,7\r\n9,8\r\n10,9\r\n""" expected_filename = "some_file.csv" response = queryset_as_csv_response( self.IntegerTestModel.objects.all(), expected_filename) self.assertEqual(expected, response.content, "Comparing response body (as bytes)") self.assertEqual("text/csv", response["Content-Type"], "Ensure content type is csv") self.assertEqual("attachment; filename={}".format(expected_filename), response["content-disposition"], "Ensuring filename is correctly propogated")
def test_queryset_csv_response_values_ordering_with_defer(self): for i in range(0, 10): self.IntegerTestModel.objects.create(number=i) expected = b"""Number,Id\r\n0,1\r\n1,2\r\n2,3\r\n3,4\r\n4,5\r\n5,6\r\n6,7\r\n7,8\r\n8,9\r\n9,10\r\n""" expected_filename = "some_file.csv" response = queryset_as_csv_response( self.IntegerTestModel.objects.all().defer('number').values( 'number', 'id'), expected_filename) self.assertEqual(expected, response.content, "Comparing response body (as bytes)") self.assertEqual("text/csv", response["Content-Type"], "Ensure content type is csv") self.assertEqual("attachment; filename={}".format(expected_filename), response["content-disposition"], "Ensuring filename is correctly propogated")
def test_queryset_csv_response_complex_values(self): for i in range(0, 2): self.ComplexTestModel.objects.create(integer=i, char='abc\nde,./[];#"\'', datetime=datetime.datetime( 2000, 1, 2)) expected = b'''Id,Integer,Char,Datetime\r\n1,0,"abc\nde,./[];#""\'",02-01-2000 00:00:00\r\n2,1,"abc\nde,./[];#""\'",02-01-2000 00:00:00\r\n''' expected_filename = "other_file.csv" response = queryset_as_csv_response( self.ComplexTestModel.objects.all(), expected_filename) self.assertEqual(expected, response.content, "Comparing response body (as bytes)") self.assertEqual("text/csv", response["Content-Type"], "Ensure content type is csv") self.assertEqual("attachment; filename={}".format(expected_filename), response["content-disposition"], "Ensuring filename is correctly propogated")
def export_selection_as_csv(admin, request, queryset): return queryset_as_csv_response(queryset, is_stream=True)