Commit 844304db138e2c7bb6234be39301f054b7a657cb
1 parent
fb93be11
Exists in
master
and in
22 other branches
Plugins can provide additional search fields for invites
Showing
5 changed files
with
50 additions
and
2 deletions
Show diff stats
app/controllers/public/invite_controller.rb
| @@ -74,8 +74,11 @@ class InviteController < PublicController | @@ -74,8 +74,11 @@ class InviteController < PublicController | ||
| 74 | end | 74 | end |
| 75 | end | 75 | end |
| 76 | 76 | ||
| 77 | + include InviteHelper | ||
| 78 | + helper :invite | ||
| 79 | + | ||
| 77 | def search_friend | 80 | def search_friend |
| 78 | - fields = %w[name identifier email] | 81 | + fields = %w[name identifier email] + plugins_options.map {|field| field[:field].to_s } |
| 79 | values = ["%#{params['q']}%"] * fields.count | 82 | values = ["%#{params['q']}%"] * fields.count |
| 80 | render :text => environment.people.find(:all, :joins => ['INNER JOIN users ON profiles.user_id=users.id'], :conditions => [fields.map {|field| "LOWER(#{field}) LIKE ?"}.join(' OR '), *values]). | 83 | render :text => environment.people.find(:all, :joins => ['INNER JOIN users ON profiles.user_id=users.id'], :conditions => [fields.map {|field| "LOWER(#{field}) LIKE ?"}.join(' OR '), *values]). |
| 81 | map {|person| {:id => person.id, :name => person.name} }.to_json | 84 | map {|person| {:id => person.id, :name => person.name} }.to_json |
app/helpers/invite_helper.rb
| 1 | module InviteHelper | 1 | module InviteHelper |
| 2 | + def plugins_options | ||
| 3 | + @plugins.dispatch(:search_friend_fields) | ||
| 4 | + end | ||
| 5 | + | ||
| 6 | + def search_friend_fields | ||
| 7 | + labels = [ | ||
| 8 | + _('Name'), | ||
| 9 | + _('Username'), | ||
| 10 | + _('Email'), | ||
| 11 | + ] + plugins_options.map { |options| options[:name] } | ||
| 12 | + | ||
| 13 | + last = labels.pop | ||
| 14 | + label = labels.join(', ') | ||
| 15 | + "#{label} #{_('or')} #{last}" | ||
| 16 | + end | ||
| 2 | end | 17 | end |
app/views/invite/invite_friends.rhtml
| @@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
| 12 | <% form_tag :action => 'invite_registered_friend' do %> | 12 | <% form_tag :action => 'invite_registered_friend' do %> |
| 13 | <% search_action = url_for(:action => 'search_friend') %> | 13 | <% search_action = url_for(:action => 'search_friend') %> |
| 14 | <%= token_input_field_tag(:q, 'search-friends', search_action, | 14 | <%= token_input_field_tag(:q, 'search-friends', search_action, |
| 15 | - { :hint_text => _('Type in a search for your friend'), | 15 | + { :hint_text => _('Type in your friend\'s ') + search_friend_fields, |
| 16 | :focus => false }) %> | 16 | :focus => false }) %> |
| 17 | 17 | ||
| 18 | <%= render :partial => 'invite/personalize_invitation_mail', :locals => {:mail_template => @mail_template } %> | 18 | <%= render :partial => 'invite/personalize_invitation_mail', :locals => {:mail_template => @mail_template } %> |
lib/noosfero/plugin.rb
| @@ -437,6 +437,12 @@ class Noosfero::Plugin | @@ -437,6 +437,12 @@ class Noosfero::Plugin | ||
| 437 | nil | 437 | nil |
| 438 | end | 438 | end |
| 439 | 439 | ||
| 440 | + # -> Adds aditional fields for invite_friends search | ||
| 441 | + # returns = [{:field => 'field1', :name => 'field 1 name'}, {...}] | ||
| 442 | + def search_friend_fields | ||
| 443 | + nil | ||
| 444 | + end | ||
| 445 | + | ||
| 440 | # -> Adds additional blocks to profiles and environments. | 446 | # -> Adds additional blocks to profiles and environments. |
| 441 | # Your plugin must implements a class method called 'extra_blocks' | 447 | # Your plugin must implements a class method called 'extra_blocks' |
| 442 | # that returns a hash with the following syntax. | 448 | # that returns a hash with the following syntax. |
test/functional/invite_controller_test.rb
| @@ -255,6 +255,30 @@ class InviteControllerTest < ActionController::TestCase | @@ -255,6 +255,30 @@ class InviteControllerTest < ActionController::TestCase | ||
| 255 | assert_equal [{"name" => friend1.name, "id" => friend1.id}, {"name" => friend2.name, "id" => friend2.id}].to_json, @response.body | 255 | assert_equal [{"name" => friend1.name, "id" => friend1.id}, {"name" => friend2.name, "id" => friend2.id}].to_json, @response.body |
| 256 | end | 256 | end |
| 257 | 257 | ||
| 258 | + should 'search friends profiles by fields provided by plugins' do | ||
| 259 | + class Plugin1 < Noosfero::Plugin | ||
| 260 | + def search_friend_fields | ||
| 261 | + [{:field => 'nickname'}, {:field => 'contact_phone'}] | ||
| 262 | + end | ||
| 263 | + end | ||
| 264 | + | ||
| 265 | + environment = Environment.default | ||
| 266 | + environment.enable_plugin(Plugin1) | ||
| 267 | + | ||
| 268 | + friend1 = create_user('harry').person | ||
| 269 | + friend2 = create_user('william').person | ||
| 270 | + friend1.nickname = 'prince' | ||
| 271 | + friend2.contact_phone = '2222' | ||
| 272 | + friend1.save | ||
| 273 | + friend2.save | ||
| 274 | + | ||
| 275 | + get :search_friend, :profile => profile.identifier, :q => 'prince' | ||
| 276 | + assert_equal [{"name" => friend1.name, "id" => friend1.id}].to_json, @response.body | ||
| 277 | + | ||
| 278 | + get :search_friend, :profile => profile.identifier, :q => '222' | ||
| 279 | + assert_equal [{"name" => friend2.name, "id" => friend2.id}].to_json, @response.body | ||
| 280 | + end | ||
| 281 | + | ||
| 258 | should 'invite registered users through profile id' do | 282 | should 'invite registered users through profile id' do |
| 259 | friend1 = create_user('testuser1').person | 283 | friend1 = create_user('testuser1').person |
| 260 | friend2 = create_user('testuser2').person | 284 | friend2 = create_user('testuser2').person |