请求协助适配Trac MasterticketPlugIn至Trac1.6:替换ITemplateStreamFilter
Trac 1.6 + Python3 兼容:替换ITemplateStreamFilter的具体方案
核心思路
Trac 1.6移除了ITemplateStreamFilter接口,官方推荐通过在IRequestFilter的post_process_request中直接修改模板数据替代流过滤逻辑——这比修改HTML流更高效,也符合新版本架构设计。
具体修改步骤
1. 清理ITemplateStreamFilter相关代码
- 删除导入语句中的
ITemplateStreamFilter:from trac.web.api import IRequestFilter, IRequestHandler # 移除ITemplateStreamFilter - 移除类实现声明中的
ITemplateStreamFilter:implements(IRequestFilter, IRequestHandler, ITemplateProvider) # 去掉ITemplateStreamFilter - 删除整个
filter_stream方法。
2. 将原流过滤逻辑迁移到post_process_request
在post_process_request方法的末尾(现有逻辑之后)添加以下代码,完全替代原filter_stream的功能:
# 原ITemplateStreamFilter逻辑,迁移至此处理模板数据 if template in ['report_view.html', 'query_results.html', 'ticket.html', 'query.html']: if not data: return template, data, content_type # 处理ticket.html:渲染blocking/blockedby字段为链接 if 'fields' in data and isinstance(data['fields'], list): for field in data['fields']: for f in self.fields: if field['name'] == f and data['ticket'][f]: field['rendered'] = self._link_tickets(req, data['ticket'][f]) # 处理query_results.html和query.html:渲染工单列表中的blocking/blockedby字段 if 'groups' in data and isinstance(data['groups'], list): for group, tickets in data['groups']: for ticket in tickets: for f in self.fields: if f in ticket: ticket[f] = self._link_tickets(req, ticket[f]) # 处理report_view.html:渲染报表中的blocking/blockedby字段 if 'row_groups' in data and isinstance(data['row_groups'], list): for group, rows in data['row_groups']: for row in rows: if 'cell_groups' in row and isinstance(row['cell_groups'], list): for cells in row['cell_groups']: for cell in cells: if cell.get('header', {}).get('col') in self.fields: cell['value'] = self._link_tickets(req, cell['value'])
3. 同步修复Python3兼容问题
原代码中还有几处Python2语法需要调整:
- 将
iteritems()改为items():在post_process_request的字段遍历处修改:for field, field_data in change['fields'].items(): # 替换iteritems() - 将
to_unicode()改为str():Python3中字符串默认是Unicode,直接替换即可:# 示例: elms.append(html.em(', '.join(str(n) for n in sorted(add)))) # 以及依赖图文本渲染处: req.send(str(g).encode('ascii', 'replace'), 'text/plain') - 调整
subprocess输出解码:Python3中communicate返回字节流,需解码后日志输出:img, err = gs.communicate(ps) if err: self.log.debug('MasterTickets: Error from gs: %s', err.decode('utf-8', 'replace'))
验证效果
修改完成后启动Trac服务,验证以下场景:
- 单个工单页面的blocking/blockedby字段是否显示可点击链接
- 查询结果页面的工单列表中,blocking/blockedby字段是否正确渲染链接
- 报表页面中包含blocking/blockedby的列是否显示链接
- 依赖图生成功能是否正常运行
内容的提问来源于stack exchange,提问作者lord rufusus
相关产品推荐
相关产品推荐

