2
1
0

担当者を変更(手動)する特定トランジションがあり、そのトランジションの事後操作にて旧担当者をウォッチャーに入れようとしています。

以下スクリプトをpost-functionに入れたのですが、想定通りに動きませんでした。

com.atlassian.jira.issue.IssueManager issueManager = com.atlassian.jira.component.ComponentAccessor.getIssueManager();
com.atlassian.jira.user.util.UserManager userManager = com.atlassian.jira.component.ComponentAccessor.getUserManager();
com.atlassian.jira.issue.changehistory.ChangeHistoryManager changeHistoryManager = com.atlassian.jira.component.ComponentAccessor.getChangeHistoryManager();
com.atlassian.jira.issue.watchers.WatcherManager watcherManager = com.atlassian.jira.component.ComponentAccessor.getWatcherManager();

/* issue オブジェクトが操作された課題オブジェクトで渡される */
com.atlassian.jira.issue.Issue issueObject = issueManager.getIssueObject(issue.getId());

java.util.List<com.atlassian.jira.issue.changehistory.ChangeHistoryItem> changeHistoryItems = changeHistoryManager.getAllChangeItems(issueObject);
java.util.List<com.atlassian.jira.issue.changehistory.ChangeHistory> changeHistories = changeHistoryManager.getChangeHistories(issueObject);
String result = null;
/* ChangeHistoryをなめる */
for (com.atlassian.jira.issue.changehistory.ChangeHistory changeHistory : changeHistories) {
    java.util.List<com.atlassian.jira.issue.history.ChangeItemBean> changeItemBeans = changeHistory.getChangeItemBeans();
    for (com.atlassian.jira.issue.history.ChangeItemBean changeItemBean : changeItemBeans) {
/* changeItemBeanの中からassigneeのものを抽出(複数の場合result上書き) */
        if (changeItemBean.getField() == "assignee"){
                result = changeItemBean.getFrom();
        }
    }
}
/* ウォッチャー登録 */
if(result){
watcherManager.startWatching(userManager.getUserByKey(result), issueObject);
}

 

テストした課題ではchangelogが3つあり、履歴が以下のようになっています。(テスト後確認)

  • 変更履歴1.担当者をuser01に割り当て (null→user01)
  • 変更履歴2.担当者をuser02に割り当て (user01→user2)
  • 変更履歴3.トランジションを実行し、担当者をtestadminに割り当て (user02→testadmin)
     ※このトランジションにて事後操作のpost-functionでスクリプトが走っている

想定

変更履歴3の情報からuser02がウォッチャーに入る。

実際の結果

user01がウォッチャーに入ってしまう。

 

Script Consoleでの事後確認では想定通りの動作をします…。

事後操作であれば変更履歴3の情報が取得できると思っていましたが違うのでしょうか?

上ではChangeHistoryをなめていく処理をしていますが、そもそもトランジション時の「事後操作」で変更前の値を取得する手段は別にあるでしょうか?

    Commentコメントを追加...

    2 回答

    1.  
      2
      1
      0

      自己解決しました。

      事後操作の追加後に、順を変更していなかったミスによるものでした。

      変更前

      変更後

      これで想定通りの動きになりました。

      1. Kengo Ohsaki

        上記スクリプトだとChangeHistoryを昇順になめて、複数の場合result上書きしていくのでpost-functionの順序が重要になりますね。

        そもそもトランジション時の「事後操作」で変更前の値を取得する手段は別にあるでしょうか?

        https://github.com/atlassian/jira-suite-utilities/blob/master/src/main/java/com/googlecode/jsu/workflow/function/AbstractPreserveChangesPostFunction.java

        より ChangeHistoryをなめずに

        transientVars.get(changeItems) で取得で直近の変更が取得できたような記憶ですが、ごめんなさい間違ってたらすみません。


      2. RYOITO

        直近が取得できればforが減らせますね!

        情報ありがとうございます。

      3. RYOITO

        動きますね。

        /* 直近のchangeItemsを取得 */
            java.util.List<com.atlassian.jira.issue.history.ChangeItemBean> changeItemBeans = (java.util.List<com.atlassian.jira.issue.history.ChangeItemBean>) transientVars.get("changeItems");
            for (com.atlassian.jira.issue.history.ChangeItemBean changeItemBean : changeItemBeans) {
        /* changeItemBeanの中からchangeItemBeanがassigneeのものを抽出 */
                        if (changeItemBean.getField() == "assignee"){
                        result = changeItemBean.getFrom();
                }
            }

        Script Console等で事前確認できないのでドキドキでしたが

      4. Kengo Ohsaki

        検証ありがとうございます!

         

      Commentコメントを追加...
    2.  
      1
      0
      -1

      トランジション時の情報を持ってこれないなら

      result = changeItemBean.getTo();

      にすればいい。

      ただ気持ち悪い。

        Commentコメントを追加...