]> git.parisson.com Git - telemeta.git/commitdiff
fix unicode for CSV export
authoryomguy <yomguy@parisson.com>
Wed, 16 Mar 2011 11:56:14 +0000 (12:56 +0100)
committeryomguy <yomguy@parisson.com>
Wed, 16 Mar 2011 11:56:14 +0000 (12:56 +0100)
telemeta/urls.py
telemeta/util/unicode.py [new file with mode: 0644]
telemeta/web/base.py

index 165aa3f2413c69ee7577d83ad68294591fe232a2..458760dc82159790a23aee5c27f5b10c412cc168 100644 (file)
@@ -201,6 +201,6 @@ urlpatterns = patterns('',
     url(r'^json/(?P<method>[a-zA-Z0-9.]+)$', jsonrpc_site.dispatch),  # for HTTP GET only, also omissible
     
     # Playlists
-    url(r'^playlists/(?P<public_id>[a-zA-Z0-9]+)/$', web_view.playlist_csv_export, name="telemeta-playlist-csv-export"),
+    url(r'^playlists/(?P<public_id>[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 (file)
index 0000000..f935f74
--- /dev/null
@@ -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)
index 4b41e872e38776c9343c9b8185c9c2b6f6242cd0..8366309f07c2cd5940d98caa8f1ed31768603264 100644 (file)
@@ -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