1 回答
- 210
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" の部分は、テストプロジェクトのプロジェクトキーに置き換えてください。- gussan
ありがとうございます!
上のスクリプトが動作することが確認できました!上のスクリプトでissue updateイベント発生時にセキュリティレベルが「社内のみ閲覧可能」へ変更されることをかくにんできました。
ちなみに追加で次のような設定は可能でしょうか。(設定)プロジェクトロール「プロジェクト管理者」を設けて、プロジェクト管理者のみ「社内のみ閲覧可能」→「 全員閲覧可能」へセキュリティレベルを変更することができるようにする
もしよい方法があればご教示ください。
- Shuzaburo Doba
ありがとうございます!
無事期待する動作となったとのことでよかったです。追加の内容につきまして...
セキュリティレベルを変更できるユーザーは、プロジェクト権限で「課題セキュリティの設定」の権限を持っている必要があります。
上記のスクリプトを使用して、課題が更新されたときに自動的にセキュリティレベルを変更するようするでしたら、
「プロジェクト管理者」ロール以外のユーザーには「課題セキュリティの設定」権限は持たせないようにするのもいいのかと思いましたがいかがでしょうか...?上記のスクリプトは、「課題セキュリティの設定」権限を持っていないユーザーが課題を更新しても、セキュリティレベルが設定されるような内容となっています。
- gussan
ご返信ありがとうございます!
なるほどですね、プロジェクト管理者以外に「課題セキュリティの設定」権限を持たせないことにします。
ただ、1つ気になっていることがありまして。私の環境だと上記スクリプトを使うと、「社内のみ閲覧可能」→「全員閲覧可能」へ変更することができません。もう少し言うとセキュリティレベルを変更「社内のみ閲覧可能」→「全員閲覧可能」しようとすると、強制的に「社内のみ閲覧可能」が設定されてしまいます。
ちなみに、以下のコードの解釈の仕方は
セキュリティレベルが設定されていないか、「社内のみ閲覧可能」になっていないという条件の時に、「社内のみ閲覧可能」に設定しないさい
ということであっていますかね?? だとしたら、「社内のみ閲覧可能」→「全員閲覧可能」という変更は可能だと思うのですが..
Shuzaburo Doba さんの方では「社内のみ閲覧可能」→「全員閲覧可能」という変更は可能でしょうか。差し支えなければお教えください。
long SECURITY_LEVEL_ID = xxxxx //「社内のみ閲覧可能」に設定 if (securityLevelId == null || !securityLevelId.equals(SECURITY_LEVEL_ID)) { issue.setSecurityLevelId(SECURITY_LEVEL_ID);
- Shuzaburo Doba
申し訳ありません。
セキュリティレベルを解除しても、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" の部分は、テストプロジェクトのプロジェクトキーに置き換えてください。 - gussan
お返事いただきありがとうございます!
現在手元にJira環境がないので、年明けに試させていただきますね。 - Shuzaburo Doba
あけましておめでとうございます。
今年もお願いいたします。お返事遅くなり申し訳ございません。
ご確認ありがとうございます!無事に期待する動作となっていましたら幸いです。
- gussan
明けましておめでとうございます。
紹介していただいたスクリプトをもう少し自分でも調整してみたいと思います。ありがとうございました!
コメントを追加...
ScriptRunner for jiraで以下のような設定は可能でしょうか。
プロジェクト名: テストプロジェクト
プロジェクトロール: 社内ユーザー、社外ユーザー1、社外ユーザー2
セキュリティレベル: 全員閲覧可能(社内ユーザー、社外ユーザー1、社外ユーザー2)、社内のみ閲覧可能(社内ユーザー)
セキュリティレベルが「全員閲覧可能」の課題を誰かが編集した時に(Issue Updated, Issue Commented, Issue Comment Edited等どこかのフィールドが編集されるイベントが発生したときに)、自動的にセキュリティレベルを「社内のみ閲覧可能」に変更する。なお、課題セキュリティの設定権限は社内ユーザーのみが持っているとします。
以上です。