22from collections import defaultdict
33from rest_framework .renderers import *
44from StringIO import StringIO
5+ from rest_framework_csv .orderedrows import OrderedRows
56
67class CSVRenderer (BaseRenderer ):
78 """
@@ -43,23 +44,24 @@ def tablize(self, data):
4344 # fall into.
4445 data = self .flatten_data (data )
4546
46- # Get the set of all unique headers, and sort them.
47- headers = set ()
48- for item in data :
49- headers .update (item .keys ())
50- headers = sorted (headers )
47+ # Get the set of all unique headers, and sort them (unless already provided).
48+ if not data .header :
49+ headers = set ()
50+ for item in data :
51+ headers .update (item .keys ())
52+ data .header = sorted (headers )
5153
5254 # Create a row for each dictionary, filling in columns for which the
5355 # item has no data with None values.
5456 rows = []
5557 for item in data :
5658 row = []
57- for key in headers :
59+ for key in data . header :
5860 row .append (item .get (key , None ))
5961 rows .append (row )
6062
6163 # Return your "table", with the headers as the first row.
62- return [headers ] + rows
64+ return [data . header ] + rows
6365
6466 else :
6567 return []
@@ -70,7 +72,7 @@ def flatten_data(self, data):
7072 each exactly one level deep. The key for each value in the dictionaries
7173 designates the name of the column that the value will fall into.
7274 """
73- flat_data = []
75+ flat_data = OrderedRows ( data . header if hasattr ( data , 'header' ) else None )
7476 for item in data :
7577 flat_item = self .flatten_item (item )
7678 flat_data .append (flat_item )
0 commit comments