mirror of
https://github.com/discourse/discourse.git
synced 2024-11-29 05:33:44 +08:00
FIX: title selector needs to flag whether title comes from badge or not
This commit is contained in:
parent
1e5e5acd4d
commit
f7c4c71409
|
@ -62,8 +62,13 @@ class UserUpdater
|
||||||
user.locale = attributes.fetch(:locale) { user.locale }
|
user.locale = attributes.fetch(:locale) { user.locale }
|
||||||
user.date_of_birth = attributes.fetch(:date_of_birth) { user.date_of_birth }
|
user.date_of_birth = attributes.fetch(:date_of_birth) { user.date_of_birth }
|
||||||
|
|
||||||
if guardian.can_grant_title?(user)
|
if attributes[:title] &&
|
||||||
user.title = attributes.fetch(:title) { user.title }
|
attributes[:title] != user.title &&
|
||||||
|
guardian.can_grant_title?(user, attributes[:title])
|
||||||
|
user.title = attributes[:title]
|
||||||
|
if user.badges.where(name: user.title).exists?
|
||||||
|
user_profile.badge_granted_title = true
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
CATEGORY_IDS.each do |attribute, level|
|
CATEGORY_IDS.each do |attribute, level|
|
||||||
|
|
|
@ -221,6 +221,7 @@ class Guardian
|
||||||
|
|
||||||
def can_grant_title?(user, title = nil)
|
def can_grant_title?(user, title = nil)
|
||||||
return true if user && is_staff?
|
return true if user && is_staff?
|
||||||
|
return false if title.nil?
|
||||||
return false if user != @user
|
return false if user != @user
|
||||||
return true if user.badges.where(name: title, allow_title: true).exists?
|
return true if user.badges.where(name: title, allow_title: true).exists?
|
||||||
user.groups.where(title: title).exists?
|
user.groups.where(title: title).exists?
|
||||||
|
|
|
@ -159,7 +159,7 @@ describe UserUpdater do
|
||||||
it 'allows user to change title' do
|
it 'allows user to change title' do
|
||||||
user = Fabricate(:user, title: 'Emperor')
|
user = Fabricate(:user, title: 'Emperor')
|
||||||
guardian = stub
|
guardian = stub
|
||||||
guardian.stubs(:can_grant_title?).with(user).returns(true)
|
guardian.stubs(:can_grant_title?).with(user, 'Minion').returns(true)
|
||||||
Guardian.stubs(:new).with(acting_user).returns(guardian)
|
Guardian.stubs(:new).with(acting_user).returns(guardian)
|
||||||
updater = UserUpdater.new(acting_user, user)
|
updater = UserUpdater.new(acting_user, user)
|
||||||
|
|
||||||
|
@ -169,11 +169,63 @@ describe UserUpdater do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'title is from a badge' do
|
||||||
|
let(:user) { Fabricate(:user, title: 'Emperor') }
|
||||||
|
let(:badge) { Fabricate(:badge, name: 'Minion') }
|
||||||
|
|
||||||
|
context 'badge can be used as a title' do
|
||||||
|
before do
|
||||||
|
badge.update_attributes(allow_title: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can use as title, sets badge_granted_title' do
|
||||||
|
BadgeGranter.grant(badge, user)
|
||||||
|
updater = UserUpdater.new(user, user)
|
||||||
|
updater.update(title: badge.name)
|
||||||
|
user.reload
|
||||||
|
expect(user.user_profile.badge_granted_title).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'badge has not been granted, does not change title' do
|
||||||
|
badge.update_attributes(allow_title: true)
|
||||||
|
updater = UserUpdater.new(user, user)
|
||||||
|
updater.update(title: badge.name)
|
||||||
|
user.reload
|
||||||
|
expect(user.title).not_to eq(badge.name)
|
||||||
|
expect(user.user_profile.badge_granted_title).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'changing to a title that is not from a badge, unsets badge_granted_title' do
|
||||||
|
user.update_attributes(title: badge.name)
|
||||||
|
user.user_profile.update_attributes(badge_granted_title: true)
|
||||||
|
|
||||||
|
guardian = stub
|
||||||
|
guardian.stubs(:can_grant_title?).with(user, 'Dancer').returns(true)
|
||||||
|
Guardian.stubs(:new).with(user).returns(guardian)
|
||||||
|
|
||||||
|
updater = UserUpdater.new(user, user)
|
||||||
|
updater.update(title: 'Dancer')
|
||||||
|
user.reload
|
||||||
|
expect(user.title).to eq('Dancer')
|
||||||
|
expect(user.user_profile.badge_granted_title).to eq(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'cannot use as title, does not change title' do
|
||||||
|
BadgeGranter.grant(badge, user)
|
||||||
|
updater = UserUpdater.new(user, user)
|
||||||
|
updater.update(title: badge.name)
|
||||||
|
user.reload
|
||||||
|
expect(user.title).not_to eq(badge.name)
|
||||||
|
expect(user.user_profile.badge_granted_title).to eq(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'without permission to update title' do
|
context 'without permission to update title' do
|
||||||
it 'does not allow user to change title' do
|
it 'does not allow user to change title' do
|
||||||
user = Fabricate(:user, title: 'Emperor')
|
user = Fabricate(:user, title: 'Emperor')
|
||||||
guardian = stub
|
guardian = stub
|
||||||
guardian.stubs(:can_grant_title?).with(user).returns(false)
|
guardian.stubs(:can_grant_title?).with(user, 'Minion').returns(false)
|
||||||
Guardian.stubs(:new).with(acting_user).returns(guardian)
|
Guardian.stubs(:new).with(acting_user).returns(guardian)
|
||||||
updater = UserUpdater.new(acting_user, user)
|
updater = UserUpdater.new(acting_user, user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user