プロジェクト

全般

プロフィール

QA #723

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

h3. ■現象/要望 

 多数のPJに、メンバー登録+ロール設定を一括設定したい 
 (PJは類似名称、階層構造で選択)1.顧客毎にPJを分割しアクセス制御している。(100PJ) ・顧客毎にPJを分割しアクセス制御している。(100PJ) 
  新規プラグイン用の管理者ロールを、指定範囲内のPJに追加登録必要になった。 
  責任者の承認権限設定、、 
  (ACL継承やロール自体の権限追加で対処できない場合の対応作業が大変) 

 2.部/課/担当者/顧客の階層構造でPJを分割しアクセス制御している。(数百PJ) 
  部長の承認権限Roleを配下のPJ全部に追加する指示が出た。 


 h3. ■解決策 

 (まだ十分な動作確認が行えていませんので、事前にデータバックアップの保険を掛けた上で実施ください) 

 RAILS Consoleで実行可能 


 例1.下記条件の場合 

 下記条件の場合 

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

 RAILS consoleで下記実行する 

 bundle exec rails console production 

 <pre><code class="ruby"> 

 Project.where('identifier like ?', "redmine_tokyo_%").each "tokyo_13_%").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> 


 例2.下記条件の場合 

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

 RAILS consoleで下記実行する 

 bundle exec rails console production 

 <pre><code class="ruby"> 

 parent = Project.find_by_identifier('redmine_tokyo') 

 projects = Project.where(['? <= lft and rgt <= ?', parent.lft, parent.rgt]) 

 projects.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> 


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

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

戻る