mirror of
https://github.com/discourse/discourse.git
synced 2025-01-30 04:56:06 +08:00
FIX: Count resulting bulk invites correctly (#18461)
Skipped invites were not counted at all and some invites could generate more than one error and resulted in a grand total that was not equal to the count of bulk invites.
This commit is contained in:
parent
585c584fdb
commit
cf646b2061
|
@ -9,6 +9,8 @@ module Jobs
|
|||
|
||||
@logs = []
|
||||
@sent = 0
|
||||
@skipped = 0
|
||||
@warnings = 0
|
||||
@failed = 0
|
||||
@groups = {}
|
||||
@user_fields = {}
|
||||
|
@ -39,8 +41,14 @@ module Jobs
|
|||
invites.each do |invite|
|
||||
if EmailAddressValidator.valid_value?(invite[:email])
|
||||
# email is valid
|
||||
send_invite(invite)
|
||||
@sent += 1
|
||||
result = send_invite(invite)
|
||||
if Invite === result
|
||||
@sent += 1
|
||||
elsif User === result
|
||||
@skipped += 1
|
||||
else
|
||||
@failed += 1
|
||||
end
|
||||
else
|
||||
# invalid email
|
||||
save_log "Invalid Email '#{invite[:email]}"
|
||||
|
@ -58,7 +66,7 @@ module Jobs
|
|||
if group_names
|
||||
group_names = group_names.split(';')
|
||||
|
||||
group_names.each { |group_name|
|
||||
group_names.each do |group_name|
|
||||
group = fetch_group(group_name)
|
||||
|
||||
if group && can_edit_group?(group)
|
||||
|
@ -67,9 +75,9 @@ module Jobs
|
|||
else
|
||||
# invalid group
|
||||
save_log "Invalid Group '#{group_name}'"
|
||||
@failed += 1
|
||||
@warnings += 1
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
groups
|
||||
|
@ -82,7 +90,7 @@ module Jobs
|
|||
topic = Topic.find_by_id(topic_id)
|
||||
if topic.nil?
|
||||
save_log "Invalid Topic ID '#{topic_id}'"
|
||||
@failed += 1
|
||||
@warnings += 1
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -94,7 +102,11 @@ module Jobs
|
|||
|
||||
fields.each do |key, value|
|
||||
@user_fields[key] ||= UserField.includes(:user_field_options).where('name ILIKE ?', key).first || :nil
|
||||
next if @user_fields[key] == :nil
|
||||
if @user_fields[key] == :nil
|
||||
save_log "Invalid User Field '#{key}'"
|
||||
@warnings += 1
|
||||
next
|
||||
end
|
||||
|
||||
# Automatically correct user field value
|
||||
if @user_fields[key].field_type == "dropdown"
|
||||
|
@ -139,6 +151,8 @@ module Jobs
|
|||
user.locale = locale
|
||||
user.save!
|
||||
end
|
||||
|
||||
user
|
||||
else
|
||||
if user_fields.present? || locale.present?
|
||||
user = User.where(staged: true).find_by_email(email)
|
||||
|
@ -171,8 +185,8 @@ module Jobs
|
|||
end
|
||||
rescue => e
|
||||
save_log "Error inviting '#{email}' -- #{Rails::Html::FullSanitizer.new.sanitize(e.message)}"
|
||||
@sent -= 1
|
||||
@failed += 1
|
||||
|
||||
nil
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -182,17 +196,22 @@ module Jobs
|
|||
|
||||
def notify_user
|
||||
if @current_user
|
||||
if (@sent > 0 && @failed == 0)
|
||||
if @sent > 0 && @failed == 0
|
||||
SystemMessage.create_from_system_user(
|
||||
@current_user,
|
||||
:bulk_invite_succeeded,
|
||||
sent: @sent
|
||||
sent: @sent,
|
||||
skipped: @skipped,
|
||||
warnings: @warnings,
|
||||
logs: @logs.join("\n")
|
||||
)
|
||||
else
|
||||
SystemMessage.create_from_system_user(
|
||||
@current_user,
|
||||
:bulk_invite_failed,
|
||||
sent: @sent,
|
||||
skipped: @skipped,
|
||||
warnings: @warnings,
|
||||
failed: @failed,
|
||||
logs: @logs.join("\n")
|
||||
)
|
||||
|
|
|
@ -3091,13 +3091,18 @@ en:
|
|||
bulk_invite_succeeded:
|
||||
title: "Bulk Invite Succeeded"
|
||||
subject_template: "Bulk user invite processed successfully"
|
||||
text_body_template: "Your bulk user invite file was processed, %{sent} invites mailed."
|
||||
text_body_template: |
|
||||
Your bulk user invite file was processed, %{sent} invites mailed, %{skipped} skipped and %{warnings} warning(s).
|
||||
|
||||
``` text
|
||||
%{logs}
|
||||
```
|
||||
|
||||
bulk_invite_failed:
|
||||
title: "Bulk Invite Failed"
|
||||
subject_template: "Bulk user invite processed with errors"
|
||||
text_body_template: |
|
||||
Your bulk user invite file was processed, %{sent} invites mailed with %{failed} error(s).
|
||||
Your bulk user invite file was processed, %{sent} invites mailed, %{skipped} skipped, %{warnings} warning(s) and %{failed} error(s).
|
||||
|
||||
Here's the log:
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ RSpec.describe Jobs::BulkInvite do
|
|||
fab!(:topic) { Fabricate(:topic) }
|
||||
let(:staged_user) { Fabricate(:user, staged: true, active: false) }
|
||||
let(:email) { 'test@discourse.org' }
|
||||
let(:invites) { [{ email: staged_user.email }, { email: 'test2@discourse.org' }, { email: 'test@discourse.org', groups: 'GROUP1;group2', topic_id: topic.id }] }
|
||||
let(:invites) { [{ email: user.email }, { email: staged_user.email }, { email: 'test2@discourse.org' }, { email: 'test@discourse.org', groups: 'GROUP1;group2', topic_id: topic.id }, { email: 'invalid' }] }
|
||||
|
||||
it 'raises an error when the invites array is missing' do
|
||||
expect { Jobs::BulkInvite.new.execute(current_user_id: user.id) }
|
||||
|
@ -34,6 +34,12 @@ RSpec.describe Jobs::BulkInvite do
|
|||
expect(invite.email).to eq(email)
|
||||
expect(invite.invited_groups.pluck(:group_id)).to contain_exactly(group1.id, group2.id)
|
||||
expect(invite.topic_invites.pluck(:topic_id)).to contain_exactly(topic.id)
|
||||
|
||||
post = Post.last
|
||||
expect(post.raw).to include("3 invites")
|
||||
expect(post.raw).to include("1 skipped")
|
||||
expect(post.raw).to include("0 warning")
|
||||
expect(post.raw).to include("1 error")
|
||||
end
|
||||
|
||||
it 'does not create invited groups for automatic groups' do
|
||||
|
@ -47,6 +53,9 @@ RSpec.describe Jobs::BulkInvite do
|
|||
invite = Invite.last
|
||||
expect(invite.email).to eq(email)
|
||||
expect(invite.invited_groups.pluck(:group_id)).to contain_exactly(group1.id)
|
||||
|
||||
post = Post.last
|
||||
expect(post.raw).to include("1 warning")
|
||||
end
|
||||
|
||||
it 'does not create invited groups record if the user can not manage the group' do
|
||||
|
|
Loading…
Reference in New Issue
Block a user