mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 00:11:30 +08:00
FEATURE: Allow sending invites to staged users
This commit is contained in:
@ -312,8 +312,6 @@ class UsersController < ApplicationController
|
|||||||
params[:for_user_id] ? User.find(params[:for_user_id]) : current_user
|
params[:for_user_id] ? User.find(params[:for_user_id]) : current_user
|
||||||
end
|
end
|
||||||
|
|
||||||
FROM_STAGED = "from_staged".freeze
|
|
||||||
|
|
||||||
def create
|
def create
|
||||||
params.require(:email)
|
params.require(:email)
|
||||||
params.permit(:user_fields)
|
params.permit(:user_fields)
|
||||||
@ -334,14 +332,9 @@ class UsersController < ApplicationController
|
|||||||
return fail_with("login.reserved_username")
|
return fail_with("login.reserved_username")
|
||||||
end
|
end
|
||||||
|
|
||||||
if user = User.where(staged: true).with_email(params[:email].strip.downcase).first
|
new_user_params = user_params
|
||||||
user_params.each { |k, v| user.send("#{k}=", v) }
|
user = User.unstage(new_user_params)
|
||||||
user.staged = false
|
user = User.new(new_user_params) if user.nil?
|
||||||
user.active = false
|
|
||||||
user.custom_fields[FROM_STAGED] = true
|
|
||||||
else
|
|
||||||
user = User.new(user_params)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Handle API approval
|
# Handle API approval
|
||||||
if user.approved
|
if user.approved
|
||||||
@ -602,7 +595,7 @@ class UsersController < ApplicationController
|
|||||||
if user = User.where(id: session_user_id.to_i).first
|
if user = User.where(id: session_user_id.to_i).first
|
||||||
@account_created[:username] = user.username
|
@account_created[:username] = user.username
|
||||||
@account_created[:email] = user.email
|
@account_created[:email] = user.email
|
||||||
@account_created[:show_controls] = !user.custom_fields[FROM_STAGED]
|
@account_created[:show_controls] = !user.from_staged?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -656,11 +649,7 @@ class UsersController < ApplicationController
|
|||||||
@user = User.where(id: user_key.to_i).first
|
@user = User.where(id: user_key.to_i).first
|
||||||
end
|
end
|
||||||
|
|
||||||
if @user.blank? || @user.active? || current_user.present?
|
if @user.blank? || @user.active? || current_user.present? || @user.from_staged?
|
||||||
raise Discourse::InvalidAccess.new
|
|
||||||
end
|
|
||||||
|
|
||||||
if @user.custom_fields[FROM_STAGED]
|
|
||||||
raise Discourse::InvalidAccess.new
|
raise Discourse::InvalidAccess.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class Invite < ActiveRecord::Base
|
|||||||
def user_doesnt_already_exist
|
def user_doesnt_already_exist
|
||||||
@email_already_exists = false
|
@email_already_exists = false
|
||||||
return if email.blank?
|
return if email.blank?
|
||||||
user = User.find_by_email(email)
|
user = Invite.find_user_by_email(email)
|
||||||
|
|
||||||
if user && user.id != self.user_id
|
if user && user.id != self.user_id
|
||||||
@email_already_exists = true
|
@email_already_exists = true
|
||||||
@ -102,7 +102,7 @@ class Invite < ActiveRecord::Base
|
|||||||
custom_message = opts[:custom_message]
|
custom_message = opts[:custom_message]
|
||||||
lower_email = Email.downcase(email)
|
lower_email = Email.downcase(email)
|
||||||
|
|
||||||
if user = User.find_by_email(lower_email)
|
if user = find_user_by_email(lower_email)
|
||||||
extend_permissions(topic, user, invited_by) if topic
|
extend_permissions(topic, user, invited_by) if topic
|
||||||
raise UserExists.new I18n.t("invite.user_exists", email: lower_email, username: user.username)
|
raise UserExists.new I18n.t("invite.user_exists", email: lower_email, username: user.username)
|
||||||
end
|
end
|
||||||
@ -150,6 +150,10 @@ class Invite < ActiveRecord::Base
|
|||||||
invite
|
invite
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.find_user_by_email(email)
|
||||||
|
User.with_email(email).where(staged: false).first
|
||||||
|
end
|
||||||
|
|
||||||
def self.get_group_ids(group_names)
|
def self.get_group_ids(group_names)
|
||||||
group_ids = []
|
group_ids = []
|
||||||
if group_names
|
if group_names
|
||||||
|
@ -26,7 +26,16 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
|
|||||||
end
|
end
|
||||||
available_name = name || available_username
|
available_name = name || available_username
|
||||||
|
|
||||||
user = User.new(email: invite.email, username: available_username, name: available_name, active: true, trust_level: SiteSetting.default_invitee_trust_level)
|
user_params = {
|
||||||
|
email: invite.email,
|
||||||
|
username: available_username,
|
||||||
|
name: available_name,
|
||||||
|
active: true,
|
||||||
|
trust_level: SiteSetting.default_invitee_trust_level
|
||||||
|
}
|
||||||
|
|
||||||
|
user = User.unstage(user_params)
|
||||||
|
user = User.new(user_params) if user.nil?
|
||||||
|
|
||||||
if !SiteSetting.must_approve_users? || (SiteSetting.must_approve_users? && invite.invited_by.staff?)
|
if !SiteSetting.must_approve_users? || (SiteSetting.must_approve_users? && invite.invited_by.staff?)
|
||||||
user.approved = true
|
user.approved = true
|
||||||
@ -91,7 +100,7 @@ InviteRedeemer = Struct.new(:invite, :username, :name, :password, :user_custom_f
|
|||||||
end
|
end
|
||||||
|
|
||||||
def get_existing_user
|
def get_existing_user
|
||||||
User.where(admin: false).find_by_email(invite.email)
|
User.where(admin: false, staged: false).find_by_email(invite.email)
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_to_private_topics_if_invited
|
def add_to_private_topics_if_invited
|
||||||
|
@ -218,6 +218,7 @@ class User < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
EMAIL = %r{([^@]+)@([^\.]+)}
|
EMAIL = %r{([^@]+)@([^\.]+)}
|
||||||
|
FROM_STAGED = "from_staged".freeze
|
||||||
|
|
||||||
def self.new_from_params(params)
|
def self.new_from_params(params)
|
||||||
user = User.new
|
user = User.new
|
||||||
@ -228,6 +229,16 @@ class User < ActiveRecord::Base
|
|||||||
user
|
user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.unstage(params)
|
||||||
|
if user = User.where(staged: true).with_email(params[:email].strip.downcase).first
|
||||||
|
params.each { |k, v| user.send("#{k}=", v) }
|
||||||
|
user.staged = false
|
||||||
|
user.active = false
|
||||||
|
user.custom_fields[FROM_STAGED] = true
|
||||||
|
end
|
||||||
|
user
|
||||||
|
end
|
||||||
|
|
||||||
def self.suggest_name(email)
|
def self.suggest_name(email)
|
||||||
return "" if email.blank?
|
return "" if email.blank?
|
||||||
email[/\A[^@]+/].tr(".", " ").titleize
|
email[/\A[^@]+/].tr(".", " ").titleize
|
||||||
@ -987,6 +998,10 @@ class User < ActiveRecord::Base
|
|||||||
self.user_stat&.time_read
|
self.user_stat&.time_read
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def from_staged?
|
||||||
|
custom_fields[User::FROM_STAGED]
|
||||||
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def badge_grant
|
def badge_grant
|
||||||
|
@ -30,6 +30,18 @@ describe InviteRedeemer do
|
|||||||
expect(error).to be_present
|
expect(error).to be_present
|
||||||
expect(error.record.errors[:password]).to be_present
|
expect(error.record.errors[:password]).to be_present
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should unstage user" do
|
||||||
|
staged_user = Fabricate(:staged, email: 'staged@account.com', active: true, username: 'staged1', name: 'Stage Name')
|
||||||
|
user = InviteRedeemer.create_user_from_invite(Fabricate(:invite, email: 'staged@account.com'), 'walter', 'Walter White')
|
||||||
|
|
||||||
|
expect(user.id).to eq(staged_user.id)
|
||||||
|
expect(user.username).to eq('walter')
|
||||||
|
expect(user.name).to eq('Walter White')
|
||||||
|
expect(user.active).to eq(false)
|
||||||
|
expect(user.email).to eq('staged@account.com')
|
||||||
|
expect(user.approved).to eq(true)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "#redeem" do
|
describe "#redeem" do
|
||||||
|
@ -178,6 +178,16 @@ describe Invite do
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'a staged user' do
|
||||||
|
it 'creates an invite for a staged user' do
|
||||||
|
Fabricate(:staged, email: 'staged@account.com')
|
||||||
|
invite = Invite.invite_by_email('staged@account.com', Fabricate(:coding_horror))
|
||||||
|
|
||||||
|
expect(invite).to be_valid
|
||||||
|
expect(invite.email).to eq('staged@account.com')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context '.redeem' do
|
context '.redeem' do
|
||||||
|
|
||||||
let(:invite) { Fabricate(:invite) }
|
let(:invite) { Fabricate(:invite) }
|
||||||
|
@ -1580,4 +1580,24 @@ describe User do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#unstage" do
|
||||||
|
it "correctyl unstages a user" do
|
||||||
|
staged_user = Fabricate(:staged, email: 'staged@account.com', active: true, username: 'staged1', name: 'Stage Name')
|
||||||
|
params = { email: 'staged@account.com', active: true, username: 'unstaged1', name: 'Foo Bar' }
|
||||||
|
user = User.unstage(params)
|
||||||
|
|
||||||
|
expect(user.id).to eq(staged_user.id)
|
||||||
|
expect(user.username).to eq('unstaged1')
|
||||||
|
expect(user.name).to eq('Foo Bar')
|
||||||
|
expect(user.active).to eq(false)
|
||||||
|
expect(user.email).to eq('staged@account.com')
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns nil when the user cannot be unstaged" do
|
||||||
|
Fabricate(:coding_horror)
|
||||||
|
expect(User.unstage(email: 'jeff@somewhere.com')).to be_nil
|
||||||
|
expect(User.unstage(email: 'no@account.com')).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user