QA #946
奈良 裕記 さんが約5年前に更新
h3. ■現象/要望
Redmineでは、PJ間で共用するカスタムクエリの作成及び編集操作は、adminのみ可能に設計されている。(Redmine3.4, admin以外のユーザは、自分のみ/単一PJ内のみ有効なカスタムクエリしか作成/編集できない。(Redmine3.4, 4.0時点)
この事は、結果的に下記問題を招く場合がある(特に大規模環境) 結果的に下記問題を招いている(特に大規模環境)
・adminへの作業負荷集中
・admin権限割当者の増加
・PJ間共用カスタムクエリの作成/編集機能は、ユーザで作業完結しないため、積極的に利用されない。 ・同一カスタムクエリを各PJで個別に作成→作業負荷増加、作業ミス増加
(adminにいちいち頼まなければならないため心理的障壁になる)
これにより、同一カスタムクエリを各PJで個別に作成→作業負荷増加、作業ミス増加 ・ユーザで作業完結しない機能(adminにいちいち頼まなければならない)は、ユーザに積極的に利用されない。
この対応として、PJ間共用カスタムクエリをadmin以外が作成/編集可能としたい。 この対応として、PJ間共用カスタムクエリをadmin以外が作成/編集したい。
なお、カスタムクエリのPJ間共用自体については、 #250 参照(PJのRole指定利用)
h3. ■解決策
操作者=カスタムクエリ作成者の場合、無条件にカスタムクエリを編集可能とする処理を追加する。
非adminが作成したカスタムクエリを、adminがPJ間共用に変更することで可能。
但し、カスタムクエリの編集後は、adminが表示権限を再設定する必要がある。
h4. ■Redmine本体のコード変更
h5. app/models/query.rb
操作者=クエリ作成者の場合、無条件にカスタムクエリを編集可能とする処理を追加
(self.user_id == user.id))
app/models/query.rb
<pre><code class="ruby">
def editable_by?(user)
return false unless user
# Admin can edit them all and regular users can edit their private queries
> return true if ((is_public? && user.allowed_to?(:manage_public_queries, project)) || (self.user_id == user.id))
< return true if is_public? && user.allowed_to?(:manage_public_queries, project)
return true if user.admin? || (is_private? && self.user_id == user.id)
# Members can not edit public queries that are for all project (only admin is allowed to)
is_public? && !is_global? && user.allowed_to?(:manage_public_queries, project)
end
</code></pre>
h5. app/controllers/queries_controller.rb
adminまたはPJ内クエリ以外の場合、強制的に個人単位クエリに再設定している処理を回避した。
<pre><code class="ruby">
def update_query_from_params
< if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin?
> if User.current.allowed_to?(:manage_public_queries, @query.project) || User.current.admin? || @query.user == User.current
</code></pre>
h5. app/views/queries/_form.html.erb
カスタムクエリ編集画面の表示権限設定部分、adminのみ/クエリ作成時のみ表示している箇所を、クエリ作成者にも表示するように変更した。
<pre><code class="ruby">
< <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @query.project) %>
---
> <% if User.current.admin? || User.current.allowed_to?(:manage_public_queries, @query.project) || @query.user == User.current %>
< <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?, :class => (User.current.admin? ? '' : 'disable-unless-private') %></p>
---
> <%= check_box_tag 'query_is_for_all', 1, @query.project.nil?, :class => (true ? '' : 'disable-unless-private') %></p>
</code></pre>
h4. ■ クエリ作成-PJ共用化手順
クエリ作成者:(PJのクエリ作成、クエリ保存の権限が必要)
・PJ内でカスタムクエリを作成する。
・「全プロジェクト向け」をチェックしない。(PJ内のみ有効)
・「表示」-「次のロールのみ」、クエリ利用許可するロールを選択する。
・カスタムクエリを保存する。
・カスタムクエリのIDをadminに連絡する。
admin:
・PJ間で共用するカスタムクエリを編集する。
・「全プロジェクト向け」をチェックする。(ロール割当者は利用可能)
・カスタムクエリを保存する
カスタムクエリ編集後は再設定作業が必要
クエリ作成者のカスタムクエリ修正後は、下記問題が発生するため、adminがクエリ表示権限を再設定する必要がある。
(クエリ作成者のみ利用可能となってしまう。但しadminはクエリID指定で利用可)
・クエリ作成者はカスタムクエリの設定変更が可能だが、カスタムクエリの保存時に、作成者本人のみ利用可能となってしまう。
・クエリ作成者は、使用可能者なロールを変更できない。
h3. ■対応状況
Redmineソース変更+運用により対処可能
h3. ■補足
各カスタムクエリを表示制御するロールの権限は、PJ単位に設定する必要がある。
PJ間のメンバー継承、ユーザグループ単位のロール割当の利用が必要と思われる。
カスタムクエリ修正後のadmin再設定作業は不要とし、ユーザ側で作業完結させたい。
カスタムクエリ編集後の権限再設定は下記処理による。
app/controllers/queries_controller.rb
def update_query_from_params
クエリ作成者の確認
・上記のカスタムクエリ作成者IDは、queriesテーブルのuser_id に格納されている。
・カスタムクエリの参照/編集画面上で、表示/編集可能とすることが望ましいと思われる。(修正依頼先の確認、担当者変更)
戻る