プロジェクト

全般

プロフィール

QA #723

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

"Redmine Advent Calendar 2017":https://qiita.com/advent-calendar/2017/redmine の13日目です! 
 #在庫展開ですが、役に立つ人もいると思うので。。 

 h3. ■現象/要望 

 多数のPJに、メンバー登録+ロール設定を一括設定したい 
 (PJは類似名称、階層構造で選択) 
 (PJのアクセス権限継承設定は利用できないものとする。) 

 例 

 h4. 1.顧客毎にPJを分割しアクセス制御している。(100PJ) 

  新規プラグイン用の管理者ロールを、指定範囲内のPJに追加登録必要になった。 
  責任者の承認権限設定、、 
  (ACL継承やロール自体の権限追加で対処できない場合の対応作業が大変) 

 h4. 2.部/課/担当者/顧客の階層構造でPJを分割しアクセス制御している。(数百PJ) 

  部長の承認権限Roleを配下のPJ全部に追加する指示が出た。 

 h3. ■解決策 

 RAILS Consoleで実行可能 

 h4. 例1.顧客毎にPJを分割しアクセス制御している。 

 下記の場合 
 <pre> 
 対象プロジェクト 識別子= redmine_tokyo_    以下全部(命名規則で指定)  
 追加対象ロール     名称=unofficial、ロールID=8 
 追加対象ユーザ     ID=cooking、ユーザID=13 
 </pre> 

 RAILS consoleで下記実行する 

 bundle exec rails console production 

 <pre><code class="ruby"> 
 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終了 
 </code></pre> 

 h4. 例2.部/課/担当者/顧客の階層構造でPJを分割しアクセス制御している。 

 下記の場合 
 <pre> 
 対象プロジェクト 識別子= redmine_tokyo のサブPJ全部(子供/孫、PJ識別子/PJ名称問わず) 
 追加対象ロール     名称=unofficial、ロールID=8 
 追加対象ユーザ     ID=cooking、ユーザID=13 
 </pre> 

 RAILS consoleで下記実行する 

 bundle exec rails console production 

 <pre><code class="ruby"> 
 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終了 

 </code></pre> 


 h3. ■対応状況 

 Rails Consoleで一応対応可能 

 未解決:ユーザIDではなく、グループを指定したい場合の対応方法 


 h3. ■補足 

 参考情報 

 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という関係が成り立つので、このルールを使ってガントチャートを階層化して表示しているわけだ。 


 h3. ■注意点 

 ロール名称に半角英数以外が含まれる場合は,非ASCIIとしてエラーになる。 
 find_by_nameではなく、find(ID)を使用することで回避できる。 

 <pre><code class="ruby"> 
   # member.roles = [Role.find_by_name('unofficial')] 
   member.roles = [Role.find(8)] 
 </code></pre> 

 !https://unofficial-redmine.org/matomo/matomo.php?idsite=1&rec=1! 

戻る