1
0
-1

ScriptRunner for jiraで以下のような設定は可能でしょうか。

プロジェクト名: テストプロジェクト
プロジェクトロール: 社内ユーザー、社外ユーザー1、社外ユーザー2
セキュリティレベル: 全員閲覧可能(社内ユーザー、社外ユーザー1、社外ユーザー2)、社内のみ閲覧可能(社内ユーザー)

セキュリティレベルが「全員閲覧可能」の課題を誰かが編集した時に(Issue Updated, Issue Commented, Issue Comment Edited等どこかのフィールドが編集されるイベントが発生したときに)、自動的にセキュリティレベルを「社内のみ閲覧可能」に変更する。なお、課題セキュリティの設定権限は社内ユーザーのみが持っているとします。

以上です。

    Commentコメントを追加...

    1 回答

    1.  
      2
      1
      0

      ScriptRunner の Listners で実行したいときの Events を指定し、
      以下のようなスクリプトを適用することで
      その課題のセキュリティレベルを変更することができたようでしたが、いかがでしょうか...?

      import com.atlassian.jira.component.ComponentAccessor;
      import com.atlassian.jira.event.type.EventDispatchOption;
      import com.atlassian.jira.issue.IssueManager;
      import com.atlassian.jira.issue.MutableIssue;
      import com.atlassian.jira.user.ApplicationUser;
      
      
      long SECURITY_LEVEL_ID = 10001L;
      
      IssueManager issueManager = ComponentAccessor.getIssueManager();
      
      MutableIssue issue = (MutableIssue) event.getIssue();
      
      if (issue != null && issue.getProjectObject().getKey().equals("BEHAVTEST")) {
          Long securityLevelId = issue.getSecurityLevelId();
          if (securityLevelId == null || !securityLevelId.equals(SECURITY_LEVEL_ID)) {
              issue.setSecurityLevelId(SECURITY_LEVEL_ID);
              ApplicationUser applicationUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
              issueManager.updateIssue(applicationUser, issue, EventDispatchOption.DO_NOT_DISPATCH, false);
          }
      }

      SECURITY_LEVEL_ID には、設定したいセキュリティレベルの ID を指定してください。
      "TESTPROJ" の部分は、テストプロジェクトのプロジェクトキーに置き換えてください。

      1. gussan

        ありがとうございます!
        上のスクリプトが動作することが確認できました!

        上のスクリプトでissue updateイベント発生時にセキュリティレベルが「社内のみ閲覧可能」へ変更されることをかくにんできました。
        ちなみに追加で次のような設定は可能でしょうか。

        (設定)プロジェクトロール「プロジェクト管理者」を設けて、プロジェクト管理者のみ「社内のみ閲覧可能」→「 全員閲覧可能」へセキュリティレベルを変更することができるようにする

        もしよい方法があればご教示ください。

      2. Shuzaburo Doba

        ありがとうございます!
        無事期待する動作となったとのことでよかったです。

        追加の内容につきまして...

        セキュリティレベルを変更できるユーザーは、プロジェクト権限で「課題セキュリティの設定」の権限を持っている必要があります。

        上記のスクリプトを使用して、課題が更新されたときに自動的にセキュリティレベルを変更するようするでしたら、
        「プロジェクト管理者」ロール以外のユーザーには「課題セキュリティの設定」権限は持たせないようにするのもいいのかと思いましたがいかがでしょうか...?

        (情報) 上記のスクリプトは、「課題セキュリティの設定」権限を持っていないユーザーが課題を更新しても、セキュリティレベルが設定されるような内容となっています。


      3. gussan

        ご返信ありがとうございます!

        なるほどですね、プロジェクト管理者以外に「課題セキュリティの設定」権限を持たせないことにします。

        ただ、1つ気になっていることがありまして。私の環境だと上記スクリプトを使うと、「社内のみ閲覧可能」→「全員閲覧可能」へ変更することができません。もう少し言うとセキュリティレベルを変更「社内のみ閲覧可能」→「全員閲覧可能」しようとすると、強制的に「社内のみ閲覧可能」が設定されてしまいます。


        ちなみに、以下のコードの解釈の仕方は

        セキュリティレベルが設定されていないか、「社内のみ閲覧可能」になっていないという条件の時に、「社内のみ閲覧可能」に設定しないさい

        ということであっていますかね?? だとしたら、「社内のみ閲覧可能」→「全員閲覧可能」という変更は可能だと思うのですが..

        Shuzaburo Doba さんの方では「社内のみ閲覧可能」→「全員閲覧可能」という変更は可能でしょうか。差し支えなければお教えください。

        long SECURITY_LEVEL_ID = xxxxx
        //「社内のみ閲覧可能」に設定
        
        if (securityLevelId == null || !securityLevelId.equals(SECURITY_LEVEL_ID)) {
                issue.setSecurityLevelId(SECURITY_LEVEL_ID);
      4. Shuzaburo Doba

        gussan

        申し訳ありません。

        セキュリティレベルを解除しても、Listener のスクリプトでまた設定しなおしてしまっている状態だと思います...

        たとえば Listener のスクリプトを以下のようにすることで、
        一度セキュリティレベルが解除された課題にはセキュリティレベルを設定しないようにできるかと思いますが、いかがでしょうか...?

        import com.atlassian.jira.component.ComponentAccessor;
        import com.atlassian.jira.event.issue.IssueEvent;
        import com.atlassian.jira.event.type.EventDispatchOption;
        import com.atlassian.jira.event.type.EventType;
        import com.atlassian.jira.issue.*;
        import com.atlassian.jira.issue.changehistory.ChangeHistory;
        import com.atlassian.jira.issue.changehistory.ChangeHistoryManager;
        import com.atlassian.jira.issue.history.ChangeItemBean;
        import com.atlassian.jira.user.ApplicationUser;
        import java.util.List;
        
        
        long SECURITY_LEVEL_ID = 10001L;
        
        Issue issue = event.getIssue();
        if (issue == null) return;
        
        if (issue.getProjectObject().getKey().equals("TESTPROJ")) {
            Long securityLevelId = issue.getSecurityLevelId();
            // Skip if the security of this issue is set already.
            if (securityLevelId != null && !securityLevelId.equals(SECURITY_LEVEL_ID)) return;
                
            // Check whether the security of this issue was released already.
            ChangeHistoryManager changeHistoryManager = ComponentAccessor.getChangeHistoryManager();
            List<ChangeHistory> changeHistories = changeHistoryManager.getChangeHistories(issue);
        
            boolean securityWasReleased = false;
            out:
            for (ChangeHistory changeHistory : changeHistories) {
                List<ChangeItemBean> changeItemBeans = changeHistory.getChangeItemBeans();
        
                for (ChangeItemBean changeItemBean : changeItemBeans) {
                    if (changeItemBean.getField().equals("security")
                            && (changeItemBean.getTo() == null || changeItemBean.getTo().equals(""))) {
                        securityWasReleased = true;
                        break out;
                    }
                }
            }
        
            // If the security level for this issue has not already been removed, set the security level.
            if (!securityWasReleased) {          
                IssueManager issueManager = ComponentAccessor.getIssueManager();
                MutableIssue mutableIssue = issueManager.getIssueObject(issue.getId());
                mutableIssue.setSecurityLevelId(SECURITY_LEVEL_ID);
                ApplicationUser applicationUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
                issueManager.updateIssue(applicationUser, mutableIssue, EventDispatchOption.DO_NOT_DISPATCH, false);
            }
        }
        

        前回と同様ですが、
        SECURITY_LEVEL_ID には、設定したいセキュリティレベルの ID を指定してください。
        "TESTPROJ" の部分は、テストプロジェクトのプロジェクトキーに置き換えてください。

      5. gussan

        お返事いただきありがとうございます!
        現在手元にJira環境がないので、年明けに試させていただきますね。

      6. Shuzaburo Doba

        あけましておめでとうございます。
        今年もお願いいたします。

        お返事遅くなり申し訳ございません。
        ご確認ありがとうございます!

        無事に期待する動作となっていましたら幸いです。

      7. gussan

        明けましておめでとうございます。
        紹介していただいたスクリプトをもう少し自分でも調整してみたいと思います。

        ありがとうございました!

      8. Shuzaburo Doba

        gussan さん

        明けましておめでとうございます。

        ご確認ありがとうございました!

        お役に立てておりましたら幸いです。

        今年もよろしくお願いいたします。

      Commentコメントを追加...