Commit 92273fb259c123c5db4165225eb7e81f9a00c560

Authored by Antonio Terceiro
2 parents 1590b7c0 14694fe0

Merge branch 'master' into rails-2.3.5

Showing 23 changed files with 171 additions and 0 deletions   Show diff stats
app/views/layouts/application-ng.rhtml
@@ -27,6 +27,11 @@ @@ -27,6 +27,11 @@
27 <%= javascript_src_tag plugin.class.public_path(js_file), {} %> 27 <%= javascript_src_tag plugin.class.public_path(js_file), {} %>
28 <% end %> 28 <% end %>
29 <% end %> 29 <% end %>
  30 + <%=
  31 + @plugins.map(:head_ending).collect do |content|
  32 + content.respond_to?(:call) ? content.call : content
  33 + end.join('\n')
  34 + %>
30 </head> 35 </head>
31 <body class="<%= 36 <body class="<%=
32 # Identify the current controller and action for the CSS: 37 # Identify the current controller and action for the CSS:
app/views/profile_editor/edit.rhtml
@@ -75,6 +75,12 @@ @@ -75,6 +75,12 @@
75 75
76 <%= select_categories(:profile_data, _('Select the categories of your interest'), 2) %> 76 <%= select_categories(:profile_data, _('Select the categories of your interest'), 2) %>
77 77
  78 + <%=
  79 + @plugins.map(:profile_editor_extras).each do |content|
  80 + content.respond_to?(:call) ? content.call : content
  81 + end.join("\n")
  82 + %>
  83 +
78 <% button_bar do %> 84 <% button_bar do %>
79 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %> 85 <%= submit_button('save', _('Save'), :cancel => {:action => 'index'}) %>
80 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %> 86 <%= button(:back, _('Back to control panel'), :controller => 'profile_editor') %>
lib/noosfero/plugin.rb
@@ -108,6 +108,12 @@ class Noosfero::Plugin @@ -108,6 +108,12 @@ class Noosfero::Plugin
108 nil 108 nil
109 end 109 end
110 110
  111 + # -> Adds content to profile editor info and settings
  112 + # returns = lambda block that creates html code or raw rhtml/html.erb
  113 + def profile_editor_extras
  114 + nil
  115 + end
  116 +
111 # -> Adds content to calalog list item 117 # -> Adds content to calalog list item
112 # returns = lambda block that creates a html code 118 # returns = lambda block that creates a html code
113 def catalog_list_item_extras(item) 119 def catalog_list_item_extras(item)
@@ -140,6 +146,12 @@ class Noosfero::Plugin @@ -140,6 +146,12 @@ class Noosfero::Plugin
140 nil 146 nil
141 end 147 end
142 148
  149 + # -> Adds content to the ending of the page head
  150 + # returns = lambda block that creates html code or raw rhtml/html.erb
  151 + def head_ending
  152 + nil
  153 + end
  154 +
143 # -> Adds plugins' javascript files to application 155 # -> Adds plugins' javascript files to application
144 # returns = ['example1.js', 'javascripts/example2.js', 'example3.js'] 156 # returns = ['example1.js', 'javascripts/example2.js', 'example3.js']
145 def js_files 157 def js_files
plugins/google_analytics/doc/google_analytics.textile 0 → 100644
@@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
  1 +h1. Google Analytics
  2 +
  3 +Tracking and web analytics to people and communities.
  4 +
  5 +h2. Usage
  6 +
  7 +* Create a "Google Analytics":http://www.google.com/analytics/ account
  8 +* Configure your Google Analytics account following these steps
  9 +
  10 +!=/plugins/google_analytics/images/doc/google-analytics-setup-step1.en.png(Google Setup - Step 1)!
  11 +
  12 +!=/plugins/google_analytics/images/doc/google-analytics-setup-step2.en.png(Google Setup - Step 2)!
  13 +
  14 +!=/plugins/google_analytics/images/doc/google-analytics-setup-step3.en.png(Google Setup - Step 3)!
  15 +
  16 +!=/plugins/google_analytics/images/doc/google-analytics-setup-step4.en.png(Google Setup - Step 4)!
  17 +
  18 +!=/plugins/google_analytics/images/doc/google-analytics-setup-step5.en.png(Google Setup - Step 5)!
  19 +
  20 +!=/plugins/google_analytics/images/doc/google-analytics-setup-step6.en.png(Google Setup - Step 6)!
  21 +
  22 +* Take note of your Google Analytics Profile ID
  23 +* Login to Noosfero and go to your control panel
  24 +* Follow Profile Info and Settings and fill in Google Analytics Profile ID
  25 +
  26 +h2. Info
  27 +
  28 +* "Google Analytics Support":http://support.google.com/analytics
plugins/google_analytics/lib/ext/profile.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +require_dependency 'profile'
  2 +
  3 +class Profile
  4 + settings_items :google_analytics_profile_id
  5 +end
plugins/google_analytics/lib/google_analytics_plugin.rb 0 → 100644
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +require_dependency 'ext/profile'
  2 +
  3 +class GoogleAnalyticsPlugin < Noosfero::Plugin
  4 +
  5 + include ActionView::Helpers::JavaScriptHelper
  6 + include ActionView::Helpers::FormHelper
  7 + include ApplicationHelper
  8 +
  9 + def self.plugin_name
  10 + "Google Analytics"
  11 + end
  12 +
  13 + def self.plugin_description
  14 + _("Tracking and web analytics to people and communities")
  15 + end
  16 +
  17 + def profile_id
  18 + context.profile && context.profile.data[:google_analytics_profile_id]
  19 + end
  20 +
  21 + def head_ending
  22 + unless profile_id.blank?
  23 + expanded_template('tracking-code.rhtml',{:profile_id => profile_id})
  24 + end
  25 + end
  26 +
  27 + def profile_editor_extras
  28 + labelled_form_field(_('Google Analytics Profile ID'), text_field(:profile_data, :google_analytics_profile_id, :value => context.profile.google_analytics_profile_id))
  29 + end
  30 +
  31 +end
plugins/google_analytics/public/images/doc/google-analytics-setup-step1.en.png 0 → 100644

107 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step1.pt.png 0 → 100644

116 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step2.en.png 0 → 100644

65.5 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step2.pt.png 0 → 100644

86.2 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step3.en.png 0 → 100644

38.7 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step3.pt.png 0 → 100644

56 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step4.en.png 0 → 100644

116 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step4.pt.png 0 → 100644

119 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step5.en.png 0 → 100644

75.4 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step5.pt.png 0 → 100644

83.2 KB

plugins/google_analytics/public/images/doc/google-analytics-setup-step6.en.png 0 → 100644

74.6 KB

plugins/google_analytics/test/unit/google_analytics_plugin_test.rb 0 → 100644
@@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +
  3 +class GoogleAnalyticsPluginTest < Test::Unit::TestCase
  4 +
  5 + def setup
  6 + @plugin = GoogleAnalyticsPlugin.new
  7 + @context = mock()
  8 + @profile = mock()
  9 + @profile.stubs(:data).returns({:google_analytics_profile_id => 10})
  10 + @profile.stubs(:google_analytics_profile_id).returns(10)
  11 + @plugin.context = @context
  12 + @context.stubs(:profile).returns(@profile)
  13 + end
  14 +
  15 + should 'return profile_id nil if not in profile context' do
  16 + @context.stubs(:profile).returns(nil)
  17 + assert_nil @plugin.profile_id
  18 + end
  19 +
  20 + should 'return profile_id if in profile context' do
  21 + assert_not_nil @plugin.profile_id
  22 + assert_equal 10, @plugin.profile_id
  23 + end
  24 +
  25 + should 'add content at HTML head if profile_id not nil' do
  26 + @plugin.expects(:expanded_template).once.returns('content')
  27 + assert_equal 'content', @plugin.head_ending
  28 + end
  29 +
  30 + should 'add extra fields to profile editor info and settings' do
  31 + assert_tag_in_string @plugin.profile_editor_extras,
  32 + :tag => 'input', :attributes => {:id => 'profile_data_google_analytics_profile_id', :value => 10}
  33 + end
  34 +
  35 + should 'extends Profile with attr google_analytics_profile_id' do
  36 + assert_respond_to Profile.new, :google_analytics_profile_id
  37 + end
  38 +end
plugins/google_analytics/views/tracking-code.rhtml 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +<script type="text/javascript">
  2 + var _gaq = _gaq || [];
  3 + _gaq.push(['_setAccount', '<%= escape_javascript locals[:profile_id] %>']);
  4 + _gaq.push(['_trackPageview']);
  5 + (function() {
  6 + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  7 + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  8 + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  9 + })();
  10 +</script>
test/functional/admin_panel_controller_test.rb
@@ -349,6 +349,7 @@ class AdminPanelControllerTest &lt; ActionController::TestCase @@ -349,6 +349,7 @@ class AdminPanelControllerTest &lt; ActionController::TestCase
349 plugins.stubs(:map).with(:admin_panel_links).returns(links) 349 plugins.stubs(:map).with(:admin_panel_links).returns(links)
350 plugins.stubs(:enabled_plugins).returns([]) 350 plugins.stubs(:enabled_plugins).returns([])
351 plugins.stubs(:map).with(:body_beginning).returns([]) 351 plugins.stubs(:map).with(:body_beginning).returns([])
  352 + plugins.stubs(:map).with(:head_ending).returns([])
352 Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 353 Noosfero::Plugin::Manager.stubs(:new).returns(plugins)
353 354
354 get :index 355 get :index
test/functional/application_controller_test.rb
@@ -400,6 +400,7 @@ class ApplicationControllerTest &lt; ActionController::TestCase @@ -400,6 +400,7 @@ class ApplicationControllerTest &lt; ActionController::TestCase
400 plugins = mock() 400 plugins = mock()
401 plugins.stubs(:enabled_plugins).returns([]) 401 plugins.stubs(:enabled_plugins).returns([])
402 plugins.stubs(:map).with(:body_beginning).returns(contents) 402 plugins.stubs(:map).with(:body_beginning).returns(contents)
  403 + plugins.stubs(:map).with(:head_ending).returns([])
403 Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 404 Noosfero::Plugin::Manager.stubs(:new).returns(plugins)
404 405
405 get :index 406 get :index
@@ -408,6 +409,24 @@ class ApplicationControllerTest &lt; ActionController::TestCase @@ -408,6 +409,24 @@ class ApplicationControllerTest &lt; ActionController::TestCase
408 assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'} 409 assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'}
409 end 410 end
410 411
  412 + should 'include content in the ending of head supplied by plugins regardless it is a block or html code' do
  413 + plugin1_local_variable = "Plugin1"
  414 + plugin1_content = lambda {"<script>alert('This is #{plugin1_local_variable} speaking!')</script>"}
  415 + plugin2_content = "<style>This is Plugin2 speaking!</style>"
  416 + contents = [plugin1_content, plugin2_content]
  417 +
  418 + plugins = mock()
  419 + plugins.stubs(:enabled_plugins).returns([])
  420 + plugins.stubs(:map).with(:head_ending).returns(contents)
  421 + plugins.stubs(:map).with(:body_beginning).returns([])
  422 + Noosfero::Plugin::Manager.stubs(:new).returns(plugins)
  423 +
  424 + get :index
  425 +
  426 + assert_tag :tag => 'script', :content => "alert('This is #{plugin1_local_variable} speaking!')"
  427 + assert_tag :tag => 'style', :content => 'This is Plugin2 speaking!'
  428 + end
  429 +
411 if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL' 430 if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
412 431
413 should 'change postgresql schema' do 432 should 'change postgresql schema' do
test/functional/manage_products_controller_test.rb
@@ -446,6 +446,7 @@ class ManageProductsControllerTest &lt; ActionController::TestCase @@ -446,6 +446,7 @@ class ManageProductsControllerTest &lt; ActionController::TestCase
446 plugins = mock() 446 plugins = mock()
447 plugins.stubs(:enabled_plugins).returns([]) 447 plugins.stubs(:enabled_plugins).returns([])
448 plugins.stubs(:map).with(:body_beginning).returns([]) 448 plugins.stubs(:map).with(:body_beginning).returns([])
  449 + plugins.stubs(:map).with(:head_ending).returns([])
449 plugins.stubs(:map).with(:product_info_extras, product).returns(contents) 450 plugins.stubs(:map).with(:product_info_extras, product).returns(contents)
450 Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 451 Noosfero::Plugin::Manager.stubs(:new).returns(plugins)
451 452
test/functional/profile_editor_controller_test.rb
@@ -869,6 +869,7 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase @@ -869,6 +869,7 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
869 plugins.stubs(:map).with(:control_panel_buttons).returns(buttons) 869 plugins.stubs(:map).with(:control_panel_buttons).returns(buttons)
870 plugins.stubs(:enabled_plugins).returns([]) 870 plugins.stubs(:enabled_plugins).returns([])
871 plugins.stubs(:map).with(:body_beginning).returns([]) 871 plugins.stubs(:map).with(:body_beginning).returns([])
  872 + plugins.stubs(:map).with(:head_ending).returns([])
872 Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 873 Noosfero::Plugin::Manager.stubs(:new).returns(plugins)
873 874
874 get :index, :profile => profile.identifier 875 get :index, :profile => profile.identifier
@@ -877,4 +878,18 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase @@ -877,4 +878,18 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
877 assert_tag :tag => 'a', :content => plugin2_button[:title], :attributes => {:class => /#{plugin2_button[:icon]}/, :href => /#{plugin2_button[:url]}/} 878 assert_tag :tag => 'a', :content => plugin2_button[:title], :attributes => {:class => /#{plugin2_button[:icon]}/, :href => /#{plugin2_button[:url]}/}
878 end 879 end
879 880
  881 + should 'add extra content provided by plugins on edit' do
  882 + plugin1_content = "<input id='field_added_by_plugin' value='value_of_field_added_by_plugin'/>"
  883 + plugins = mock()
  884 + plugins.stubs(:enabled_plugins).returns([])
  885 + plugins.stubs(:map).with(:profile_editor_extras).returns([plugin1_content])
  886 + plugins.stubs(:map).with(:head_ending).returns([])
  887 + plugins.stubs(:map).with(:body_beginning).returns([])
  888 + Noosfero::Plugin::Manager.stubs(:new).returns(plugins)
  889 +
  890 + get :edit, :profile => profile.identifier
  891 +
  892 + assert_tag :tag => 'input', :attributes => {:id => 'field_added_by_plugin', :value => 'value_of_field_added_by_plugin'}
  893 + end
  894 +
880 end 895 end