discourse/app/jobs/regular/bulk_invite.rb

115 lines
3.1 KiB
Ruby
Raw Normal View History

2014-05-28 04:14:37 +08:00
require 'csv'
require_dependency 'system_message'
module Jobs
class BulkInvite < Jobs::Base
sidekiq_options retry: false
2014-06-26 04:04:26 +08:00
attr_accessor :current_user
2014-05-28 04:14:37 +08:00
def initialize
@logs = []
@sent = 0
@failed = 0
end
def execute(args)
2016-12-05 00:06:35 +08:00
filename = args[:filename]
2014-06-26 04:04:26 +08:00
@current_user = User.find_by(id: args[:current_user_id])
2016-12-05 00:06:35 +08:00
raise Discourse::InvalidParameters.new(:filename) if filename.blank?
# read csv file, and send out invitations
2016-12-05 00:06:35 +08:00
read_csv_file("#{Invite.base_directory}/#{filename}")
ensure
# send notification to user regarding progress
2014-06-26 04:04:26 +08:00
notify_user
# since emails have already been sent out, delete the uploaded csv file
FileUtils.rm_rf(csv_path) rescue nil
end
2014-06-26 04:04:26 +08:00
def read_csv_file(csv_path)
CSV.foreach(csv_path, encoding: "bom|utf-8") do |csv_info|
2014-06-27 01:19:34 +08:00
if csv_info[0]
if (EmailValidator.email_regex =~ csv_info[0])
# email is valid
send_invite(csv_info, $INPUT_LINE_NUMBER)
2014-05-28 04:14:37 +08:00
@sent += 1
else
# invalid email
log "Invalid Email '#{csv_info[0]}' at line number '#{$INPUT_LINE_NUMBER}'"
2014-05-28 04:14:37 +08:00
@failed += 1
end
end
end
rescue Exception => e
log "Bulk Invite Process Failed -- '#{e.message}'"
@failed += 1
2014-05-28 04:14:37 +08:00
end
def get_group_ids(group_names, csv_line_number)
group_ids = []
2014-06-27 01:19:34 +08:00
if group_names
group_names = group_names.split(';')
group_names.each { |group_name|
group_detail = Group.find_by_name(group_name)
2014-06-27 01:19:34 +08:00
if group_detail
# valid group
group_ids.push(group_detail.id)
else
# invalid group
log "Invalid Group '#{group_name}' at line number '#{csv_line_number}'"
2014-06-27 01:19:34 +08:00
@failed += 1
end
}
end
return group_ids
2014-05-28 04:14:37 +08:00
end
def get_topic(topic_id, csv_line_number)
topic = nil
2014-06-27 01:19:34 +08:00
if topic_id
topic = Topic.find_by_id(topic_id)
if topic.nil?
log "Invalid Topic ID '#{topic_id}' at line number '#{csv_line_number}'"
2014-06-27 01:19:34 +08:00
@failed += 1
end
end
return topic
end
def send_invite(csv_info, csv_line_number)
email = csv_info[0]
group_ids = get_group_ids(csv_info[1], csv_line_number)
topic = get_topic(csv_info[2], csv_line_number)
begin
Invite.invite_by_email(email, @current_user, topic, group_ids)
rescue => e
2017-05-09 19:41:40 +08:00
log "Error inviting '#{email}' -- #{Rails::Html::FullSanitizer.new.sanitize(e.message)}"
@sent -= 1
@failed += 1
end
end
2014-05-28 04:14:37 +08:00
def log(message)
save_log(message)
end
def save_log(message)
@logs << "[#{Time.now}] #{message}"
end
2014-06-26 04:04:26 +08:00
def notify_user
if @current_user
2014-05-28 04:14:37 +08:00
if (@sent > 0 && @failed == 0)
SystemMessage.create_from_system_user(@current_user, :bulk_invite_succeeded, sent: @sent)
2014-05-28 04:14:37 +08:00
else
SystemMessage.create_from_system_user(@current_user, :bulk_invite_failed, sent: @sent, failed: @failed, logs: @logs.join("\n"))
2014-05-28 04:14:37 +08:00
end
end
end
end
end