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 csv 

5import io 

6import re 

7from decimal import Decimal 

8from datetime import datetime 

9 

10 

11class renderer_csv(object): 

12 """ 

13 *The CSV renderer - can return plain text in browser or a file to download* 

14 """ 

15 

16 def __init__(self, info): 

17 pass 

18 

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' 

26 

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 ) 

36 

37 # if table if empty 

38 if len(rows) == 0: 

39 return "no data returned" 

40 

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

48 

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) 

53 

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

62 

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

68 

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) 

75 

76 # write the headers 

77 for i, c in enumerate(tableColumnNames): 

78 header.append(c) 

79 writer.writerow(header) 

80 

81 # write out the data 

82 writer.writerows(allRows) 

83 output = output.getvalue() 

84 

85 output = output.strip() 

86 returnOutput = output 

87 

88 return returnOutput