QA #893
未完了カスタムクエリの定義をPJ階層間で共用したい。
0%
説明
■現象/要望¶
現在のRedmineでは、カスタムクエリのスコープが、全プロジェクト向け or 自プロジェクトのみの、2階層しかない。
Versionと同様に、プロジェクト階層間で共用可能としたい。
(カスタムクエリを定義したプロジェクトのサブプロジェクトで利用可能、他プロジェクトには見えない)
スコープとして、現行の全プロジェクト向けと自プロジェクトのみに加え、
自プロジェクトとサブプロジェクトを追加できれば良いと考える。
(現在のVersionの共有設定全部は不要)
■理由¶
大規模Redmine運用環境にて、PJ階層間で共用するカスタムクエリを作成する場合、下記問題点がある
現状
下記作業が必要なため、作業効率が悪く、作業ミスの元となっている。
・プロジェクト毎に同じカスタムクエリを作成。
・カスタムクエリ内容の変更時、各プロジェクトで別々に変更。
機能追加後の作業
親プロジェクトの一か所のカスタムクエリ作成/編集だけで、子プロジェクト側にも自動反映される。(同じカスタムクエリ定義を利用できる)
・親プロジェクトでカスタムクエリを定義する。
・作成したカスタムクエリを、PJ階層間で共用可能の設定にする。
■背景¶
Redmineのユーザが数百人に上る場合、実質的にはマルチテナントで共用利用するRedmineとなる。(各プロジェクト間、利用者間の関係は希薄になる)
安易にカスタムクエリを全プロジェクトで共有とするわけにはいかない。
・多数のプロジェクトを作成し、プロジェクト内階層構造を作成している場合
(例:派生製品、地域別管理など)
・組織階層単位・組織内でもプロジェクトを更に分割している場合
■解決策¶
本家チケット有(チケットのみで未解決)
Allow "Custom queries" to be shared across projects
http://www.redmine.org/issues/23301
PJ単位の設定となるが、Redmine2.4.0で導入された、ロールベースでのカスタムクエリアクセス制御でも対応可能。
ユーザ単位に権限を追加したい場合は、redmine_query_shareプラグインを併用すれば可能。
https://github.com/teajay-fr/redmine_query_share
■対応状況¶
■補足¶
奈良 裕記 さんが約5年前に更新
コード追っかけてみた。
カスタムクエリのサイドバー表示については、下記変更すれば対応できるんじゃないかな。
・self.visible(*args)
・global_or_on_project呼び出し部分
カスタムクエリのサイドバー表示部分¶
helpers/queries_helper.rb
# Returns the queries that are rendered in the sidebar
def sidebar_queries(klass, project)
klass.visible.global_or_on_project(@project).sorted.to_a
end
# Renders a group of queries
def query_links(title, queries)
return '' if queries.empty?
# links to #index on issues/show
content_tag('h3', title) + "\n" +
content_tag('ul',
queries.collect {|query|
css = 'query'
css << ' selected' if query == @query
content_tag('li', link_to(query.name, url_params.merge(:query_id => query), :class => css))
}.join("\n").html_safe,
:class => 'queries'
) + "\n"
end
# Renders the list of queries for the sidebar
def render_sidebar_queries(klass, project)
queries = sidebar_queries(klass, project)
out = ''.html_safe
out << query_links(l(:label_my_queries), queries.select(&:is_private?))
out << query_links(l(:label_query_plural), queries.reject(&:is_private?))
out
end
end
models/query.rb
class Query < ActiveRecord::Base
....
# Scope of queries that are global or on the given project
scope :global_or_on_project, lambda {|project|
where(:project_id => (project.nil? ? nil : [nil, project.id]))
}
def self.visible(*args)
..
scope = joins("LEFT OUTER JOIN #{Project.table_name} ON #{table_name}.project_id = #{Project.table_name}.id").
where("#{table_name}.project_id IS NULL OR (#{base})")
..
# Returns true if the query is visible to +user+ or the current user.
def visible?(user=User.current)
..
奈良 裕記 さんが約5年前に更新
プロジェクトの指定したメンバー/ロール割当ユーザ間でカスタムクエリを共用するプラグイン
all projectsでロールによるアクセス制御を行えば、admin作業無しで運用対処もできそう。
Redmine "Custom Query Share" Plugin
https://github.com/jrupesh/redmine_query_share
The Plugins aims at providing some user specific customization in redmine.
Custom Query can be Private, Shared with users with specific Roles or Public,
The plugin provide another option "to selected users",
This allows selections of Project member users and groups and the query will be accessible only for these members.