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

@ -26,7 +26,7 @@ Discourse.PreferencesUsernameController = Discourse.ObjectController.extend({
this.set('errorMessage', null);
if (this.blank('newUsername')) 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) {
preferencesUsernameController.set('errorMessage', result.errors.join(' '));
} else if (result.available === false) {

@ -331,9 +331,9 @@ Discourse.User.reopenClass({
@param {String} username A username 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', {
data: { username: username, email: email }
data: { username: username, email: email, for_user_id: forUserId }
});
},

@ -102,8 +102,10 @@ class UsersController < ApplicationController
def check_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
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])
if !validator.valid_format?
@ -117,12 +119,12 @@ class UsersController < ApplicationController
else
# 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])
global_match = false
available_globally, suggestion_from_discourse_hub = begin
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]
else
DiscourseHub.nickname_available?(params[:username])

@ -802,6 +802,15 @@ describe UsersController do
end
include_examples 'when username is unavailable locally'
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