self.dialect = dialect
self.encoding = encoding
self.writer = csv.writer(f, dialect=dialect, **kwds)
+ self.line = 0
+ self.tags = []
- def write_tags(self, element):
- def writerow(self, row):
- self.writer.writerow(_stringify_list(row, self.encoding))
+
- def writerows(self, rows):
- for row in rows:
- self.writerow(row)
++ def get_tags(self, element):
+ element_dict = element.to_dict_with_more()
+ for key in element_dict.keys():
+ if not key in self.tags:
+ self.tags.append(key)
-class CSVExport(object):
-
- def __init__(self, writer):
- self.writer = writer
-
- def write(self, elements):
- tags = []
- element_dicts = [e.to_dict_with_more() for e in elements]
- e = element_dicts[0]
- for key in e.keys():
- if not key in tags:
- tags.append(key)
# code and title on the two first column
- tags.remove('code')
- tags.remove('title')
- tags.sort()
- tags.insert(0, 'title')
- tags.insert(0, 'code')
- self.writer.writerow(tags)
-
- for element in element_dicts:
- data = []
- for tag in tags:
- if tag in element.keys():
- data.append(element[tag])
- else:
- data.append('')
- self.writer.writerow(data)
+ self.tags.remove('code')
+ self.tags.remove('title')
+ self.tags.sort()
+ self.tags.insert(0, 'title')
+ self.tags.insert(0, 'code')
- self.writer.writerow(self.tags)
- self.line += 1
- print self.tags
++ self.init_tags = True
+
- def write_element(self, element):
- if self.line == 0:
- self.write_tags(element)
++ 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])
++ row.append(element_dict[tag])
+ else:
+ row.append('')
- self.writerow(row)
- print row
++ return row
+
- def writerow(self, row):
- self.writer.writerow(_stringify_list(row, self.encoding))
- self.line += 1
-
- def writerows(self, rows):
- for row in rows:
- self.writerow(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))
+
+
+class Echo(object):
+ """An object that implements just the write method of the file-like
+ interface.
+ """
+ def write(self, value):
+ """Write the value by returning it, instead of storing in a buffer."""
+ return value
if items:
item = items[0]
elements.append(item)
--
elif resource_type == 'collections':
if resource.resource_type == 'collection':
collection = MediaCollection.objects.get(id=resource.resource_id)
elements.append(collection)
+ return elements
- playlist = Playlist.objects.get(public_id=public_id, author=request.user)
+ def playlist_csv_export(self, request, public_id, resource_type):
- response = HttpResponse(content_type='text/csv')
++ 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')
response['Content-Disposition'] = 'attachment; filename='+playlist.title+'_'+resource_type+'.csv'
- writer = UnicodeWriter(response)
-
- if elements:
- csv = CSVExport(writer)
- csv.write(elements)
-
return response