Commit 844304db138e2c7bb6234be39301f054b7a657cb
1 parent
fb93be11
Exists in
master
and in
29 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 |