feat(skill): zentao-bug 新增 assign 命令,支持指派 Bug 并附备注
等同网页「指派」表单:--to 接受账号或姓名,状态保持激活,提交后回读校验指派人; 多行备注用 --comment-file,换行转 <br /> 以便网页分行显示。 SKILL.md 补充用法,约定转给后端时备注照搬《后端接口对接问题清单》对应行。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -569,6 +569,59 @@ def cmd_resolve(args):
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def resolve_user(users, who):
|
||||
"""按账号或姓名定位用户:先精确匹配账号,再按「姓名」匹配(禅道显示名形如 T:陶雨佳)。"""
|
||||
if who in users:
|
||||
return who
|
||||
hits = [k for k, v in users.items() if k and v.split(":", 1)[-1] == who]
|
||||
if len(hits) == 1:
|
||||
return hits[0]
|
||||
die(f"找不到唯一的用户「{who}」" + (f",候选:{', '.join(hits)}" if hits else ""))
|
||||
|
||||
|
||||
def comment_html(text):
|
||||
"""备注是富文本,纯文本换行在网页上会被合并,逐行转义后用 <br /> 连接。"""
|
||||
return "<br />".join(html.escape(line) for line in text.splitlines())
|
||||
|
||||
|
||||
def cmd_assign(args):
|
||||
"""指派 Bug:等同网页「指派」表单(指派给 + 备注),状态保持激活;提交后回读校验指派人。"""
|
||||
client = Client(load_config())
|
||||
comment = args.comment
|
||||
if args.comment_file:
|
||||
comment = Path(args.comment_file).read_text(encoding="utf-8").strip()
|
||||
failed = 0
|
||||
for bug_id in args.ids:
|
||||
form = client.page(f"/bug-assignTo-{bug_id}.json")
|
||||
bug = (form or {}).get("bug")
|
||||
if not bug:
|
||||
print(f"#{bug_id} 跳过:不存在或无权查看")
|
||||
failed += 1
|
||||
continue
|
||||
users = form.get("users") or {}
|
||||
account = resolve_user(users, args.to)
|
||||
title = html.unescape(bug["title"])
|
||||
desc = f"#{bug_id} {title} → 指派给 {users.get(account, account)}"
|
||||
if args.dry_run:
|
||||
print(f"[dry-run] {desc}")
|
||||
if comment:
|
||||
print(" 备注:\n " + comment.replace("\n", "\n "))
|
||||
continue
|
||||
fields = {"assignedTo": account, "status": bug["status"], "mailto[]": "",
|
||||
"comment": comment_html(comment) if comment else ""}
|
||||
resp = client.post_form(f"/bug-assignTo-{bug_id}.html?onlybody=yes", fields)
|
||||
after = client.page(f"/bug-view-{bug_id}.json").get("bug") or {}
|
||||
if after.get("assignedTo") == account:
|
||||
print(f"已指派 {desc}")
|
||||
else:
|
||||
alerts = re.findall(r"alert\((['\"])(.*?)\1\)", resp)
|
||||
print(f"#{bug_id} 失败:提交后指派人仍为 {after.get('assignedTo')}"
|
||||
+ (f",禅道提示:{'; '.join(html.unescape(a[1]) for a in alerts)}" if alerts else ""))
|
||||
failed += 1
|
||||
if failed:
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def main():
|
||||
ap = argparse.ArgumentParser(description="禅道 18.x Bug 读取工具")
|
||||
sub = ap.add_subparsers(dest="cmd", required=True)
|
||||
@@ -604,6 +657,14 @@ def main():
|
||||
p.add_argument("--dry-run", action="store_true", help="只打印将要做的修改,不提交")
|
||||
p.set_defaults(func=cmd_resolve)
|
||||
|
||||
p = sub.add_parser("assign", help="指派 Bug 并附备注(写操作,会改动禅道线上状态)")
|
||||
p.add_argument("ids", type=int, nargs="+")
|
||||
p.add_argument("--to", required=True, help="指派给:账号(如 TYJ)或姓名(如 陶雨佳)")
|
||||
p.add_argument("--comment", default="", help="备注,多行用换行分隔")
|
||||
p.add_argument("--comment-file", help="从文件读取备注(多行内容推荐用这个)")
|
||||
p.add_argument("--dry-run", action="store_true", help="只打印将要做的修改,不提交")
|
||||
p.set_defaults(func=cmd_assign)
|
||||
|
||||
args = ap.parse_args()
|
||||
try:
|
||||
args.func(args)
|
||||
|
||||
Reference in New Issue
Block a user