Changeset 4281

Show
Ignore:
Timestamp:
09/14/08 12:06:04 (2 months ago)
Author:
bobbysmith007
Message:

Monkey patched the report module to allow enforcing permissions in _send_csv

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • timingandestimationplugin/branches/trac0.11-Permissions/timingandestimationplugin/reports_filter.py

    r4280 r4281  
    66from genshi.filters.transform import Transformer 
    77import re 
     8 
     9from trac.ticket.report import ReportModule 
     10from trac.util.datefmt import format_datetime, format_time 
     11import csv 
     12from trac.web.api import RequestDone 
    813 
    914billing_report_regex = re.compile("\{(?P<reportid>\d*)\}") 
     
    9095        stream = stream | Transformer('//div[@id="content"]').filter(permhelper) 
    9196        return stream 
     97 
     98## ENFORCE PERMISSIONS ON report exports 
     99 
     100billing_report_fname_regex = re.compile("report_(?P<reportid>\d*)") 
     101def report_id_from_filename(text): 
     102    m = billing_report_fname_regex.match(text) 
     103    if m: 
     104        return int(m.groupdict()["reportid"]) 
     105 
     106 
     107def _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 
     147ReportModule._send_csv = _send_csv