Custom user fields and csv import

Here is a class we used to import custom fields and to assign members to a group(s).

require File.expand_path( "/var/www/discourse/script/import_scripts/base.rb")

class ImportScripts::BD2L < ImportScripts::Base
  
  def initialize
    super

    @htmlentities = HTMLEntities.new    
    @import_config_file = ARGV[0]
    raise ArgumentError.new('Bringing Data to Life import script config file argument is missing. Provide the full path to the config json file.') if @import_config_file.blank?

    
  end
  
  def import_users(import_array)
  
    puts "import_users.started"
    
    if import_array == nil then
      puts "import_users: skipped."
    else
      puts "import_users.import_array: #{import_array}"
    
       
      candidate_users = Array.new
      import_array.each do |import|
      
        puts "import_users.import_array.import: #{import}"
        
        mobile = UserField.find_by_name("Mobile")
        landline = UserField.find_by_name("Landline")
        postcode = UserField.find_by_name("Postcode")
        
        groups = Array.new
        import['groups'].each do |group_name|
          group = Group.find_by(name:group_name)
          if group == nil then
            # ignore
          else
            groups.push(group)
          end
        end
        
        @members = parse_import_json_file(import['path'])
        @members.each do |member|
          # puts "import_users.import_array.import.members.member: #{member}"
          email = member['email']
          if email.length == 0 then
            email = member['name'].gsub(' ','.').downcase + '@domain.com'
            puts email
            member['email'] = email
          end
          if email.length > 0 and member['name'].length > 0 and email != '@domain.com' then
            #puts email
            user = User.find_by_email(email)
            if user == nil then
              username = member['name'].gsub(' ','.').downcase
              member['username'] = username
              #puts "create"
              candidate = {}
              candidate['id'] = member['external-id']
              candidate['username'] = member['username']
              candidate['name'] = member['name']
              candidate['email'] = member['email']
              candidate['mobile'] = member['mobile'] # user custom field
              candidate['landline'] = member['landline'] # user custom field
              candidate['postcode'] = member['postcode'] # user custom field
              candidate['groups'] = groups
              candidate['mobile-user-field'] = mobile # userField
              candidate['landline-user-field'] = landline # userField
              candidate['postcode-user-field'] = postcode # userField

              candidate_users.push(candidate)

            else
              groups.each do |group|
                if group.user_ids.include?(user.id) then
                  # already a memeber
                else
                  group.add user
                end
              end
            end
          end
        end
      end # import_array.each do |import|
     
      if candidate_users.length > 0 then
        puts "calling create_users with candidate_users.length #{candidate_users.length}"
        create_users(candidate_users) do |candidate|
          { id: candidate['id'],
            username: candidate['username'],
            email: candidate['email'],
            name: candidate['name'],
            active: true,
            approved: true,
            post_create_action: proc do |user|
              
              user.save
              
              puts "user.id: #{user.id} user.email #{user.email}"
              
              candidate['groups'].each do |group|
                if group.user_ids.include?(user.id) then
                  # already a member
                else
                  group.add user
                  if user.primary_group == nil then
                    user.primary_group = group
                    user.save
                  end
                end
              end
              
              mobile = candidate['mobile-user-field']
              landline = candidate['landline-user-field']
              postcode = candidate['postcode-user-field']
              
              if candidate['mobile'].length > 0 then
                user_field_name = sprintf("user_field_%d", mobile.id) 
                user_custom_field = UserCustomField.where(user_id:user.id,name:mobile.name).first
                if user_custom_field == nil then
                  user_custom_field = UserCustomField.create!(user_id: user.id, name: user_field_name, value: candidate['mobile'])
                else
                  if user_custom_field.value != candidate['mobile'] then
                    user_custom_field.value = candidate['mobile']
                    user_custom_field.save!
                  end
                end
              end
              
              if candidate['landline'].length > 0 then
                user_field_name = sprintf("user_field_%d", landline.id) 
                user_custom_field = UserCustomField.where(user_id:user.id,name:landline.name).first
                if user_custom_field == nil then
                  user_custom_field = UserCustomField.create!(user_id: user.id, name: user_field_name, value: candidate['landline'])
                else
                  if user_custom_field.value != candidate['landline'] then
                    user_custom_field.value = candidate['landline']
                    user_custom_field.save!
                  end
                end
              end
              
              if candidate['postcode'].length > 0 then
                user_field_name = sprintf("user_field_%d", postcode.id) 
                user_custom_field = UserCustomField.where(user_id:user.id,name:postcode.name).first
                if user_custom_field == nil then
                  user_custom_field = UserCustomField.create!(user_id: user.id, name: user_field_name, value: candidate['postcode'])
                else
                  if user_custom_field.value != candidate['postcode'] then
                    user_custom_field.value = candidate['postcode']
                    user_custom_field.save!
                  end
                end
              end 
            end
          }
        end
      else 
        puts "No processing done for candidates candidate_users.length #{candidate_users.length}"
      end # if candidate_users.length > 0
       
    end # if import_array == nil then
      
    puts "import_users.finished"
    
  end
  
  def parse_import_json_file(path)
    puts "parse_import_json_file('#{path}')"
    text = File.read(path)
    result = JSON.parse(text)
    return result
  end
    
  def execute
    
    @config = parse_import_json_file(@import_config_file)
    import_users(@config['users'])
    
  end
  
end

if ARGV[0] == nil then
  ARGV[0] = "/shared/bd2l/members-configuration.json"
end

ImportScripts::BD2L.new.perform