Hide keyboard shortcuts

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 

9 

10 

11class renderer_plain_table(object): 

12 """ 

13 *The plain_table renderer - can return content to browser or a file to download* 

14 """ 

15 

16 def __init__(self, info): 

17 pass 

18 

19 def __call__(self, rows, system): 

20 

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' 

27 

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 ) 

37 

38 # if table if empty 

39 if len(rows) == 0: 

40 return "no data returned" 

41 

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))] 

50 

51 # create a virutal file to write the content to 

52 output = io.StringIO() 

53 

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) 

60 

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() 

69 

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])) 

75 

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) 

87 

88 # table borders for human readable 

89 header.append("") 

90 divider.append("") 

91 

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)) 

96 

97 # table border for human readable 

98 header.append("") 

99 divider.append("") 

100 dividerWriter.writerow(divider) 

101 writer.writerow(header) 

102 dividerWriter.writerow(divider) 

103 

104 # write out the data 

105 writer.writerows(allRows) 

106 # table border for human readable 

107 dividerWriter.writerow(divider) 

108 

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 ) 

114 

115 output = output.strip() 

116 returnOutput = output 

117 

118 return returnOutput