Implemented Gravatar support

This commit is contained in:
Paweł Paprota 2012-10-12 07:35:19 +02:00 committed by Tom Hughes
parent 44b084dc3a
commit ad43499205
7 changed files with 128 additions and 55 deletions

View file

@ -51,8 +51,8 @@ class UserController < ApplicationController
if params[:user] and params[:user][:openid_url] and @user.pass_crypt.empty?
# We are creating an account with OpenID and no password
# was specified so create a random one
@user.pass_crypt = SecureRandom.base64(16)
@user.pass_crypt_confirmation = @user.pass_crypt
@user.pass_crypt = SecureRandom.base64(16)
@user.pass_crypt_confirmation = @user.pass_crypt
end
if @user
@ -127,7 +127,7 @@ class UserController < ApplicationController
@user.terms_agreed = Time.now.getutc
@user.terms_seen = true
@user.openid_url = nil if @user.openid_url and @user.openid_url.empty?
if @user.save
flash[:piwik_goal] = PIWIK_SIGNUP_GOAL if defined?(PIWIK_SIGNUP_GOAL)
flash[:notice] = t 'user.new.flash create success message', :email => @user.email
@ -299,7 +299,7 @@ class UserController < ApplicationController
referer = token.referer
token.destroy
if session[:token]
if session[:token]
token = UserToken.find_by_token(session[:token])
session.delete(:token)
else
@ -603,7 +603,7 @@ private
else
return openid_url
end
end
end
##
# process a successful login
@ -663,8 +663,15 @@ private
user.languages = params[:user][:languages].split(",")
case params[:image_action]
when "new" then user.image = params[:user][:image]
when "delete" then user.image = nil
when "new" then
user.image = params[:user][:image]
user.image_use_gravatar = false
when "delete" then
user.image = nil
user.image_use_gravatar = false
when "gravatar" then
user.image = nil
user.image_use_gravatar = true
end
user.home_lat = params[:user][:home_lat]
@ -755,7 +762,7 @@ private
##
#
def disable_terms_redirect
# this is necessary otherwise going to the user terms page, when
# this is necessary otherwise going to the user terms page, when
# having not agreed already would cause an infinite redirect loop.
# it's .now so that this doesn't propagate to other pages.
flash.now[:skip_terms] = true

View file

@ -1,22 +1,46 @@
module UserHelper
# User images
def user_image(user, options = {})
options[:class] ||= "user_image"
image_tag user.image.url(:large), options
if user.image_use_gravatar
user_gravatar_tag(user, options)
else
image_tag user.image.url(:large), options
end
end
def user_thumbnail(user, options = {})
options[:class] ||= "user_thumbnail"
image_tag user.image.url(:small), options
if user.image_use_gravatar
user_gravatar_tag(user, options)
else
image_tag user.image.url(:small), options
end
end
def user_thumbnail_tiny(user, options = {})
options[:class] ||= "user_thumbnail_tiny"
image_tag user.image.url(:small), options
if user.image_use_gravatar
user_gravatar_tag(user, options)
else
image_tag user.image.url(:small), options
end
end
def user_image_url(user, options = {})
if user.image_use_gravatar
user_gravatar_url(user, options)
else
"http://#{SERVER_URL}#{image_path(user.image.url)}"
end
end
# OpenID support
def openid_logo
image_tag "openid_small.png", :alt => t('user.login.openid_logo_alt'), :class => "openid_logo"
end
@ -29,4 +53,20 @@ module UserHelper
:title => t("user.login.openid_providers.#{name}.title")
)
end
# Gravatar support
# See http://en.gravatar.com/site/implement/images/ for details.
def user_gravatar_url(user, options = {})
size = options[:size] || 100
hash = Digest::MD5::hexdigest(user.email.downcase)
default_image_url = "http://#{SERVER_URL}#{image_path("users/images/large.png")}"
url = "http://www.gravatar.com/avatar/#{hash}.jpg?s=#{size}&d=#{u(default_image_url)}"
end
def user_gravatar_tag(user, options = {})
url = user_gravatar_url(user, options)
options.delete(:size)
image_tag url, options
end
end

View file

