Changeset 730

Show
Ignore:
Timestamp:
11/19/07 15:53:16 (1 year ago)
Author:
markku
Message:

Closes #506. Added a "helper method" TempKeyring?.find_all_with_keys for easing keyring/action_key resolving in migrations

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/db/migrate/009_create_customers.rb

    r710 r730  
    4242    } 
    4343    # Add action keys to keyring 
    44     keyring = get_admin_keyring 
    45     if keyring 
    46       puts "Adding action keys for '%s'" % keyring.name 
    47       new_keys.each { |key| keyring.grant(key) } 
     44    keyrings = get_admin_keyrings 
     45    unless keyrings.empty? 
     46      keyrings.each { |keyring| 
     47        puts "Adding action keys for '%s'" % keyring.name 
     48        new_keys.each { |key| keyring.grant(key) } 
     49      } 
    4850    else 
    49  
     51      puts 'No administrative keyrings found for customer control actions!' 
    5052    end 
    5153  end 
     
    5860  protected 
    5961 
    60   def self.get_admin_keyring 
    61     keyrings = TempKeyring.find(:all, :order => 'id', :readonly => true) 
    62     puts '' 
    63     puts 'Choose a keyring where you want to add the new keys for the customer' 
    64     puts 'administering functions. You should choose your administrative keyring.' 
    65  
    66     if keyrings.empty? 
    67       puts 'No keyrings found!' 
    68       return nil 
    69     end 
    70  
    71     # Only one keyring -> return it 
    72     return keyrings.first if keyrings.length == 1 
    73  
    74     # More than one keyring: 
    75     puts 'Keyrings:' 
    76     keyrings.each do |k| 
    77       printf("%d %s\n", k.id, k.name) 
    78     end 
    79     keyring = nil 
    80     while !keyring 
    81       print 'Give ID: ' 
    82       keyring_id = $stdin.gets.to_i 
    83       keyring = keyrings.select { |k| k.id == keyring_id }.first 
    84       puts 'Invalid ID. Try again.' unless keyring 
    85     end 
    86     return keyring 
     62  def self.get_admin_keyrings 
     63    # Administrative 'user/*' action keys are required to configure customers. 
     64    required_keys = [ 
     65                     'user/list', 
     66                     'user/create', 
     67                     'user/edit', 
     68                     'user/remove', 
     69                     'user/reset_password' 
     70                    ] 
     71    return TempKeyring.find_all_with_keys(required_keys) 
    8772  end 
    8873 
  • trunk/db/migrate/011_create_settings.rb

    r721 r730  
    2525    new_key = TempActionKey.create!(:name => 'setting/access_control') 
    2626 
    27     get_admin_keyrings.each { |keyring| 
    28       puts "Adding the asset user rights system setting key for '%s'" % keyring.name 
    29       keyring.grant(new_key) 
    30     } 
     27    keyrings = get_admin_keyrings 
     28    unless keyrings.empty? 
     29      keyrings.each { |keyring| 
     30        puts "Adding the user rights system setting key for '%s'" % keyring.name 
     31        keyring.grant(new_key) 
     32      } 
     33    else 
     34      puts 'No administrative keyrings found for the user rights system settings!' 
     35    end 
    3136  end 
    3237 
     
    4954                     'asset_permission/edit' 
    5055                    ] 
    51     required_keys = TempActionKey.find(:all, :conditions => ['name IN (?)', required_keys]) 
    52     unless required_keys.empty? 
    53       keyring_id_lists = required_keys.map { |key| 
    54         TempKeyring.connection.select_values('select keyring_id from action_keys_keyrings where action_key_id = %d' % key.id) 
    55       } 
    56       keyring_ids = keyring_id_lists.inject { |common_id_list, id_list| 
    57         common_id_list & id_list 
    58       } 
    59     else 
    60       return [] 
    61     end 
    62  
    63     return TempKeyring.find(keyring_ids) 
     56    return TempKeyring.find_all_with_keys(required_keys) 
    6457  end 
    6558 
  • trunk/db/temp_models.rb

    r645 r730  
    8686  set_table_name 'keyrings' 
    8787 
     88  # Finds all keyrings which have the given keys 
     89  def TempKeyring.find_all_with_keys(required_keys) 
     90    return [] if required_keys.empty? 
     91 
     92    # Find keyrings which have the required keys: 
     93 
     94    # First find the required keys. 
     95    required_keys = TempActionKey.find(:all, :conditions => ['name IN (?)', required_keys]) if required_keys.first.instance_of?(String) 
     96 
     97    # For each required key find ids of keyrings which have the key. 
     98    keyring_id_lists = required_keys.map { |key| 
     99      TempKeyring.connection.select_values('select keyring_id from action_keys_keyrings where action_key_id = %d' % key.id) 
     100    } 
     101 
     102    # Calculate the ids of keyrings which have all the required keys 
     103    # by taking an intersection of the id lists in keyring_id_lists. 
     104    keyring_ids = keyring_id_lists.inject { |common_id_list, id_list| 
     105      common_id_list & id_list 
     106    } 
     107 
     108    # Find the keyrings 
     109    return TempKeyring.find(keyring_ids) 
     110  end 
     111 
    88112  def add_user(user) 
    89113    self.class.connection.execute("INSERT INTO keyrings_users (keyring_id, user_id) VALUES (#{self.id}, #{user.id});") 

© 2004-2007 Norfello Oy All Rights Reserved