]> git.parisson.com Git - telemeta.git/commitdiff
fix CSV stream output
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Thu, 3 Dec 2015 08:44:01 +0000 (09:44 +0100)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Thu, 3 Dec 2015 08:44:01 +0000 (09:44 +0100)
telemeta/models/collection.py
telemeta/models/core.py
telemeta/models/item.py
telemeta/util/unicode.py
telemeta/views/playlist.py

index 2b76bda4a7ddd82c73ee09b58229f51d1dd158b4..58d9ecdfb64c3b705f9c30829e1b27df708772d5 100644 (file)
@@ -273,6 +273,16 @@ class MediaCollection(MediaResource):
         return json.dumps(self.to_dict_with_more())
 
 
+    def to_row(self):
+        row = []
+        _dict = self.to_dict_with_more()
+        for tag in _dict:
+            if tag in _dict.keys():
+                row.append(_dict[tag])
+            else:
+                row.append('')
+        return row
+
 
 class MediaCollectionRelated(MediaRelated):
     "Collection related media"
@@ -295,4 +305,3 @@ class MediaCollectionIdentifier(Identifier):
         verbose_name = _('collection identifier')
         verbose_name_plural = _('collection identifiers')
         unique_together = ('identifier', 'collection')
-
index 5e647beede5684ace00d56216f4e90e46c0ef3ad..98853f164872867b5fb3af7fac62aa8fcc817fb7 100644 (file)
@@ -264,5 +264,3 @@ class CoreManager(EnhancedManager):
                 return super(CoreManager, self).get(**args)
 
         return super(CoreManager, self).get(**kwargs)
-
-
index fc7c78cfd82f90da174ef898dfca9d02d34f24e9..53c5669a2d04cba9b8b0b122f867771db8d0e4c8 100644 (file)
@@ -339,6 +339,15 @@ class MediaItem(MediaResource):
 
         return metadata
 
+    def to_row(self):
+        row = []
+        _dict = self.to_dict_with_more()
+        for tag in _dict:
+            if tag in _dict.keys():
+                row.append(_dict[tag])
+            else:
+                row.append('')
+        return row
 
 class MediaItemRelated(MediaRelated):
     "Item related media"
index aa81e8cb533a7a7370411f78de97835011f0de22..0e9cc8bac00da86cabe2138cb56bca0e07b7325a 100644 (file)
@@ -50,19 +50,24 @@ def _stringify_list(l, encoding):
     return [_stringify(s, encoding) for s in l]
 
 
+class StreamCSVException(Exception):
+    pass
+
+
 class UnicodeCSVWriter(object):
-    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
+    def __init__(self, f, elements, dialect=csv.excel, encoding="utf-8", **kwds):
         self.dialect = dialect
         self.encoding = encoding
         self.writer = csv.writer(f, dialect=dialect, **kwds)
         self.line = 0
+        self.elements = elements
         self.tags = []
-
+        self.get_tags(self.elements[0])
 
     def get_tags(self, element):
-        element_dict = element.to_dict_with_more()
+        _dict = element.to_dict_with_more()
 
-        for key in element_dict.keys():
+        for key in _dict.keys():
             if not key in self.tags:
                 self.tags.append(key)
 
@@ -72,23 +77,11 @@ class UnicodeCSVWriter(object):
         self.tags.sort()
         self.tags.insert(0, 'title')
         self.tags.insert(0, 'code')
-        self.init_tags = True
-
-    def get_row(self, element):
-        row = []
-        element_dict = element.to_dict_with_more()
-        for tag in self.tags:
-            if tag in element_dict.keys():
-                    row.append(element_dict[tag])
-            else:
-                row.append('')
-        return row
-
-    def write_element(self, element):
-        if not self.tags:
-            yield self.writer.writerow(self.get_tags())
-        row = self.get_row(element)
-        yield self.writer.writerow(_stringify_list(row, self.encoding))
+
+    def output(self):
+        yield self.writer.writerow(self.tags)
+        for element in self.elements:
+            yield self.writer.writerow(_stringify_list(element.to_row(), self.encoding))
 
 
 class Echo(object):
index a47a66fd3f8d97ae06814189247988d1ed79f668..11a55d2adce10db35b6183d8872a325fd196180c 100644 (file)
@@ -112,7 +112,7 @@ class PlaylistView(object):
         playlist = Playlist.objects.get(public_id=public_id)
         elements = self.get_elements(playlist, resource_type)
         pseudo_buffer = Echo()
-        writer = UnicodeCSVWriter(pseudo_buffer)
-        response = StreamingHttpResponse((writer.write_element(element) for element in elements), content_type='text/csv')
+        writer = UnicodeCSVWriter(pseudo_buffer, elements)
+        response = StreamingHttpResponse(writer.output(), content_type='text/csv')
         response['Content-Disposition'] = 'attachment; filename='+playlist.title+'_'+resource_type+'.csv'
         return response