@ -45,12 +45,13 @@ class User < ActiveRecord::Base
validates_inclusion_of :preferred_editor, :in => Editors::ALL_EDITORS, :allow_nil => true
attr_accessible :display_name, :email, :email_confirmation, :openid_url,
:pass_crypt, :pass_crypt_confirmation, :consider_pd
:pass_crypt, :pass_crypt_confirmation, :consider_pd,
:image_use_gravatar
after_initialize :set_defaults
before_save :encrypt_password
has_attached_file :image,
has_attached_file :image,
:default_url => "/assets/:class/:attachment/:style.png",
:styles => { :large => "100x100>", :small => "50x50>" }
@ -82,7 +83,7 @@ class User < ActiveRecord::Base
token.update_column(:expiry, 1.week.from_now) if token and user
return user
end
end
def to_xml
doc = OSM::API.new.get_xml_doc
@ -125,7 +126,7 @@ class User < ActiveRecord::Base
end
def nearby(radius = NEARBY_RADIUS, num = NEARBY_USERS)
if self.home_lon and self.home_lat
if self.home_lon and self.home_lat
gc = OSM::GreatCircle.new(self.home_lat, self.home_lon)
bounds = gc.bounds(radius)
sql_for_distance = gc.sql_for_distance("home_lat", "home_lon")
@ -182,7 +183,7 @@ class User < ActiveRecord::Base
end
##
# returns the first active block which would require users to view
# returns the first active block which would require users to view
# a message, or nil if there are none.
def blocked_on_view
blocks.active.detect { |b| b.needs_view? }

View file

@ -85,26 +85,33 @@
<%= t 'user.account.image' %>
</td>
<td valign="top">
<% if @user.image.file? %>
<table id="accountImage">
<tr>
<td rowspan="3" valign="top"><%= user_image @user %></td>
<td><%= radio_button_tag "image_action", "keep", true %></td>
<td><%= t 'user.account.keep image' %></td>
</tr>
<tr>
<td><%= radio_button_tag "image_action", "delete" %></td>
<td><%= t 'user.account.delete image' %></td>
</tr>
<tr>
<td><%= radio_button_tag "image_action", "new" %></td>
<td><%= t 'user.account.replace image' %><br /><%= f.file_field :image, :onchange => "$('image_action_new').prop('checked', true)" %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span></td>
</tr>
</table>
<% else %>
<%= hidden_field_tag "image_action", "new" %>
<%= t 'user.account.new image' %><br /><%= f.file_field :image %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span>
<% end %>
<table id="accountImage">
<% if @user.image.file? %>
<tr>
<td rowspan="4" valign="top"><%= user_image @user %></td>
<td><%= radio_button_tag "image_action", "keep", !@user.image_use_gravatar %></td>
<td><%= t 'user.account.keep image' %></td>
</tr>
<tr>
<td><%= radio_button_tag "image_action", "delete" %></td>
<td><%= t 'user.account.delete image' %></td>
</tr>
<tr>
<td><%= radio_button_tag "image_action", "new" %></td>
<td><%= t 'user.account.replace image' %><br /><%= f.file_field :image, :onchange => "$('image_action_new').prop('checked', true)" %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span></td>
</tr>
<% else %>
<tr>
<td rowspan="2" valign="top"><%= user_image @user %></td>
<td><%= radio_button_tag "image_action", "new", !@user.image_use_gravatar %></td>
<td><%= t 'user.account.new image' %> <%= f.file_field :image %><br /><span class="minorNote"><%= t 'user.account.image size hint' %></span></td>
</tr>
<% end %>
<tr>
<td><%= radio_button_tag "image_action", "gravatar", @user.image_use_gravatar %></td>
<td><%= t 'user.account.gravatar.gravatar' %> <span class="minorNote">(<a href="<%= t 'user.account.gravatar.link' %>" target="_new"><%= t 'user.account.gravatar.link text' %></a>)</span></td>
</tr>
</table>
</td>
</tr>
@ -123,7 +130,7 @@
<%= content_tag "div", "", :id => "map", :class => "user_map set_location" %>
</td>
</tr>
<tr>
<td></td>
<td class="submitButton"><%= submit_tag t('user.account.save changes button') %></td>

View file

@ -12,8 +12,8 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do
else
xml.tag! "contributor-terms", :agreed => !!@this_user.terms_agreed
end
if @this_user.image.file?
xml.tag! "img", :href => "http://#{SERVER_URL}#{@this_user.image.url}"
if @this_user.image.file? or @this_user.image_use_gravatar
xml.tag! "img", :href => user_image_url(@this_user, :size => 256)
end
xml.tag! "roles" do
@this_user.roles.each do |role|
@ -35,7 +35,7 @@ xml.osm("version" => API_VERSION, "generator" => GENERATOR) do
xml.tag! "home", :lat => @this_user.home_lat,
:lon => @this_user.home_lon,
:zoom => @this_user.home_zoom
end
end
if @this_user.languages
xml.tag! "languages" do
@this_user.languages.split(",") { |lang| xml.tag! "lang", lang }