特雷克。向ti添加自定义选择字段

2024-05-05 05:38:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试写一个插件,它将添加一个特定的选择类型自定义字段到一个票证。与select类型的常规自定义字段的不同之处在于,该字段将从数据库中获取其值,并使用optgroups创建select。在

我通过trac配置文件创建一个自定义的选择字段,并用Transformer修改它

代码是这样的:

        db = self.env.get_db_cnx()
        cursor = db.cursor()

        cursor.execute("SELECT name, a_id FROM a_group")
        groups = cursor.fetchall()

        cursor.execute("SELECT id, name FROM activities")
        activities = cursor.fetchall()

        for activity in activities:
            stream = stream | Transformer('.//select[@id="field-activity"]').append(tag.optgroup(label=activity[1], id="act-"+str(activity[0])))

            for group in groups:

                if int(group[1]) == activity[0]:

                    stream = stream | Transformer('.//optgroup[@id="act-' + str(activity[0]) + '"]').append(tag.option(group[0]))

问题是:当我试图保存一个newticket时,我得到一个错误:

^{pr2}$

这是因为,当我通过trac custom fields功能使用custom fields时,我没有通过trac config file提供任何选项。在

问题是——实现这种特性的最佳(如果有的话)方法是什么?在


Tags: namefromid类型executedbstreamgroup
2条回答

我想您应该实现IRequestFilter。在post_process_request中,可以修改selectoptions。例如,如果我想将组件选择更改为一组硬编码值:

    def post_process_request(self, req, template, data, content_type):
    if data and 'fields' in data:
       for entry in data['fields']:
            if 'name' in entry and entry['name'] == 'component':
                entry['options'] = ['component1', 'component2', 'component3']

因此您应该能够在post_process_request中执行一个db查询,从数据库中提取值并填充字典项:entry['options'] = self.env.db_query(...)。在

您可能需要在自定义字段的配置文件中至少放置一个虚拟选项。在

错误来自中的“\u validate_ticket”trac.ticket.web_用户界面. 如源注释标题中所述,它将“始终验证选项字段的已知值”。在

由于您已经损坏了自定义字段的外观,因此可能需要尝试更改其输入字段类型。我们的想法是假装它是一个简单的(文本)输入字段,它可以不经验证就接受任何值,明白吗?在

其他方法可能涉及到破坏Trac核心代码,这不是一个好主意,尤其是如果您计划在未来几年内遵循上游代码。在

相关问题 更多 >