Fix to allow admins to change the case of a someone's username

This commit is contained in:
Neil Lalonde 2013-07-30 14:13:56 -04:00
parent 2f95f60e40
commit 16cd3e2a53
4 changed files with 17 additions and 6 deletions
app
assets/javascripts/discourse
controllers
spec/controllers

View file

@ -26,7 +26,7 @@ Discourse.PreferencesUsernameController = Discourse.ObjectController.extend({
this.set('errorMessage', null); this.set('errorMessage', null);
if (this.blank('newUsername')) return; if (this.blank('newUsername')) return;
if (this.get('unchanged')) return; if (this.get('unchanged')) return;
Discourse.User.checkUsername(this.get('newUsername')).then(function(result) { Discourse.User.checkUsername(this.get('newUsername'), undefined, this.get('content.id')).then(function(result) {
if (result.errors) { if (result.errors) {
preferencesUsernameController.set('errorMessage', result.errors.join(' ')); preferencesUsernameController.set('errorMessage', result.errors.join(' '));
} else if (result.available === false) { } else if (result.available === false) {

View file

@ -331,9 +331,9 @@ Discourse.User.reopenClass({
@param {String} username A username to check @param {String} username A username to check
@param {String} email An email address to check @param {String} email An email address to check
**/ **/
checkUsername: function(username, email) { checkUsername: function(username, email, forUserId) {
return Discourse.ajax('/users/check_username', { return Discourse.ajax('/users/check_username', {
data: { username: username, email: email } data: { username: username, email: email, for_user_id: forUserId }
}); });
}, },

View file

@ -102,8 +102,10 @@ class UsersController < ApplicationController
def check_username def check_username
params.require(:username) params.require(:username)
target_user = params[:for_user_id] ? User.find(params[:for_user_id]) : current_user
# The special case where someone is changing the case of their own username # The special case where someone is changing the case of their own username
return render(json: {available: true}) if current_user and params[:username].downcase == current_user.username.downcase return render(json: {available: true}) if target_user and params[:username].downcase == target_user.username.downcase
validator = UsernameValidator.new(params[:username]) validator = UsernameValidator.new(params[:username])
if !validator.valid_format? if !validator.valid_format?
@ -117,12 +119,12 @@ class UsersController < ApplicationController
else else
# Contact the Discourse Hub server # Contact the Discourse Hub server
email_given = (params[:email].present? || current_user.present?) email_given = (params[:email].present? || target_user.present?)
available_locally = User.username_available?(params[:username]) available_locally = User.username_available?(params[:username])
global_match = false global_match = false
available_globally, suggestion_from_discourse_hub = begin available_globally, suggestion_from_discourse_hub = begin
if email_given if email_given
global_match, available, suggestion = DiscourseHub.nickname_match?( params[:username], params[:email] || current_user.email ) global_match, available, suggestion = DiscourseHub.nickname_match?( params[:username], params[:email] || target_user.email )
[available || global_match, suggestion] [available || global_match, suggestion]
else else
DiscourseHub.nickname_available?(params[:username]) DiscourseHub.nickname_available?(params[:username])

View file

@ -802,6 +802,15 @@ describe UsersController do
end end
include_examples 'when username is unavailable locally' include_examples 'when username is unavailable locally'
end end
context "an admin changing it for someone else" do
let!(:user) { Fabricate(:user, username: 'hansolo') }
before do
log_in_user(Fabricate(:admin))
xhr :get, :check_username, username: 'HanSolo', for_user_id: user.id
end
include_examples 'when username is available everywhere'
end
end end
end end