seed_insight_link.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. """seed_insight_link.py —— 把归纳区与报告层打通示例样本(可重复执行)。
  2. 库里现有 4 条归纳的支撑成果(derivedArtifacts)都来自李娜 / 王芳 / 刘洋,示例报告挂在张伟那份成果上,
  3. 所以"归纳 → 归纳自哪几份报告"这条链路没有可看的样本。本脚本:
  4. 1. 在归纳「夜宵场景对低卡有明确诉求」的证据链里补一条张伟的成果(示例报告加载的那条),
  5. 并把对应的结论 c-texture / c-price 记进 citedInsightIds —— 这样这条归纳的支撑成果里就有一份带报告的成果;
  6. 2. 归纳页会出现「归纳自 N 份报告」,展开能看到报告与它引用的结论,可点进报告 / 证据链。
  7. 只在库里确有"示例报告"时才执行;不新增数据,只补充交叉引用。
  8. python3 tools/seed_insight_link.py --dry-run
  9. python3 tools/seed_insight_link.py
  10. """
  11. import json, os, sys, urllib.request
  12. BASE = "https://kangshifu.fmode.cn/parse"
  13. APP_ID = "FKieRbIoGt_main"
  14. MK = os.environ.get("PARSE_MASTER_KEY", "")
  15. DRY = "--dry-run" in sys.argv
  16. H = {"X-Parse-Application-Id": APP_ID, "Content-Type": "application/json"}
  17. if MK:
  18. H["X-Parse-Master-Key"] = MK
  19. INSIGHT_TITLE = "夜宵场景对低卡有明确诉求"
  20. REPORT_OWNER = "张伟" # 示例报告挂在张伟的成果上
  21. CONCL = ["c-texture", "c-price"]
  22. def call(m, p, b=None):
  23. data = json.dumps(b, ensure_ascii=False).encode() if b is not None else None
  24. r = urllib.request.Request(BASE + p, data=data, headers=H, method=m)
  25. with urllib.request.urlopen(r, timeout=30) as x:
  26. return json.loads(x.read().decode() or "{}")
  27. def main():
  28. if not MK and not DRY:
  29. sys.exit("PARSE_MASTER_KEY 未设置")
  30. arts = call("GET", "/classes/KfArtifact?limit=1000&order=createdAt")["results"]
  31. rep = next((a for a in arts if a.get("report") and a.get("ownerName") == REPORT_OWNER), None)
  32. if not rep:
  33. sys.exit("库里没有示例报告(先运行 tools/seed_report.py)")
  34. ins = next((i for i in call("GET", "/classes/KfInsight?limit=1000")["results"]
  35. if i.get("title") == INSIGHT_TITLE), None)
  36. if not ins:
  37. sys.exit(f"找不到归纳:{INSIGHT_TITLE}")
  38. derived = list(ins.get("derivedArtifacts") or ins.get("derivedFrom") or [])
  39. if rep["objectId"] not in derived:
  40. derived.append(rep["objectId"])
  41. body = {"derivedArtifacts": derived, "citedInsightIds": CONCL,
  42. "reportRoles": {rep["objectId"]: CONCL}}
  43. if DRY:
  44. print("[dry]", INSIGHT_TITLE, body)
  45. return
  46. r = call("PUT", f"/classes/KfInsight/{ins['objectId']}", body)
  47. print("insight linked:", ins["objectId"], "→", rep["objectId"], "| ok" if "updatedAt" in r else r)
  48. if __name__ == "__main__":
  49. main()