Project

General

Profile

QA #723

多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい

Added by 奈良 裕記 over 1 year ago. Updated over 1 year ago.

Status:
回答済
Priority:
通常
Assignee:
Category:
-
Target version:
Start date:
10/24/2017
Due date:
% Done:

0%

Estimated time:

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)]

Related issues

Related to Unofficial Redmine Cooking - QA #702: redmineインストール直後のadminパスワードを初期値から変更したい回答済08/20/2017

Actions

History

#1

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)
#2

Updated by 奈良 裕記 over 1 year ago

  • Related to QA #702: redmineインストール直後のadminパスワードを初期値から変更したい added
#3

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)
#4

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)
#5

Updated by 奈良 裕記 over 1 year ago

  • Subject changed from 多数のPJに、メンバー登録+ロール設定を一括設定したい to 多数のPJ(階層/名称)に、メンバー登録+ロール設定を一括設定したい
#6

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)
  • Status changed from 新規 to 回答済

PJ階層構造の対応を追記

Thanks to https://toot.redmine.jp/@maeda/98944135133111085

#7

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)
#8

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)

PJにユーザIDが既に定義されていた場合の処理を修正した。

#9

Updated by 奈良 裕記 over 1 year ago

  • Description updated (diff)

Also available in: Atom PDF