You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:30:53