discourse/app/jobs/regular/bulk_invite.rb

176 lines
4.2 KiB
Ruby
Raw Normal View History

2014-05-27 16:14:37 -04:00
require 'csv'
require_dependency 'system_message'
module Jobs
class BulkInvite < Jobs::Base
sidekiq_options retry: false
def initialize
2018-08-30 03:34:58 -04:00
super
2014-05-27 16:14:37 -04:00
@logs = []
@sent = 0
@failed = 0
@groups = {}
@valid_groups = {}
2014-05-27 16:14:37 -04:00
end
def execute(args)
2016-12-04 11:06:35 -05:00
filename = args[:filename]
raise Discourse::InvalidParameters.new(:filename) if filename.blank?
@current_user = User.find_by(id: args[:current_user_id])
raise Discourse::InvalidParameters.new(:current_user_id) unless @current_user
@guardian = Guardian.new(@current_user)
csv_path = "#{Invite.base_directory}/#{filename}"
# read csv file, and send out invitations
read_csv_file(csv_path)
ensure
# send notification to user regarding progress
2014-06-25 16:04:26 -04:00
notify_user
2019-04-15 21:59:35 -04:00
File.delete(csv_path) if csv_path
end
private
2014-06-25 16:04:26 -04:00
def read_csv_file(csv_path)
2018-01-09 10:03:17 -05:00
file = File.open(csv_path, encoding: 'bom|utf-8')
CSV.new(file).each do |csv_info|
2014-06-26 13:19:34 -04:00
if csv_info[0]
if (EmailValidator.email_regex =~ csv_info[0])
# email is valid
send_invite(csv_info, $INPUT_LINE_NUMBER)
2014-05-27 16:14:37 -04:00
@sent += 1
else
# invalid email
2018-08-30 03:34:58 -04:00
save_log "Invalid Email '#{csv_info[0]}' at line number '#{$INPUT_LINE_NUMBER}'"
2014-05-27 16:14:37 -04:00
@failed += 1
end
end
end
rescue Exception => e
2018-08-30 03:34:58 -04:00
save_log "Bulk Invite Process Failed -- '#{e.message}'"
@failed += 1
2018-01-09 10:03:17 -05:00
ensure
file&.close
2014-05-27 16:14:37 -04:00
end
def get_groups(group_names, csv_line_number)
groups = []
2014-06-26 13:19:34 -04:00
if group_names
group_names = group_names.split(';')
group_names.each { |group_name|
group = fetch_group(group_name)
if group && can_edit_group?(group)
# valid group
groups.push(group)
else
# invalid group
2018-08-30 03:34:58 -04:00
save_log "Invalid Group '#{group_name}' at line number '#{csv_line_number}'"
2014-06-26 13:19:34 -04:00
@failed += 1
end
}
end
groups
2014-05-27 16:14:37 -04:00
end
def get_topic(topic_id, csv_line_number)
topic = nil
2014-06-26 13:19:34 -04:00
if topic_id
topic = Topic.find_by_id(topic_id)
if topic.nil?
2018-08-30 03:34:58 -04:00
save_log "Invalid Topic ID '#{topic_id}' at line number '#{csv_line_number}'"
2014-06-26 13:19:34 -04:00
@failed += 1
end
end
return topic
end
def send_invite(csv_info, csv_line_number)
email = csv_info[0]
groups = get_groups(csv_info[1], csv_line_number)
topic = get_topic(csv_info[2], csv_line_number)
begin
if user = User.find_by_email(email)
if groups.present?
Group.transaction do
groups.each do |group|
group.add(user)
GroupActionLogger
.new(@current_user, group)
.log_add_user_to_group(user)
end
end
end
else
Invite.invite_by_email(email, @current_user, topic, groups.map(&:id))
end
rescue => e
2018-08-30 03:34:58 -04:00
save_log "Error inviting '#{email}' -- #{Rails::Html::FullSanitizer.new.sanitize(e.message)}"
@sent -= 1
@failed += 1
end
end
2014-05-27 16:14:37 -04:00
def save_log(message)
@logs << "[#{Time.now}] #{message}"
end
2014-06-25 16:04:26 -04:00
def notify_user
if @current_user
2014-05-27 16:14:37 -04:00
if (@sent > 0 && @failed == 0)
2018-08-30 03:34:58 -04:00
SystemMessage.create_from_system_user(
@current_user,
:bulk_invite_succeeded,
sent: @sent
)
2014-05-27 16:14:37 -04:00
else
2018-08-30 03:34:58 -04:00
SystemMessage.create_from_system_user(
@current_user,
:bulk_invite_failed,
sent: @sent,
failed: @failed,
logs: @logs.join("\n")
)
2014-05-27 16:14:37 -04:00
end
end
end
def fetch_group(group_name)
group_name = group_name.downcase
group = @groups[group_name]
unless group
group = Group.find_by("lower(name) = ?", group_name)
@groups[group_name] = group
end
group
end
def can_edit_group?(group)
group_name = group.name.downcase
result = @valid_groups[group_name]
unless result
result = @guardian.can_edit_group?(group)
@valid_groups[group_name] = result
end
result
end
2014-05-27 16:14:37 -04:00
end
end