我正在尝试写一个插件,它将添加一个特定的选择类型自定义字段到一个票证。与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提供任何选项。在
问题是——实现这种特性的最佳(如果有的话)方法是什么?在
我想您应该实现
IRequestFilter
。在post_process_request
中,可以修改select
的options
。例如,如果我想将组件选择更改为一组硬编码值:因此您应该能够在
post_process_request
中执行一个db查询,从数据库中提取值并填充字典项:entry['options'] = self.env.db_query(...)
。在您可能需要在自定义字段的配置文件中至少放置一个虚拟选项。在
错误来自中的“\u validate_ticket”trac.ticket.web_用户界面. 如源注释标题中所述,它将“始终验证选项字段的已知值”。在
由于您已经损坏了自定义字段的外观,因此可能需要尝试更改其输入字段类型。我们的想法是假装它是一个简单的(文本)输入字段,它可以不经验证就接受任何值,明白吗?在
其他方法可能涉及到破坏Trac核心代码,这不是一个好主意,尤其是如果您计划在未来几年内遵循上游代码。在
相关问题 更多 >
编程相关推荐