QA #723
open多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい
Description
Redmine Advent Calendar 2017 の13日目です!
#在庫展開ですが、役に立つ人もいると思うので。。
■現象/要望¶
多数のPJに、メンバー登録+ロール設定を一括設定したい
(PJは類似名称、階層構造で選択)
(PJのアクセス権限継承設定は利用できないものとする。)
例
1.顧客毎にPJを分割しアクセス制御している。(100PJ)¶
新規プラグイン用の管理者ロールを、指定範囲内のPJに追加登録必要になった。
責任者の承認権限設定、、
(ACL継承やロール自体の権限追加で対処できない場合の対応作業が大変)
2.部/課/担当者/顧客の階層構造でPJを分割しアクセス制御している。(数百PJ)¶
部長の承認権限Roleを配下のPJ全部に追加する指示が出た。
■解決策¶
RAILS Consoleで実行可能
例1.顧客毎にPJを分割しアクセス制御している。¶
下記の場合
対象プロジェクト 識別子= redmine_tokyo_ 以下全部(命名規則で指定) 追加対象ロール 名称=unofficial、ロールID=8 追加対象ユーザ ID=cooking、ユーザID=13
RAILS consoleで下記実行する
bundle exec rails console production
Project.where('identifier like ?', "redmine_tokyo_%").each do |project|
member = Member.new
member.project = project
member.user = User.find_by_login('cooking')
member.roles = [Role.find_by_name('unofficial')]
member.save
end # ループ処理の最後
quit # RAILS console終了
例2.部/課/担当者/顧客の階層構造でPJを分割しアクセス制御している。¶
下記の場合
対象プロジェクト 識別子= redmine_tokyo のサブPJ全部(子供/孫、PJ識別子/PJ名称問わず) 追加対象ロール 名称=unofficial、ロールID=8 追加対象ユーザ ID=cooking、ユーザID=13
RAILS consoleで下記実行する
bundle exec rails console production
target_user=User.find_by_login('cooking')
target_role=Role.find_by_name('unofficial')
# target_role=Role.find(8) ロール名称が半角英数以外の場合、非ASCIIとしてエラーになるため回避策
parent = Project.find_by_identifier('redmine_tokyo')
projects = Project.where(['? <= lft and rgt <= ?', parent.lft, parent.rgt])
projects.each do |project|
member = Member.find_or_new(project,target_user)
if member.id then
# PJにメンバID定義済→member_roleを追加する。
# 追加でないと、既存ロールを上書きしてしまう。
member.member_roles << MemberRole.new(:role => target_role, :inherited_from =>NIL)
else
# PJにメンバID定義無→新規メンバID/ロールのエントリを作成したため、PJ/ロールIDの設定のみ行えば良い。
member.project_id = project.id
member.roles =[target_role]
end
member.save!
end # ループ処理の最後
quit # RAILS console終了
■対応状況¶
Rails Consoleで一応対応可能
未解決:ユーザIDではなく、グループを指定したい場合の対応方法
■補足¶
参考情報
Create users from script/console
http://www.redmine.org/boards/2/topics/8550
PJ階層構造の入れ子集合利用については、下記とリンク先を参照ください。
https://toot.redmine.jp/@maeda/98944135133111085
Redmineチケットの階層化の実装方法
http://forza.cocolog-nifty.com/blog/2012/05/redmine-0a1e.html
上記の記事を読むと、階層構造は入れ子集合を使うと、ツリー構造をRDBに綺麗にマッピングできるらしい。
issues.lft, rgtは入れ子集合でツリー構造を表現した時、2次元の円の両端の座標を表している。
すると、チケットBの親がチケットAである場合、チケットA.lft<チケットB.lft<チケットB.rgt<チケットA.rgtという関係が成り立つので、このルールを使ってガントチャートを階層化して表示しているわけだ。
■注意点¶
ロール名称に半角英数以外が含まれる場合は,非ASCIIとしてエラーになる。
find_by_nameではなく、find(ID)を使用することで回避できる。
# member.roles = [Role.find_by_name('unofficial')]
member.roles = [Role.find(8)]
Updated by 奈良 裕記 over 7 years ago
- Related to QA #702: redmineインストール直後のadminパスワードを初期値から変更したい added
Updated by 奈良 裕記 over 7 years ago
- Subject changed from 多数のPJに、メンバー登録+ロール設定を一括設定したい to 多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい
Updated by 奈良 裕記 over 7 years ago
- Description updated (diff)
- Status changed from 新規 to 回答済
PJ階層構造の対応を追記
Updated by 奈良 裕記 almost 6 years ago
- Related to QA #946: PJ間共用カスタムクエリをadmin以外が作成/編集したい。 added