Coverage for dryxPyramid/renderers/renderer_plain_table.py : 15%

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 io
5import csv
6import re
7from decimal import Decimal
8from datetime import datetime
11class renderer_plain_table(object):
12 """
13 *The plain_table renderer - can return content to browser or a file to download*
14 """
16 def __init__(self, info):
17 pass
19 def __call__(self, rows, system):
21 request = system.get('request')
22 if request is not None:
23 response = request.response
24 ct = response.content_type
25 if ct == response.default_content_type:
26 response.content_type = 'text/plain'
28 # setup the file if "download" is true
29 if "filename" in request.params:
30 now = datetime.now()
31 now = now.strftime("%Y%m%dt%H%M%S")
32 filename = request.params["filename"].replace(" ", "_")
33 filename = """%(filename)s_%(now)s""" % locals()
34 response.content_type = 'text/plain'
35 response.content_disposition = "attachment; filename=%(filename)s" % locals(
36 )
38 # if table if empty
39 if len(rows) == 0:
40 return "no data returned"
42 # setup variables
43 header = []
44 divider = []
45 allRows = []
46 tableColumnNames = list(rows[0].keys())
47 columnWidths = []
48 columnWidths[:] = [len(tableColumnNames[i])
49 for i in range(len(tableColumnNames))]
51 # create a virutal file to write the content to
52 output = io.StringIO()
54 # setup csv styles
55 delimiter = "|"
56 writer = csv.writer(output, dialect='excel', delimiter=delimiter,
57 quotechar='"', quoting=csv.QUOTE_MINIMAL)
58 dividerWriter = csv.writer(output, dialect='excel', delimiter="+",
59 quotechar='"', quoting=csv.QUOTE_MINIMAL)
61 # clean up data
62 for row in rows:
63 for c in tableColumnNames:
64 if isinstance(row[c], float) or isinstance(row[c], Decimal):
65 row[c] = "%0.2f" % row[c]
66 elif isinstance(row[c], datetime):
67 thisDate = str(row[c])[:10]
68 row[c] = "%(thisDate)s" % locals()
70 # set the column widths
71 for row in rows:
72 for i, c in enumerate(tableColumnNames):
73 if len(str(row[c])) > columnWidths[i]:
74 columnWidths[i] = len(str(row[c]))
76 # create the output content
77 # fill in the data
78 for row in rows:
79 thisRow = []
80 thisRow.append("")
81 for i, c in enumerate(tableColumnNames):
82 row[c] = str(str(row[c]).ljust(columnWidths[i] + 2)
83 .rjust(columnWidths[i] + 3))
84 thisRow.append(row[c])
85 thisRow.append("")
86 allRows.append(thisRow)
88 # table borders for human readable
89 header.append("")
90 divider.append("")
92 for i, c in enumerate(tableColumnNames):
93 header.append(
94 c.ljust(columnWidths[i] + 2).rjust(columnWidths[i] + 3))
95 divider.append('-' * (columnWidths[i] + 3))
97 # table border for human readable
98 header.append("")
99 divider.append("")
100 dividerWriter.writerow(divider)
101 writer.writerow(header)
102 dividerWriter.writerow(divider)
104 # write out the data
105 writer.writerows(allRows)
106 # table border for human readable
107 dividerWriter.writerow(divider)
109 now = datetime.now()
110 now = now.strftime("%Y-%m-%d %H:%M:%S")
111 output = output.getvalue()
112 output = """exported on %(now)s\n%(output)s""" % locals(
113 )
115 output = output.strip()
116 returnOutput = output
118 return returnOutput