| | 97 | |
|---|
| | 98 | ## ENFORCE PERMISSIONS ON report exports |
|---|
| | 99 | |
|---|
| | 100 | billing_report_fname_regex = re.compile("report_(?P<reportid>\d*)") |
|---|
| | 101 | def report_id_from_filename(text): |
|---|
| | 102 | m = billing_report_fname_regex.match(text) |
|---|
| | 103 | if m: |
|---|
| | 104 | return int(m.groupdict()["reportid"]) |
|---|
| | 105 | |
|---|
| | 106 | |
|---|
| | 107 | def _send_csv(self, req, cols, rows, sep=',', mimetype='text/plain', |
|---|
| | 108 | filename=None): |
|---|
| | 109 | req.send_response(200) |
|---|
| | 110 | req.send_header('Content-Type', mimetype + ';charset=utf-8') |
|---|
| | 111 | if filename: |
|---|
| | 112 | req.send_header('Content-Disposition', 'filename=' + filename) |
|---|
| | 113 | req.end_headers() |
|---|
| | 114 | |
|---|
| | 115 | id = report_id_from_filename(filename) |
|---|
| | 116 | reports = get_billing_reports(self) |
|---|
| | 117 | if id in reports: |
|---|
| | 118 | raise RequestDone |
|---|
| | 119 | |
|---|
| | 120 | def iso_time(t): |
|---|
| | 121 | return format_time(t, 'iso8601') |
|---|
| | 122 | |
|---|
| | 123 | def iso_datetime(dt): |
|---|
| | 124 | return format_datetime(dt, 'iso8601') |
|---|
| | 125 | |
|---|
| | 126 | col_conversions = { |
|---|
| | 127 | 'time': iso_time, |
|---|
| | 128 | 'datetime': iso_datetime, |
|---|
| | 129 | 'changetime': iso_datetime, |
|---|
| | 130 | 'date': iso_datetime, |
|---|
| | 131 | 'created': iso_datetime, |
|---|
| | 132 | 'modified': iso_datetime, |
|---|
| | 133 | } |
|---|
| | 134 | |
|---|
| | 135 | converters = [col_conversions.get(c.strip('_'), unicode) for c in cols] |
|---|
| | 136 | |
|---|
| | 137 | writer = csv.writer(req, delimiter=sep) |
|---|
| | 138 | writer.writerow([unicode(c).encode('utf-8') for c in cols]) |
|---|
| | 139 | for row in rows: |
|---|
| | 140 | row = list(row) |
|---|
| | 141 | for i in xrange(len(row)): |
|---|
| | 142 | row[i] = converters[i](row[i]).encode('utf-8') |
|---|
| | 143 | writer.writerow(row) |
|---|
| | 144 | |
|---|
| | 145 | raise RequestDone |
|---|
| | 146 | |
|---|
| | 147 | ReportModule._send_csv = _send_csv |
|---|