如何使用脚本生成带有描述的 Trac 里程碑?

How to use a script to generate a Trac Milestone complete with a description?

描述是里程碑的主体,我想在自动化过程中生成包含描述的里程碑。

如果您直接更新其数据库中的表,Trac 的表现不会很好,所以即使我可以在那里看到里程碑,我也会避免采用这种方法。

使用 https://trac.edgewall.org/wiki/0.11/TracAdmin 中记录的 trac-admin 命令行实用程序几乎可以解决问题,因为它允许创建里程碑,但不能为里程碑指定描述。

MilestoneModuleRoadmapModule class 在这里:https://het.as.utexas.edu/HET/Software/trac/api/trac_ticket_roadmap.html 看起来很有希望,但 MilestoneModuleRoadmapModule 似乎没有提供创建和列出里程碑的能力。

所以一定有一些几乎没有记录的 class 或方法可以做到这一点。这是什么?

使用 MilestoneCache 对象添加里程碑,就像这个脚本一样(或者只使用脚本,这是我从命令行或通过 subprocess.run 从 Python3 执行的操作,因为 Trac 当前在 Python2 而不是 3)

上运行
#!/usr/bin/python2

from trac.env import open_environment
from trac.ticket import Milestone
from trac.ticket.model import MilestoneCache
from trac.core import TracError
import sys, json;

if len(sys.argv)!=2:
  print '''
  Usage: python2 createMilestone.py2 dir

  e.g.   python2 createMilestone.py2 ~/trac M3 <<END
         { "name": "M3",
           "due": "2021-01-01 04:00:00+00:00",
           "completed": "2021-12-31 23:59:59+00:00",
           "description": "" }
         END
  '''
  exit(3)

try:
  data = json.load(sys.stdin)
except:
  sys.stderr.write("Bad input data")
  exit(2)

try:
  mc=MilestoneCache(open_environment(sys.argv[1]))
  mc.factory((data['name'],data['due'],data['completed'],data['description'])).insert()  
except:
  sys.stderr.write("Can't update "+sys.argv[1]+"\n")
  exit(1)

该脚本将 JSON 和里程碑的所有字段作为输入。这与我在编写 Python3 时用于创建票证的技术相同,因为 Trac 是一个 Python2 程序。

相反,如果您想列出里程碑,您可以使用这个类似的脚本,并且您可以将一个列为 jSON 的里程碑从一个 Trac 站点传送到另一个站点。

有时我在教授课程时会为每个学生准备一个 Trac 站点,然后通过下面的脚本转储里程碑,然后通过上面的脚本将其传输到学生的 Trac 站点。

#!/usr/bin/python2

from trac.env import open_environment
from trac.ticket import Milestone
from trac.ticket.model import MilestoneCache
from trac.core import TracError
import sys, json;

if len(sys.argv)!=3:
  print '''
  Usage: python2 getMilestone dir milestone

  e.g.   python2 getMilestone ~/trac M3
  '''
  exit(3)

try:
  name,due,completed,description = MilestoneCache(open_environment(sys.argv[1])).milestones[sys.argv[2]]
  print json.dumps({
    "name":name,
    "due":str(due) if due else None,
    "completed":str(completed) if completed else None,
    "description":description
  },indent=2)
except KeyError:
  pass
except TracError:
  sys.stderr.write("Can't open "+sys.argv[1]+"\n")
  exit(1)