mirror of
https://github.com/codeninjasllc/discourse.git
synced 2025-02-25 16:04:22 -05:00
FIX: refreshing gravatar wasn't working
This commit is contained in:
parent
b45af1d6c8
commit
07e7b07b63
7 changed files with 47 additions and 24 deletions
|
@ -36,7 +36,7 @@ export default Ember.Controller.extend(ModalFunctionality, {
|
||||||
.ajax(`/user_avatar/${this.get("username")}/refresh_gravatar.json`, { method: "POST" })
|
.ajax(`/user_avatar/${this.get("username")}/refresh_gravatar.json`, { method: "POST" })
|
||||||
.then(result => this.setProperties({
|
.then(result => this.setProperties({
|
||||||
gravatar_avatar_template: result.gravatar_avatar_template,
|
gravatar_avatar_template: result.gravatar_avatar_template,
|
||||||
gravatar_upload_id: result.gravatar_upload_id,
|
gravatar_avatar_upload_id: result.gravatar_upload_id,
|
||||||
}))
|
}))
|
||||||
.finally(() => this.set("gravatarRefreshDisabled", false));
|
.finally(() => this.set("gravatarRefreshDisabled", false));
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,8 +4,7 @@ import UserStream from 'discourse/models/user-stream';
|
||||||
import UserPostsStream from 'discourse/models/user-posts-stream';
|
import UserPostsStream from 'discourse/models/user-posts-stream';
|
||||||
import Singleton from 'discourse/mixins/singleton';
|
import Singleton from 'discourse/mixins/singleton';
|
||||||
import { longDate } from 'discourse/lib/formatter';
|
import { longDate } from 'discourse/lib/formatter';
|
||||||
import computed from 'ember-addons/ember-computed-decorators';
|
import { default as computed, observes } from 'ember-addons/ember-computed-decorators';
|
||||||
import { observes } from 'ember-addons/ember-computed-decorators';
|
|
||||||
import Badge from 'discourse/models/badge';
|
import Badge from 'discourse/models/badge';
|
||||||
import UserBadge from 'discourse/models/user-badge';
|
import UserBadge from 'discourse/models/user-badge';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import RestrictedUserRoute from "discourse/routes/restricted-user";
|
import RestrictedUserRoute from "discourse/routes/restricted-user";
|
||||||
import showModal from 'discourse/lib/show-modal';
|
import showModal from 'discourse/lib/show-modal';
|
||||||
|
import { popupAjaxError } from 'discourse/lib/ajax-error';
|
||||||
|
|
||||||
export default RestrictedUserRoute.extend({
|
export default RestrictedUserRoute.extend({
|
||||||
model() {
|
model() {
|
||||||
|
@ -60,7 +61,7 @@ export default RestrictedUserRoute.extend({
|
||||||
'custom_avatar_template'
|
'custom_avatar_template'
|
||||||
));
|
));
|
||||||
bootbox.alert(I18n.t("user.change_avatar.cache_notice"));
|
bootbox.alert(I18n.t("user.change_avatar.cache_notice"));
|
||||||
});
|
}).catch(popupAjaxError);
|
||||||
|
|
||||||
// saves the data back
|
// saves the data back
|
||||||
controller.send('closeModal');
|
controller.send('closeModal');
|
||||||
|
|
|
@ -527,6 +527,8 @@ class UsersController < ApplicationController
|
||||||
render json: to_render
|
render json: to_render
|
||||||
end
|
end
|
||||||
|
|
||||||
|
AVATAR_TYPES_WITH_UPLOAD ||= %w{uploaded custom gravatar}
|
||||||
|
|
||||||
def pick_avatar
|
def pick_avatar
|
||||||
user = fetch_user_from_params
|
user = fetch_user_from_params
|
||||||
guardian.ensure_can_edit!(user)
|
guardian.ensure_can_edit!(user)
|
||||||
|
@ -536,10 +538,17 @@ class UsersController < ApplicationController
|
||||||
|
|
||||||
user.uploaded_avatar_id = upload_id
|
user.uploaded_avatar_id = upload_id
|
||||||
|
|
||||||
if type == "uploaded" || type == "custom"
|
if AVATAR_TYPES_WITH_UPLOAD.include?(type)
|
||||||
user.user_avatar.custom_upload_id = upload_id
|
# make sure the upload exists
|
||||||
elsif type == "gravatar"
|
unless Upload.where(id: upload_id).exists?
|
||||||
user.user_avatar.gravatar_upload_id = upload_id
|
return render_json_error I18n.t("avatar.missing")
|
||||||
|
end
|
||||||
|
|
||||||
|
if type == "gravatar"
|
||||||
|
user.user_avatar.gravatar_upload_id = upload_id
|
||||||
|
else
|
||||||
|
user.user_avatar.custom_upload_id = upload_id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
user.save!
|
user.save!
|
||||||
|
|
|
@ -10,20 +10,20 @@ class UserAvatar < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_gravatar!
|
def update_gravatar!
|
||||||
DistributedMutex.synchronize("update_gravatar_#{user.id}") do
|
DistributedMutex.synchronize("update_gravatar_#{user_id}") do
|
||||||
begin
|
begin
|
||||||
# special logic for our system user
|
# special logic for our system user
|
||||||
email_hash = user.id == Discourse::SYSTEM_USER_ID ? User.email_hash("info@discourse.org") : user.email_hash
|
email_hash = user_id == Discourse::SYSTEM_USER_ID ? User.email_hash("info@discourse.org") : user.email_hash
|
||||||
|
|
||||||
self.last_gravatar_download_attempt = Time.new
|
self.last_gravatar_download_attempt = Time.new
|
||||||
|
|
||||||
max = Discourse.avatar_sizes.max
|
max = Discourse.avatar_sizes.max
|
||||||
gravatar_url = "http://www.gravatar.com/avatar/#{email_hash}.png?s=#{max}&d=404"
|
gravatar_url = "http://www.gravatar.com/avatar/#{email_hash}.png?s=#{max}&d=404"
|
||||||
tempfile = FileHelper.download(gravatar_url, SiteSetting.max_image_size_kb.kilobytes, "gravatar")
|
tempfile = FileHelper.download(gravatar_url, SiteSetting.max_image_size_kb.kilobytes, "gravatar")
|
||||||
upload = Upload.create_for(user.id, tempfile, 'gravatar.png', File.size(tempfile.path), origin: gravatar_url, image_type: "avatar")
|
upload = Upload.create_for(user_id, tempfile, 'gravatar.png', File.size(tempfile.path), origin: gravatar_url, image_type: "avatar")
|
||||||
|
|
||||||
if gravatar_upload_id != upload.id
|
if gravatar_upload_id != upload.id
|
||||||
gravatar_upload.try(:destroy!)
|
gravatar_upload.try(:destroy!) rescue nil
|
||||||
self.gravatar_upload = upload
|
self.gravatar_upload = upload
|
||||||
save!
|
save!
|
||||||
end
|
end
|
||||||
|
@ -31,7 +31,7 @@ class UserAvatar < ActiveRecord::Base
|
||||||
save!
|
save!
|
||||||
rescue SocketError
|
rescue SocketError
|
||||||
# skip saving, we are not connected to the net
|
# skip saving, we are not connected to the net
|
||||||
Rails.logger.warn "Failed to download gravatar, socket error - user id #{user.id}"
|
Rails.logger.warn "Failed to download gravatar, socket error - user id #{user_id}"
|
||||||
ensure
|
ensure
|
||||||
tempfile.try(:close!)
|
tempfile.try(:close!)
|
||||||
end
|
end
|
||||||
|
|
|
@ -2096,6 +2096,9 @@ en:
|
||||||
too_large: "Sorry, the image you are trying to upload is too big (maximum size is %{max_size_kb}KB), please resize it and try again."
|
too_large: "Sorry, the image you are trying to upload is too big (maximum size is %{max_size_kb}KB), please resize it and try again."
|
||||||
size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?"
|
size_not_found: "Sorry, but we couldn't determine the size of the image. Maybe your image is corrupted?"
|
||||||
|
|
||||||
|
avatar:
|
||||||
|
missing: "Sorry, but the avatar you have selected is not present on the server. Can you try uploading it again?"
|
||||||
|
|
||||||
flag_reason:
|
flag_reason:
|
||||||
sockpuppet: "A new user created a topic, and another new user at the same IP address replied. See the flag_sockpuppets site setting."
|
sockpuppet: "A new user created a topic, and another new user at the same IP address replied. See the flag_sockpuppets site setting."
|
||||||
spam_hosts: "This new user tried to create multiple posts with links to the same domain. See the newuser_spam_host_threshold site setting."
|
spam_hosts: "This new user tried to create multiple posts with links to the same domain. See the newuser_spam_host_threshold site setting."
|
||||||
|
|
|
@ -1301,29 +1301,40 @@ describe UsersController do
|
||||||
describe '.pick_avatar' do
|
describe '.pick_avatar' do
|
||||||
|
|
||||||
it 'raises an error when not logged in' do
|
it 'raises an error when not logged in' do
|
||||||
expect { xhr :put, :pick_avatar, username: 'asdf', avatar_id: 1, type: "custom"}.to raise_error(Discourse::NotLoggedIn)
|
expect {
|
||||||
|
xhr :put, :pick_avatar, username: 'asdf', avatar_id: 1, type: "custom"
|
||||||
|
}.to raise_error(Discourse::NotLoggedIn)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'while logged in' do
|
context 'while logged in' do
|
||||||
|
|
||||||
let!(:user) { log_in }
|
let!(:user) { log_in }
|
||||||
|
let(:upload) { Fabricate(:upload) }
|
||||||
|
|
||||||
it 'raises an error when you don\'t have permission to toggle the avatar' do
|
it "raises an error when you don't have permission to toggle the avatar" do
|
||||||
another_user = Fabricate(:user)
|
another_user = Fabricate(:user)
|
||||||
xhr :put, :pick_avatar, username: another_user.username, upload_id: 1, type: "custom"
|
xhr :put, :pick_avatar, username: another_user.username, upload_id: upload.id, type: "custom"
|
||||||
expect(response).to be_forbidden
|
expect(response).to be_forbidden
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'it successful' do
|
it 'can successfully pick the system avatar' do
|
||||||
xhr :put, :pick_avatar, username: user.username, upload_id: 111, type: "custom"
|
|
||||||
expect(user.reload.uploaded_avatar_id).to eq(111)
|
|
||||||
expect(user.user_avatar.reload.custom_upload_id).to eq(111)
|
|
||||||
expect(response).to be_success
|
|
||||||
|
|
||||||
xhr :put, :pick_avatar, username: user.username
|
xhr :put, :pick_avatar, username: user.username
|
||||||
expect(user.reload.uploaded_avatar_id).to eq(nil)
|
|
||||||
expect(user.user_avatar.reload.custom_upload_id).to eq(111)
|
|
||||||
expect(response).to be_success
|
expect(response).to be_success
|
||||||
|
expect(user.reload.uploaded_avatar_id).to eq(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can successfully pick a gravatar' do
|
||||||
|
xhr :put, :pick_avatar, username: user.username, upload_id: upload.id, type: "gravatar"
|
||||||
|
expect(response).to be_success
|
||||||
|
expect(user.reload.uploaded_avatar_id).to eq(upload.id)
|
||||||
|
expect(user.user_avatar.reload.gravatar_upload_id).to eq(upload.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'can successfully pick a custom avatar' do
|
||||||
|
xhr :put, :pick_avatar, username: user.username, upload_id: upload.id, type: "custom"
|
||||||
|
expect(response).to be_success
|
||||||
|
expect(user.reload.uploaded_avatar_id).to eq(upload.id)
|
||||||
|
expect(user.user_avatar.reload.custom_upload_id).to eq(upload.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue