]> git.parisson.com Git - telemeta.git/commitdiff
Merge branch 'dev' into feature/csv-streaming
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Wed, 18 Nov 2015 22:14:20 +0000 (23:14 +0100)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Wed, 18 Nov 2015 22:14:20 +0000 (23:14 +0100)
Conflicts:
telemeta/util/unicode.py
telemeta/views/playlist.py

1  2 
telemeta/util/unicode.py
telemeta/views/playlist.py

index a21005e7a7e76e084e6a9a2a9e5985a96215c8f4,01d12d4f4d7ad2c32f5c2f06d0bd64ea6e32963e..aa81e8cb533a7a7370411f78de97835011f0de22
@@@ -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
index f7aca7a07b896cebd34efabcc848557efa1fbc82,86797e5fb46538771481fc0ccd6ecdf095f41b69..a47a66fd3f8d97ae06814189247988d1ed79f668
@@@ -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
  
 -        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