Created
November 4, 2016 10:11
-
-
Save danie1k/02ed2f7e50302b86403ce263333b6485 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
csv exporter | |
~~~~~ | |
Usage: | |
* in your admin class for model, insert: actions = [ download_as_csv_view ] | |
* add columns names in HEADER | |
* add data columns in _make_csv_row | |
:copyright: (c) https://github.com/danie1k | |
:license: GNU General Public License | |
""" | |
def download_as_csv_view(modeladmin, request, queryset): | |
"""A view that streams a large CSV file.""" | |
MAX_PER_PAGE = 65536 | |
FILENAME = '' | |
HEADER = [] # Document header row with columns names | |
import csv, tempfile, StringIO, zipfile | |
from django.http import HttpResponse | |
from django.core.paginator import Paginator | |
def _make_csv_row(row): | |
return [] # Columns with data in row | |
paginator = Paginator(queryset, MAX_PER_PAGE) | |
if paginator.num_pages == 1: | |
response = HttpResponse(content_type='text/csv') | |
response['Content-Disposition'] = ('attachment; ' | |
'filename="{}.csv"'.format(FILENAME)) | |
writer = csv.writer(response, delimiter=';', dialect='excel') | |
writer.writerow(HEADER) | |
for row in queryset: | |
writer.writerow(_make_csv_row(row)) | |
return response | |
response = HttpResponse(content_type='application/x-zip-compressed') | |
response['Content-Disposition'] = ('attachment; ' | |
'filename="{}.zip"'.format(FILENAME)) | |
# This is where my zip will be written | |
buff = StringIO.StringIO() | |
# This is my zip file | |
zip_archive = zipfile.ZipFile(buff, mode='w') | |
for page in paginator.page_range: | |
temp_file = StringIO.StringIO() | |
writer = csv.writer(temp_file, delimiter=';', dialect='excel') | |
writer.writerow(HEADER) | |
rows = paginator.page(page) | |
for row in rows: | |
writer.writerow(_make_csv_row(row)) | |
zip_archive.writestr('{}.part{}.csv'.format(FILENAME, page), | |
temp_file.getvalue()) | |
zip_archive.close() | |
response.write(buff.getvalue()) | |
return response | |
download_as_csv_view.short_description = "Download as CSV" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment