Commit 3e8bfd50051a01c94c25214484e478ae53d92b27

Authored by Rodrigo Souto
1 parent e069a353

application-helper: refactor gravatar logic

app/controllers/public/account_controller.rb
... ... @@ -262,7 +262,7 @@ class AccountController < ApplicationController
262 262 def user_data
263 263 user_data =
264 264 if logged_in?
265   - current_user.data_hash self
  265 + current_user.data_hash(gravatar_default)
266 266 else
267 267 { }
268 268 end
... ...
app/helpers/application_helper.rb
... ... @@ -38,6 +38,8 @@ module ApplicationHelper
38 38  
39 39 include LayoutHelper
40 40  
  41 + include Noosfero::Gravatar
  42 +
41 43 def locale
42 44 (@page && !@page.language.blank?) ? @page.language : FastGettext.locale
43 45 end
... ... @@ -356,8 +358,7 @@ module ApplicationHelper
356 358 end
357 359  
358 360 def theme_path
359   - if ( respond_to?(:session) && session[:theme] ) ||
360   - ( @controller && @controller.session[:theme] )
  361 + if session[:theme]
361 362 '/user_themes/' + current_theme
362 363 else
363 364 '/designs/themes/' + current_theme
... ... @@ -367,8 +368,7 @@ module ApplicationHelper
367 368 def current_theme
368 369 @current_theme ||=
369 370 begin
370   - if ( respond_to?(:session) && session[:theme] ) ||
371   - ( @controller && @controller.session[:theme] )
  371 + if session[:theme]
372 372 session[:theme]
373 373 else
374 374 # utility for developers: set the theme to 'random' in development mode and
... ... @@ -591,28 +591,8 @@ module ApplicationHelper
591 591 :class => 'vcard'), :class => 'common-profile-list-block')
592 592 end
593 593  
594   - def gravatar_url_for(email, options = {})
595   - # Ta dando erro de roteamento
596   - default = theme_option['gravatar'] || NOOSFERO_CONF['gravatar'] || nil
597   - url_for( { :gravatar_id => Digest::MD5.hexdigest(email.to_s),
598   - :host => 'www.gravatar.com',
599   - :protocol => 'http://',
600   - :only_path => false,
601   - :controller => 'avatar.php',
602   - :d => default
603   - }.merge(options) )
604   - end
605   -
606   - def str_gravatar_url_for(email, options = {})
607   - default = theme_option['gravatar'] || NOOSFERO_CONF['gravatar'] || nil
608   - "http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(email.to_s)}?" + {
609   - :only_path => false,
610   - :d => default
611   - }.merge(options).map{|k,v| '%s=%s' % [ k,v ] }.join('&')
612   - end
613   -
614   - def gravatar_profile_url(email)
615   - 'http://www.gravatar.com/'+ Digest::MD5.hexdigest(email.to_s)
  594 + def gravatar_default
  595 + (respond_to?(:theme_option) && theme_option.present? && theme_option['gravatar']) || NOOSFERO_CONF['gravatar']
616 596 end
617 597  
618 598 attr_reader :environment
... ...
app/models/person.rb
... ... @@ -476,6 +476,13 @@ class Person < Profile
476 476 self.fields_privacy.nil? ? [] : self.fields_privacy.reject{ |k, v| v != 'public' }.keys.map(&:to_s)
477 477 end
478 478  
  479 + include Noosfero::Gravatar
  480 +
  481 + def profile_custom_icon(gravatar_default=nil)
  482 + (self.image.present? && self.image.public_filename(:icon)) ||
  483 + gravatar_profile_image_url(self.email, :size=>20, :d => gravatar_default)
  484 + end
  485 +
479 486 protected
480 487  
481 488 def followed_by?(profile)
... ...
app/models/profile.rb
... ... @@ -844,8 +844,10 @@ private :generate_url, :url_options
844 844 }[amount] || _("%s members") % amount
845 845 end
846 846  
847   - def profile_custom_icon
848   - self.image.public_filename(:icon) unless self.image.blank?
  847 + include Noosfero::Gravatar
  848 +
  849 + def profile_custom_icon(gravatar_default=nil)
  850 + image.public_filename(:icon) if image.present?
849 851 end
850 852  
851 853 def jid(options = {})
... ...
app/models/user.rb
... ... @@ -275,25 +275,21 @@ class User < ActiveRecord::Base
275 275 end
276 276 end
277 277  
278   - include ApplicationHelper
279   -
280   - def data_hash(controller=nil)
281   - @controller ||= controller
  278 + def data_hash(gravatar_default = nil)
282 279 friends_list = {}
283 280 enterprises = person.enterprises.map { |e| { 'name' => e.short_name, 'identifier' => e.identifier } }
284 281 self.person.friends.online.map do |person|
285 282 friends_list[person.identifier] = {
286   - 'avatar' => person.profile_custom_icon,
  283 + 'avatar' => person.profile_custom_icon(gravatar_default),
287 284 'name' => person.short_name,
288 285 'jid' => person.full_jid,
289 286 'status' => person.user.chat_status,
290 287 }
291 288 end
292   - avatar = self.person.profile_custom_icon
293   - avatar = str_gravatar_url_for(self.email, :size=>20) if avatar.blank?
  289 +
294 290 {
295 291 'login' => self.login,
296   - 'avatar' => avatar,
  292 + 'avatar' => self.person.profile_custom_icon(gravatar_default),
297 293 'is_admin' => self.person.is_admin?,
298 294 'since_month' => self.person.created_at.month,
299 295 'since_year' => self.person.created_at.year,
... ...
app/views/comment/_comment.rhtml
... ... @@ -13,11 +13,11 @@
13 13 <% else %>
14 14 <% url_image, status_class = comment.author_id ?
15 15 [comment.removed_user_image, 'icon-user-removed'] :
16   - [str_gravatar_url_for( comment.email, :size => 50, :d=>404 ), 'icon-user-unknown'] %>
  16 + [gravatar_profile_image_url( comment.email, :size => 50, :d=>404 ), 'icon-user-unknown'] %>
17 17  
18 18 <%= link_to(
19 19 image_tag(url_image, :onerror=>'gravatarCommentFailback(this)',
20   - 'data-gravatar'=>str_gravatar_url_for(comment.email, :size=>50)) +
  20 + 'data-gravatar'=>gravatar_profile_image_url(comment.email, :size=>50)) +
21 21 content_tag('span', comment.author_name, :class => 'comment-info') +
22 22 content_tag('span', comment.message,
23 23 :class => 'comment-user-status ' + status_class),
... ...
app/views/profile/_comment.rhtml
... ... @@ -16,11 +16,11 @@
16 16 <% else %>
17 17 <% url_image, status_class = comment.author_id ?
18 18 [comment.removed_user_image, 'icon-user-removed'] :
19   - [str_gravatar_url_for( comment.email ), 'icon-user-unknown'] %>
  19 + [gravatar_profile_image_url( comment.email ), 'icon-user-unknown'] %>
20 20  
21 21 <%= link_to(
22 22 image_tag(url_image, :onerror=>'gravatarCommentFailback(this)',
23   - 'data-gravatar'=>str_gravatar_url_for(comment.email)) +
  23 + 'data-gravatar'=>gravatar_profile_image_url(comment.email)) +
24 24 content_tag('span', comment.author_name, :class => 'comment-info') +
25 25 content_tag('span', comment.message,
26 26 :class => 'comment-user-status comment-user-status-wall ' + status_class),
... ...
app/views/search/_comment.rhtml
... ... @@ -8,7 +8,7 @@
8 8 <%# unauthenticated user: display gravatar icon %>
9 9 <%= content_tag 'span', '&nbsp;',
10 10 :class => 'comment-picture',
11   - :style => 'background-image:url(%s)' % str_gravatar_url_for( comment.email, :size => 20 )
  11 + :style => 'background-image:url(%s)' % gravatar_profile_image_url( comment.email, :size => 20 )
12 12 %>
13 13 <%- end %>
14 14 <strong><%= link_to(comment.title, comment.url) %></strong>
... ...
lib/noosfero/gravatar.rb 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +module Noosfero::Gravatar
  2 + def gravatar_profile_image_url(email, options = {})
  3 + "http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(email.to_s)}?" + {
  4 + :only_path => false,
  5 + }.merge(options).map{|k,v| '%s=%s' % [ k,v ] }.join('&')
  6 + end
  7 +
  8 + def gravatar_profile_url(email)
  9 + 'http://www.gravatar.com/'+ Digest::MD5.hexdigest(email.to_s)
  10 + end
  11 +end
... ...
test/unit/application_helper_test.rb
... ... @@ -466,32 +466,19 @@ class ApplicationHelperTest &lt; ActiveSupport::TestCase
466 466 assert_match(/Community nick/, page_title)
467 467 end
468 468  
469   - should 'generate a gravatar image url' do
470   - stubs(:environment).returns(Environment.default)
471   - @controller = ApplicationController.new
472   -
  469 + should 'gravatar default parameter' do
  470 + profile = mock
  471 + profile.stubs(:theme).returns('some-theme')
  472 + stubs(:profile).returns(profile)
473 473 with_constants :NOOSFERO_CONF => {'gravatar' => 'crazyvatar'} do
474   - url = str_gravatar_url_for( 'rms@gnu.org', :size => 50 )
475   - assert_match(/^http:\/\/www\.gravatar\.com\/avatar\.php\?/, url)
476   - assert_match(/(\?|&)gravatar_id=ed5214d4b49154ba0dc397a28ee90eb7(&|$)/, url)
477   - assert_match(/(\?|&)d=crazyvatar(&|$)/, url)
478   - assert_match(/(\?|&)size=50(&|$)/, url)
  474 + assert_equal gravatar_default, 'crazyvatar'
479 475 end
480 476 stubs(:theme_option).returns('gravatar' => 'nicevatar')
481 477 with_constants :NOOSFERO_CONF => {'gravatar' => 'crazyvatar'} do
482   - url = str_gravatar_url_for( 'rms@gnu.org', :size => 50 )
483   - assert_match(/^http:\/\/www\.gravatar\.com\/avatar\.php\?/, url)
484   - assert_match(/(\?|&)gravatar_id=ed5214d4b49154ba0dc397a28ee90eb7(&|$)/, url)
485   - assert_match(/(\?|&)d=nicevatar(&|$)/, url)
486   - assert_match(/(\?|&)size=50(&|$)/, url)
  478 + assert_equal gravatar_default, 'nicevatar'
487 479 end
488 480 end
489 481  
490   - should 'generate a gravatar profile url' do
491   - url = gravatar_profile_url( 'rms@gnu.org' )
492   - assert_equal('http://www.gravatar.com/ed5214d4b49154ba0dc397a28ee90eb7', url)
493   - end
494   -
495 482 should 'use theme passed via param when in development mode' do
496 483 stubs(:environment).returns(Environment.new(:theme => 'environment-theme'))
497 484 ENV.stubs(:[]).with('RAILS_ENV').returns('development')
... ...
test/unit/gravatar_test.rb 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class GravatarTest < ActiveSupport::TestCase
  4 +
  5 + def setup
  6 + @object = Object.new
  7 + @object.extend(Noosfero::Gravatar)
  8 + end
  9 +
  10 + should 'generate a gravatar image url' do
  11 + url = @object.gravatar_profile_image_url( 'rms@gnu.org', :size => 50, :d => 'crazyvatar' )
  12 + assert_match(/^http:\/\/www\.gravatar\.com\/avatar\/ed5214d4b49154ba0dc397a28ee90eb7?/, url)
  13 + assert_match(/(\?|&)d=crazyvatar(&|$)/, url)
  14 + assert_match(/(\?|&)size=50(&|$)/, url)
  15 +
  16 + url = @object.gravatar_profile_image_url( 'rms@gnu.org', :size => 50, :d => 'nicevatar' )
  17 + assert_match(/^http:\/\/www\.gravatar\.com\/avatar\/ed5214d4b49154ba0dc397a28ee90eb7?/, url)
  18 + assert_match(/(\?|&)d=nicevatar(&|$)/, url)
  19 + assert_match(/(\?|&)size=50(&|$)/, url)
  20 + end
  21 +
  22 + should 'generate a gravatar profile url' do
  23 + url = @object.gravatar_profile_url( 'rms@gnu.org' )
  24 + assert_equal('http://www.gravatar.com/ed5214d4b49154ba0dc397a28ee90eb7', url)
  25 + end
  26 +end
... ...
test/unit/user_test.rb
... ... @@ -336,10 +336,22 @@ class UserTest &lt; ActiveSupport::TestCase
336 336 Person.any_instance.stubs(:is_admin?).returns(true)
337 337 Person.any_instance.stubs(:created_at).returns(DateTime.parse('16-08-2010'))
338 338 expected_hash = {
339   - 'login' => 'x_and_y', 'is_admin' => true, 'since_month' => 8, 'chat_enabled' => false, 'since_year' => 2010, 'email_domain' => nil, 'amount_of_friends' => 0,
  339 + 'login' => 'x_and_y', 'is_admin' => true, 'since_month' => 8,
  340 + 'chat_enabled' => false, 'since_year' => 2010, 'avatar' =>
  341 + 'http://www.gravatar.com/avatar/a0517761d5125820c28d87860bc7c02e?only_path=false&d=&size=20',
  342 + 'email_domain' => nil, 'amount_of_friends' => 0,
340 343 'friends_list' => {}, 'enterprises' => [],
341 344 }
342   - assert_equal expected_hash, person.user.data_hash
  345 +
  346 + assert_equal expected_hash['login'], person.user.data_hash['login']
  347 + assert_equal expected_hash['is_admin'], person.user.data_hash['is_admin']
  348 + assert_equal expected_hash['since_month'], person.user.data_hash['since_month']
  349 + assert_equal expected_hash['chat_enabled'], person.user.data_hash['chat_enabled']
  350 + assert_equal expected_hash['since_year'], person.user.data_hash['since_year']
  351 + assert_equal expected_hash['avatar'], person.user.data_hash['avatar']
  352 + assert_equal expected_hash['email_domain'], person.user.data_hash['email_domain']
  353 + assert_equal expected_hash['amount_of_friends'], person.user.data_hash['amount_of_friends']
  354 + assert_equal expected_hash['friends_list'], person.user.data_hash['friends_list']
343 355 end
344 356  
345 357 should "data_hash return the friends_list information" do
... ...