From 9616d8fcb2932b9556aea942fc19000111da2a13 Mon Sep 17 00:00:00 2001 From: Jan Szejko Date: Mon, 9 May 2016 16:06:32 +0200 Subject: [PATCH] fix csv export of contact forms (blind voodoo) --- contact/admin.py | 5 +++-- edumed/utils.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 edumed/utils.py diff --git a/contact/admin.py b/contact/admin.py index e9e10a0..7581666 100644 --- a/contact/admin.py +++ b/contact/admin.py @@ -7,6 +7,7 @@ from django.utils.safestring import mark_safe from django.conf.urls import patterns, url from django.http import HttpResponse, Http404 +from edumed.utils import UnicodeCSVWriter from .forms import contact_forms, admin_list_width from .models import Contact @@ -139,7 +140,7 @@ def extract_view(request, form_tag, extract_type_slug): contacts_by_spec.setdefault(tuple(keys), []).append(contact) response = HttpResponse(content_type='text/csv') - csv_writer = csv.writer(response) + csv_writer = UnicodeCSVWriter(response) # Generate list for each body key set for keys, contacts in contacts_by_spec.items(): @@ -156,7 +157,7 @@ def extract_view(request, form_tag, extract_type_slug): for key in keys: if key not in record: record[key] = '' - csv_writer.writerow([record[key].encode('utf-8') for key in keys]) + csv_writer.writerow([record[key] for key in keys]) csv_writer.writerow([]) response['Content-Disposition'] = 'attachment; filename="kontakt.csv"' diff --git a/edumed/utils.py b/edumed/utils.py new file mode 100644 index 0000000..756ffa3 --- /dev/null +++ b/edumed/utils.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +import codecs +import csv + +import cStringIO + + +# source: https://docs.python.org/2/library/csv.html#examples +class UnicodeCSVWriter(object): + """ + A CSV writer which will write rows to CSV file "f", + which is encoded in the given encoding. + """ + + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + # Redirect output to a queue + self.queue = cStringIO.StringIO() + self.writer = csv.writer(self.queue, dialect=dialect, **kwds) + self.stream = f + self.encoder = codecs.getincrementalencoder(encoding)() + + def writerow(self, row): + self.writer.writerow([s.encode("utf-8") for s in row]) + # Fetch UTF-8 output from the queue ... + data = self.queue.getvalue() + data = data.decode("utf-8") + # ... and reencode it into the target encoding + data = self.encoder.encode(data) + # write to the target stream + self.stream.write(data) + # empty queue + self.queue.truncate(0) + + def writerows(self, rows): + for row in rows: + self.writerow(row) \ No newline at end of file -- 2.20.1