プロジェクト

全般

プロフィール

QA #946

未完了

PJ間共用カスタムクエリをadmin以外が作成/編集したい。

奈良 裕記 さんが約5年前に追加. 約3年前に更新.

ステータス:
回答済
優先度:
通常
担当者:
-
カテゴリ:
-
対象バージョン:
開始日:
2019/05/04
期日:
進捗率:

0%

予定工数:

説明

本記事は、Qiitaにも公開してみました。(画面コピー他、大分修正)
https://qiita.com/y503Unavailable/items/2721608ef372f422b5d0

■現象/要望

Redmineでは、PJ間で共用するカスタムクエリの作成及び編集操作は、adminのみ可能に設計されている。(Redmine3.4, 4.0時点)

この事は、結果的に下記問題を招く場合がある(特に大規模環境)
・adminへの作業負荷集中
・admin権限割当者の増加
・PJ間共用カスタムクエリの作成/編集機能は、ユーザで作業完結しないため、積極的に利用されない。
(adminにいちいち頼まなければならないため心理的障壁になる)
これにより、同一カスタムクエリを各PJで個別に作成→作業負荷増加、作業ミス増加

この問題の解決策として、PJ間共用カスタムクエリをadmin以外が作成/編集可能としたい。

本家チケット起票済
Allowing non-admin to create/edit custom queries shared among projects
http://www.redmine.org/issues/31349

なお、カスタムクエリのPJ間共用自体については、 #250 参照(PJのRole指定利用)

■解決策

操作者=カスタムクエリ作成者の場合、admin同様に無条件にカスタムクエリを編集可能とする処理を追加する。
カスタムクエリの表示制御は、各PJのロール割当により行う。(現行機能)

#本解決策は、現行Redmineに対して最小の変更で対処することを意識して作成した。
#システム単位のロール割当、DB設計変更を実施すれば、より一貫性を持って実装できる。

■Redmine本体のコード変更

下記3ファイル-4行の変更で可能
app/models/query.rb
app/controllers/queries_controller.rb
app/views/queries/_form.html.erb

3.4用修正は下記参照
https://github.com/y503unavailable/redmine/issues/28

app/models/query.rb

操作者=クエリ作成者の場合、無条件にカスタムクエリを編集可能とする処理を追加
(self.user_id == user.id))

  def editable_by?(user)
    return false unless user
    # Admin can edit them all and regular users can edit their private queries

>    return true if user.admin? || (self.user_id == user.id)
<    return true if user.admin? || (is_private? && self.user_id == user.id)

    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
app/controllers/queries_controller.rb

adminまたはPJ内クエリ以外の場合、強制的に個人単位クエリに再設定している処理を回避した。

  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
app/views/queries/_form.html.erb

カスタムクエリ編集画面の表示権限設定部分、adminのみ/クエリ作成時のみ表示している箇所を、クエリ作成者にも表示するように変更した。

< <% 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>

■ カスタムクエリ作成-PJ共用化手順

事前準備

(admin)
・カスタムクエリ表示制御に用いるロールを作成する。

(PJ-admin)
・カスタムクエリの作成者に、PJ内のクエリ作成/保存権限を割り当てる。
・カスタムクエリの利用者に、PJ内のクエリ表示用ロールを割り当てる。

PJ間共有カスタムクエリ作成

クエリ作成者:(PJのクエリ作成、クエリ保存の権限が必要)
・PJ内でカスタムクエリを作成する。
・「全プロジェクト向け」をチェックする。
・「表示」-「次のロールのみ」、クエリ利用許可するロールを選択する。
・カスタムクエリを保存する。

PJ間共有カスタムクエリ編集

カスタムクエリを編集し保存する。
表示権限変更も可能(ロール制御/作成者本人のみ/制限無)

本操作は、カスタムクエリ作成者またはadminが可能。
(PJ間共用のカスタムクエリは、PJに所属しないため、PJ内のクエリ編集/保存ロールによりアクセス制限できない。代用としてカスタムクエリ作成者のIDを利用している)

■対応状況

Redmineソース変更+運用により対処可能

■補足

運用効率化

各カスタムクエリを表示制御するロールの権限は、PJ単位に設定する必要がある。
多数のPJで共用する場合、PJ間のメンバー継承、ユーザグループ単位のロール割当の利用が必要と思われる。

多数のPJへのロール一括設定は下記参照
多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい
https://redmine.tokyo/issues/723

機能改善

クエリ編集画面にて、クエリ作成者の表示/編集機能を追加する事が望ましいと思われる。
クエリ作成者の変更は、adminまたはクエリ作成者本人
(カスタムクエリ作成者IDは、queriesテーブルのuser_id に格納されている。)

admin以外の、すべてのユーザー/全プロジェクト向けカスタムクエリ作成は、不可とした方が良いかもしれない。(意図せずに作成/公開しSEC問題を招く事も考えられる)

SEC面考察

本変更は、PJ間共用クエリ作成権限を性善説でadminのみから変更している。

adminのみ設定可能とすることで抑制している問題が、顕在化する事も考えられる。

・他PJと同一ロールで表示制御するカスタムクエリを作成すれば、他PJにも見える
・他PJと同じロールをPJ内で割り当てれば、無関係なPJで作成したカスタムクエリを利用できる。
 (PJ共用カスタムクエリの編集権限は、adminとカスタムクエリ作成者のみなので、変更はされない)

ロールはシステムレベルで設定され、それ自体を表示制御する機能が無い。
各PJ管理者は、PJメンバー追加時のRole割当画面などで、システム上に定義されたRoleを取得可能である。
この事はユーザ数が数千人になれば問題になるかもしれない。

その他

クエリ利用のロールを設定しているプロジェクトの一覧、ロール割り当てられた人の一覧、クエリ実行回数推移
この辺をモチベーションとする人もいるだろうか。
トータルの生産性向上がadminの判断基準なら、生産性向上に寄与するcontributionを推進する仕組みも必要かなと。
DB/ログから出力可能だが。ユーザからは見えないし。

制約事項:
・フィルタに、PJ指定の対象バージョン/カテゴリ欄が設定できない。
 設定していると編集時にクリアされる。
 (共有=すべてのプロジェクトを指定していれば利用可能)
 この制約は本チケットの変更によるものではない。


関連するチケット 4 (4件未完了0件完了)

関連している Unofficial Redmine Cooking - QA #250: Redmineカスタムクエリの公開範囲を指定したい(複数PJ)回答済2016/12/01

操作
関連している Unofficial Redmine Cooking - QA #723: 多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい回答済奈良 裕記2017/10/24

操作
関連している Unofficial Redmine Cooking - QA #893: カスタムクエリの定義をPJ階層間で共用したい。新規2018/11/23

操作
関連している Unofficial Redmine Cooking - QA #923: Redmineカスタムクエリの編集者を制限したい(公開クエリ)新規2019/03/05

操作

他の形式にエクスポート: Atom PDF