72 lines
2.5 KiB
Ruby
72 lines
2.5 KiB
Ruby
|
|
#frozen_string_literal: true
|
|
|
|
require 'csv'
|
|
|
|
namespace :import do
|
|
# Detailed instruction https://github.com/rubykube/barong/blob/master/docs/tasks/import.md
|
|
# Required fields for import users:
|
|
# - uid
|
|
# - email
|
|
#
|
|
# Usage:
|
|
# For import users: -> bundle exec rake import:users['file_name.csv']
|
|
|
|
desc 'Load users from csv file.'
|
|
task :users, [:config_load_path] => [:environment] do |_, args|
|
|
csv_table = File.read(Rails.root.join(args[:config_load_path]))
|
|
import_user_log = File.open('./log/import_users.log', 'w')
|
|
count = 0
|
|
CSV.parse(csv_table, :headers => true).map do |row|
|
|
row = row.to_h.compact.symbolize_keys!
|
|
defaults = { level: 0, role: 'member', state: 'pending', password: generate_password }
|
|
permitted_attr = %i[uid email role state]
|
|
User.new(row.slice(*permitted_attr)
|
|
.reverse_merge(defaults))
|
|
.save!
|
|
count += 1
|
|
rescue StandardError => e
|
|
message = { error: e.message, email: row[:email], uid: row[:uid] }
|
|
import_user_log.write(message.to_yaml + "\n")
|
|
end
|
|
import_user_log.close
|
|
Kernel.puts "Created #{count} members"
|
|
Kernel.puts "Errored #{CSV.parse(csv_table, headers: true).count - count}"
|
|
end
|
|
|
|
# Required fields for import referrals:
|
|
# - uid
|
|
# - referral_uid
|
|
#
|
|
# Usage:
|
|
# For import users: -> bundle exec rake import:fill_referals['file_name.csv']
|
|
|
|
desc 'users referral relation from csv file'
|
|
task :fill_referrals, [:config_load_path] => [:environment] do |_, args|
|
|
csv_table = File.read(Rails.root.join(args[:config_load_path]))
|
|
import_affiliates_log = File.open('./log/import_referrals.log', 'w')
|
|
count = 0
|
|
CSV.parse(csv_table, :headers => true).map do |row|
|
|
row = row.to_h.compact.symbolize_keys!
|
|
user = User.find_by_uid!(row[:uid])
|
|
target_user = User.find_by_uid(row[:referral_uid])
|
|
next unless target_user
|
|
|
|
user.update!(referral_id: target_user.id)
|
|
count += 1
|
|
rescue StandardError => e
|
|
message = { error: e.message, email: row[:email], uid: row[:uid], referral_uid: row[:referral_uid] }
|
|
import_affiliates_log.write(message.to_yaml + "\n")
|
|
end
|
|
import_affiliates_log.close
|
|
Kernel.puts "Created #{count} referrals"
|
|
end
|
|
|
|
def generate_password
|
|
chars = ('a'..'z').to_a
|
|
numbers = ('0'..'9').to_a
|
|
special = %w[! @ # $ % & / ( ) + ? *]
|
|
chars.sort_by { rand }.join[0..3] + chars.sort_by { rand }.join[0..3].upcase + numbers.sort_by { rand }.join[0..3] + special.sort_by { rand }.join[0..3]
|
|
end
|
|
end
|