mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-27 17:46:05 -05:00
Adds a class that can detect whether a user has uploaded a custom avatar
This commit is contained in:
parent
21e08a423e
commit
2319924206
3 changed files with 107 additions and 7 deletions
|
@ -300,14 +300,15 @@ class User < ActiveRecord::Base
|
||||||
template.gsub("{size}", "45")
|
template.gsub("{size}", "45")
|
||||||
end
|
end
|
||||||
|
|
||||||
def avatar_template
|
|
||||||
if SiteSetting.allow_uploaded_avatars? && use_uploaded_avatar
|
|
||||||
# the avatars might take a while to generate
|
# the avatars might take a while to generate
|
||||||
# so return the url of the original image in the meantime
|
# so return the url of the original image in the meantime
|
||||||
|
def uploaded_avatar_path
|
||||||
|
return unless SiteSetting.allow_uploaded_avatars? && use_uploaded_avatar
|
||||||
uploaded_avatar_template.present? ? uploaded_avatar_template : uploaded_avatar.try(:url)
|
uploaded_avatar_template.present? ? uploaded_avatar_template : uploaded_avatar.try(:url)
|
||||||
else
|
|
||||||
User.gravatar_template(email)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def avatar_template
|
||||||
|
uploaded_avatar_path || User.gravatar_template(email)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Updates the denormalized view counts for all users
|
# Updates the denormalized view counts for all users
|
||||||
|
|
32
lib/avatar_detector.rb
Normal file
32
lib/avatar_detector.rb
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
require_dependency 'user'
|
||||||
|
require 'net/http'
|
||||||
|
|
||||||
|
class AvatarDetector
|
||||||
|
|
||||||
|
def initialize(user)
|
||||||
|
raise "Tried to detect an avatar on a non-user instance" unless user && user.is_a?(User)
|
||||||
|
|
||||||
|
@user = user
|
||||||
|
end
|
||||||
|
|
||||||
|
def has_custom_avatar?
|
||||||
|
return true if @user.uploaded_avatar_path
|
||||||
|
has_custom_gravatar?
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check whether the user has a gravatar by performing a HTTP HEAD request to
|
||||||
|
# Gravatar using the `d=404` parameter.
|
||||||
|
def has_custom_gravatar?
|
||||||
|
result = Net::HTTP.start('www.gravatar.com') do |http|
|
||||||
|
http.open_timeout = 2
|
||||||
|
http.read_timeout = 2
|
||||||
|
http.head("/avatar/#{User.email_hash(@user.email)}?d=404")
|
||||||
|
end
|
||||||
|
|
||||||
|
return result.code.to_i == 200
|
||||||
|
rescue
|
||||||
|
# If the HTTP request fails, assume no gravatar
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
67
spec/components/avatar_detector_spec.rb
Normal file
67
spec/components/avatar_detector_spec.rb
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
# encoding: utf-8
|
||||||
|
require 'spec_helper'
|
||||||
|
require_dependency 'avatar_detector'
|
||||||
|
|
||||||
|
describe AvatarDetector do
|
||||||
|
|
||||||
|
describe "construction" do
|
||||||
|
|
||||||
|
it "raises an error without a user" do
|
||||||
|
-> { AvatarDetector.new(nil) }.should raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
it "raises an error on a non-user object" do
|
||||||
|
-> { AvatarDetector.new(Array.new) }.should raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "has_custom_avatar?" do
|
||||||
|
|
||||||
|
describe "with a user" do
|
||||||
|
let(:user) { User.new(use_uploaded_avatar: true) }
|
||||||
|
let(:avatar_detector) { AvatarDetector.new(user) }
|
||||||
|
|
||||||
|
describe "when the user doesn't have an uploaded_avatar_path" do
|
||||||
|
|
||||||
|
before do
|
||||||
|
user.stubs(:uploaded_avatar_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true if they have a custom gravatar" do
|
||||||
|
avatar_detector.expects(:has_custom_gravatar?).returns(true)
|
||||||
|
avatar_detector.has_custom_avatar?.should be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns false if they don't have a custom gravatar" do
|
||||||
|
avatar_detector.expects(:has_custom_gravatar?).returns(false)
|
||||||
|
avatar_detector.has_custom_avatar?.should be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
context "when the user doesn't have an uploaded_avatar_path" do
|
||||||
|
let(:user) { User.new(use_uploaded_avatar: true) }
|
||||||
|
let(:avatar_detector) { AvatarDetector.new(user) }
|
||||||
|
|
||||||
|
describe "when the user has an uploaded avatar" do
|
||||||
|
before do
|
||||||
|
user.expects(:uploaded_avatar_path).returns("/some/uploaded/file.png")
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns true" do
|
||||||
|
avatar_detector.has_custom_avatar?.should be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't call has_custom_gravatar" do
|
||||||
|
avatar_detector.expects(:has_custom_gravatar?).never
|
||||||
|
avatar_detector.has_custom_avatar?
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in a new issue