プロジェクト

全般

プロフィール

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

操作

奈良 裕記 さんがほぼ5年前に更新

  • 題名PJ間共用カスタムクエリをadmin以外が作成したい。 から PJ間共用カスタムクエリをadmin以外が作成/編集したい。 に変更
  • 説明 を更新 (差分)
  • ステータス新規 から 回答済 に変更

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

  • 関連している QA #250: Redmineカスタムクエリの公開範囲を指定したい(複数PJ) を追加

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

  • 関連している QA #723: 多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい を追加

奈良 裕記 さんがほぼ5年前に更新

  • 関連している QA #893: カスタムクエリの定義をPJ階層間で共用したい。 を追加

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんがほぼ5年前に更新

久しぶりにQiitaに書いてみました。
まだ限定共有ですが、コメント頂けると有難いな。
あと本家チケットの+1

プロジェクト間共用カスタムクエリをadmin以外が作成/編集可能にする
https://qiita.com/y503Unavailable/private/2721608ef372f422b5d0

実際には本チケットのリライトです。

奈良 裕記 さんがほぼ5年前に更新

奈良 裕記 さんが4年以上前に更新

  • 関連している QA #923: Redmineカスタムクエリの編集者を制限したい(公開クエリ) を追加

奈良 裕記 さんが4年以上前に更新

奈良 裕記 さんが4年以上前に更新

奈良 裕記 さんがほぼ3年前に更新

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