| | 9 | from trac.ticket.query import QueryModule |
|---|
| | 10 | |
|---|
| | 11 | from StringIO import StringIO |
|---|
| | 12 | import csv |
|---|
| | 13 | from trac.mimeview.api import Context |
|---|
| | 14 | from trac.resource import Resource |
|---|
| | 15 | |
|---|
| | 16 | ## MONKEY PATCH THE QUERY MODULE CSV EXPORT FN TO ENFORCE PERMISSIONS |
|---|
| | 17 | def new_csv_export(self, req, query, sep=',', mimetype='text/plain'): |
|---|
| | 18 | self.log.debug("T&E plugin has overridden QueryModule.csv_export so to enforce field permissions") |
|---|
| | 19 | |
|---|
| | 20 | ## find the columns that should be hidden |
|---|
| | 21 | hidden_fields = [] |
|---|
| | 22 | fields = self.config.getlist(csection, 'fields', []) |
|---|
| | 23 | self.log.debug('QueryModule.csv_export: found : %s' % fields) |
|---|
| | 24 | for field in fields: |
|---|
| | 25 | perms = self.config.getlist(csection, '%s.permission' % field, []) |
|---|
| | 26 | #self.log.debug('QueryModule.csv_export: read permission config: %s has %s' % (field, perms)) |
|---|
| | 27 | for (perm, denial) in [s.split(":") for s in perms] : |
|---|
| | 28 | perm = perm.upper() |
|---|
| | 29 | #self.log.debug('QueryModule.csv_export: testing permission: %s:%s should act= %s' % |
|---|
| | 30 | # (field, perm, (not req.perm.has_permission(perm) or perm == "ALWAYS"))) |
|---|
| | 31 | if (not req.perm.has_permission(perm) or perm == "ALWAYS") and denial.lower() in ["remove","hide"]: |
|---|
| | 32 | hidden_fields.append(field) |
|---|
| | 33 | ## END find the columns that should be hidden |
|---|
| | 34 | |
|---|
| | 35 | content = StringIO() |
|---|
| | 36 | cols = query.get_columns() |
|---|
| | 37 | writer = csv.writer(content, delimiter=sep) |
|---|
| | 38 | writer = csv.writer(content, delimiter=sep, quoting=csv.QUOTE_MINIMAL) |
|---|
| | 39 | writer.writerow([unicode(c).encode('utf-8') for c in cols if c not in hidden_fields]) |
|---|
| | 40 | |
|---|
| | 41 | context = Context.from_request(req) |
|---|
| | 42 | results = query.execute(req, self.env.get_db_cnx()) |
|---|
| | 43 | self.log.debug('QueryModule.csv_export: hidding columns %s' % hidden_fields) |
|---|
| | 44 | for result in results: |
|---|
| | 45 | ticket = Resource('ticket', result['id']) |
|---|
| | 46 | if 'TICKET_VIEW' in req.perm(ticket): |
|---|
| | 47 | values = [] |
|---|
| | 48 | for col in cols: |
|---|
| | 49 | if col not in hidden_fields: |
|---|
| | 50 | self.log.debug("not hiding %s" % col) |
|---|
| | 51 | value = result[col] |
|---|
| | 52 | if col in ('cc', 'reporter'): |
|---|
| | 53 | value = Chrome(self.env).format_emails(context(ticket), |
|---|
| | 54 | value) |
|---|
| | 55 | values.append(unicode(value).encode('utf-8')) |
|---|
| | 56 | writer.writerow(values) |
|---|
| | 57 | return (content.getvalue(), '%s;charset=utf-8' % mimetype) |
|---|
| | 58 | |
|---|
| | 59 | QueryModule.export_csv = new_csv_export |
|---|