From: yomguy Date: Wed, 16 Mar 2011 11:56:14 +0000 (+0100) Subject: fix unicode for CSV export X-Git-Tag: 1.1~365 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=566441f476be0ec447a2a485fff76e698c1697a3;p=telemeta.git fix unicode for CSV export --- diff --git a/telemeta/urls.py b/telemeta/urls.py index 165aa3f2..458760dc 100644 --- a/telemeta/urls.py +++ b/telemeta/urls.py @@ -201,6 +201,6 @@ urlpatterns = patterns('', url(r'^json/(?P[a-zA-Z0-9.]+)$', jsonrpc_site.dispatch), # for HTTP GET only, also omissible # Playlists - url(r'^playlists/(?P[a-zA-Z0-9]+)/$', web_view.playlist_csv_export, name="telemeta-playlist-csv-export"), + url(r'^playlists/(?P[a-zA-Z0-9]+)$', web_view.playlist_csv_export, name="telemeta-playlist-csv-export"), ) diff --git a/telemeta/util/unicode.py b/telemeta/util/unicode.py new file mode 100644 index 00000000..f935f740 --- /dev/null +++ b/telemeta/util/unicode.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2010 jdunck +# Copyright (C) 2011 Parisson + +# This software is a computer program whose purpose is to backup, analyse, +# transcode and stream any audio content with its metadata over a web frontend. + +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". + +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. + +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. + +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. +# +# Author: jdunck +# taken from https://github.com/jdunck/python-unicodecsv.git + +import csv, codecs, cStringIO + +def _stringify(s, encoding): + if type(s)==unicode: + return s.encode(encoding) + elif isinstance(s, (int , float)): + pass #let csv.QUOTE_NONNUMERIC do its thing. + elif type(s) != str: + s=str(s) + return s + +def _stringify_list(l, encoding): + return [_stringify(s, encoding) for s in l] + + +class UnicodeWriter(object): + def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): + self.writer = csv.writer(f) + self.dialect = dialect + self.encoding = encoding + self.writer = csv.writer(f, dialect=dialect, **kwds) + + def writerow(self, row): + self.writer.writerow(_stringify_list(row, self.encoding)) + + def writerows(self, rows): + for row in rows: + self.writerow(row) diff --git a/telemeta/web/base.py b/telemeta/web/base.py index 4b41e872..8366309f 100644 --- a/telemeta/web/base.py +++ b/telemeta/web/base.py @@ -64,6 +64,7 @@ from django.core.exceptions import ObjectDoesNotExist from telemeta.util.unaccent import unaccent from telemeta.util.unaccent import unaccent_icmp from telemeta.util.logger import Logger +from telemeta.util.unicode import UnicodeWriter from telemeta.cache import TelemetaCache import telemeta.web.pages as pages @@ -853,11 +854,12 @@ class WebView(object): m.delete() def playlist_csv_export(self, request, public_id): - playlist = Playlist.objects.get(public_id=public_id) + playlist = Playlist.objects.get(public_id=public_id, author=request.user) resources = PlaylistResource.objects.filter(playlist=playlist) response = HttpResponse(mimetype='text/csv') response['Content-Disposition'] = 'attachment; filename='+playlist.name+'.csv' - writer = csv.writer(response) + writer = UnicodeWriter(response) + items = [] for resource in resources: if resource.resource_type == 'collection': @@ -874,12 +876,13 @@ class WebView(object): item = item.to_dict() tags = item.keys() writer.writerow(tags) - + import types + for item in items: data = [] item = item.to_dict() for tag in tags: data.append(item[tag]) writer.writerow(data) - + return response