Coverage for dryxPyramid/renderers/renderer_csv.py : 19%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from builtins import str
2from builtins import range
3from builtins import object
4import csv
5import io
6import re
7from decimal import Decimal
8from datetime import datetime
11class renderer_csv(object):
12 """
13 *The CSV renderer - can return plain text in browser or a file to download*
14 """
16 def __init__(self, info):
17 pass
19 def __call__(self, rows, system):
20 request = system.get('request')
21 if request is not None:
22 response = request.response
23 ct = response.content_type
24 if ct == response.default_content_type:
25 response.content_type = 'text/plain'
27 # setup the file if "download" is true
28 if "filename" in request.params:
29 now = datetime.now()
30 now = now.strftime("%Y%m%dt%H%M%S")
31 filename = request.params["filename"].replace(" ", "_")
32 filename = """%(filename)s_%(now)s""" % locals()
33 response.content_type = 'text/csv'
34 response.content_disposition = "attachment; filename=%(filename)s.csv" % locals(
35 )
37 # if table if empty
38 if len(rows) == 0:
39 return "no data returned"
41 # Column Headers and widths
42 header = []
43 allRows = []
44 tableColumnNames = list(rows[0].keys())
45 columnWidths = []
46 columnWidths[:] = [len(tableColumnNames[i])
47 for i in range(len(tableColumnNames))]
49 # create a virutal file to write the content to
50 output = io.StringIO()
51 writer = csv.writer(
52 output, dialect='excel', delimiter=",", quotechar='"', quoting=csv.QUOTE_MINIMAL)
54 # clean up data
55 for row in rows:
56 for c in tableColumnNames:
57 if isinstance(row[c], float) or isinstance(row[c], Decimal):
58 row[c] = "%0.4f" % row[c]
59 elif isinstance(row[c], datetime):
60 thisDate = str(row[c])[:10]
61 row[c] = "%(thisDate)s" % locals()
63 # set the column widths
64 for row in rows:
65 for i, c in enumerate(tableColumnNames):
66 if len(str(row[c])) > columnWidths[i]:
67 columnWidths[i] = len(str(row[c]))
69 # fill in the data
70 for row in rows:
71 thisRow = []
72 for i, c in enumerate(tableColumnNames):
73 thisRow.append(row[c])
74 allRows.append(thisRow)
76 # write the headers
77 for i, c in enumerate(tableColumnNames):
78 header.append(c)
79 writer.writerow(header)
81 # write out the data
82 writer.writerows(allRows)
83 output = output.getvalue()
85 output = output.strip()
86 returnOutput = output
88 return returnOutput