From: Guillaume Pellerin Date: Wed, 18 Nov 2015 22:14:20 +0000 (+0100) Subject: Merge branch 'dev' into feature/csv-streaming X-Git-Tag: 1.6b~7^2~46^2~2 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=dff7fb83d0eeed5f0dd24179bb4bcf9bff465f97;p=telemeta.git Merge branch 'dev' into feature/csv-streaming Conflicts: telemeta/util/unicode.py telemeta/views/playlist.py --- dff7fb83d0eeed5f0dd24179bb4bcf9bff465f97 diff --cc telemeta/util/unicode.py index a21005e7,01d12d4f..aa81e8cb --- a/telemeta/util/unicode.py +++ b/telemeta/util/unicode.py @@@ -55,53 -55,41 +55,46 @@@ class UnicodeCSVWriter(object) 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 diff --cc telemeta/views/playlist.py index f7aca7a0,86797e5f..a47a66fd --- a/telemeta/views/playlist.py +++ b/telemeta/views/playlist.py @@@ -106,12 -102,22 +102,17 @@@ class PlaylistView(object) 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 + def playlist_csv_export(self, request, public_id, resource_type): - playlist = Playlist.objects.get(public_id=public_id, author=request.user) ++ playlist = Playlist.objects.get(public_id=public_id) + elements = self.get_elements(playlist, resource_type) - response = HttpResponse(content_type='text/csv') ++ 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