Commit 449ea30f10f1a8bab798638d441e750f400d05a5

Authored by Rodrigo Souto
1 parent 89830abf

gov-user: make communities_block extensions through proper hotspots

Closes #408
src/noosfero-spb/gov_user/lib/ext/communities_block.rb
@@ -1,45 +0,0 @@ @@ -1,45 +0,0 @@
1 -require_dependency 'communities_block'  
2 -  
3 -class CommunitiesBlock  
4 -  
5 - def profile_list  
6 - result = get_visible_profiles  
7 - result.slice(0..get_limit-1)  
8 - end  
9 -  
10 - def profile_count  
11 - profile_list.count  
12 - end  
13 -  
14 - private  
15 -  
16 - def get_visible_profiles  
17 - visible_profiles = profiles.visible.includes(  
18 - [:image,:domains,:preferred_domain,:environment]  
19 - )  
20 -  
21 - delete_communities = []  
22 - valid_communities_string = Community.get_valid_communities_string  
23 - Community.all.each{|community| delete_communities << community.id unless eval(valid_communities_string)}  
24 -  
25 - visible_profiles = visible_profiles.where(["profiles.id NOT IN (?)", delete_communities]) unless delete_communities.empty?  
26 -  
27 - if !prioritize_profiles_with_image  
28 - return visible_profiles.all(  
29 - :limit => get_limit,  
30 - :order => 'profiles.updated_at DESC'  
31 - ).sort_by {rand}  
32 - elsif profiles.visible.with_image.count >= get_limit  
33 - return visible_profiles.with_image.all(  
34 - :limit => get_limit * 5,  
35 - :order => 'profiles.updated_at DESC'  
36 - ).sort_by {rand}  
37 - else  
38 - visible_profiles = visible_profiles.with_image.sort_by {rand} +  
39 - visible_profiles.without_image.all(  
40 - :limit => get_limit * 5, :order => 'profiles.updated_at DESC'  
41 - ).sort_by {rand}  
42 - return visible_profiles  
43 - end  
44 - end  
45 -end  
src/noosfero-spb/gov_user/lib/ext/community.rb
@@ -6,20 +6,4 @@ class Community @@ -6,20 +6,4 @@ class Community
6 def institution? 6 def institution?
7 return !institution.nil? 7 return !institution.nil?
8 end 8 end
9 -  
10 - def remove_of_community_search_institution?  
11 - return institution?  
12 - end  
13 -  
14 - def self.get_valid_communities_string  
15 - remove_of_communities_methods = Community.instance_methods.select{|m| m =~ /remove_of_community_search/}  
16 - valid_communities_string = "!("  
17 - remove_of_communities_methods.each do |method|  
18 - valid_communities_string += "community.send('#{method}') || "  
19 - end  
20 - valid_communities_string = valid_communities_string[0..-5]  
21 - valid_communities_string += ")"  
22 -  
23 - valid_communities_string  
24 - end  
25 end 9 end
src/noosfero-spb/gov_user/lib/gov_user_plugin.rb
@@ -252,18 +252,10 @@ class GovUserPlugin &lt; Noosfero::Plugin @@ -252,18 +252,10 @@ class GovUserPlugin &lt; Noosfero::Plugin
252 end 252 end
253 253
254 def filter_search_scope(scope, asset) 254 def filter_search_scope(scope, asset)
255 - # Select only communities that are not related to any institution.  
256 if asset.to_s == 'communities' 255 if asset.to_s == 'communities'
257 - scope = scope.joins('LEFT OUTER JOIN gov_user_plugin_institutions as institutions  
258 - ON profiles.id = institutions.community_id').  
259 - where('institutions.community_id IS NULL')  
260 - return [scope, asset]  
261 - # Select only communities that are related to an institution. 256 + return [filter_communities(scope), asset]
262 elsif asset.to_s == 'gov_user_plugin/institutions' 257 elsif asset.to_s == 'gov_user_plugin/institutions'
263 - scope = scope.joins('INNER JOIN gov_user_plugin_institutions as institutions  
264 - ON profiles.id = institutions.community_id')  
265 - return [scope, asset]  
266 - # Go with the flow. 258 + return [filter_institutions(scope), asset]
267 else 259 else
268 return [scope, asset] 260 return [scope, asset]
269 end 261 end
@@ -282,6 +274,16 @@ class GovUserPlugin &lt; Noosfero::Plugin @@ -282,6 +274,16 @@ class GovUserPlugin &lt; Noosfero::Plugin
282 [{:name => 'institution', :block => block, :common_profile_list_block => class_name_underscored}] 274 [{:name => 'institution', :block => block, :common_profile_list_block => class_name_underscored}]
283 end 275 end
284 276
  277 + def filter_profile_list_block_scope(scope, klass)
  278 + if klass == CommunitiesBlock
  279 + return [filter_communities(scope), klass]
  280 + elsif klass == GovUserPlugin::InstitutionsBlock
  281 + return [filter_institutions(scope), klass]
  282 + else
  283 + return [scope, klass]
  284 + end
  285 + end
  286 +
285 private 287 private
286 288
287 def call_model_transaction(model,name) 289 def call_model_transaction(model,name)
@@ -349,15 +351,28 @@ class GovUserPlugin &lt; Noosfero::Plugin @@ -349,15 +351,28 @@ class GovUserPlugin &lt; Noosfero::Plugin
349 } 351 }
350 end 352 end
351 353
352 - def update_user_institutions(user)  
353 - context.params[:user][:institution_ids].each do |institution_id|  
354 - institution = GovUserPlugin::Institution.find institution_id  
355 - user.institutions << institution 354 + def update_user_institutions(user)
  355 + context.params[:user][:institution_ids].each do |institution_id|
  356 + institution = GovUserPlugin::Institution.find institution_id
  357 + user.institutions << institution
356 358
357 - if institution.community.admins.blank?  
358 - institution.community.add_admin(user.person)  
359 - end 359 + if institution.community.admins.blank?
  360 + institution.community.add_admin(user.person)
360 end 361 end
361 - user.save unless user.institution_ids.empty?  
362 end 362 end
  363 + user.save unless user.institution_ids.empty?
  364 + end
  365 +
  366 + # Select only communities that are not related to any institution.
  367 + def filter_communities(scope)
  368 + scope.joins('LEFT OUTER JOIN gov_user_plugin_institutions as institutions
  369 + ON profiles.id = institutions.community_id').
  370 + where('institutions.community_id IS NULL')
  371 + end
  372 +
  373 + # Select only communities that are related to an institution.
  374 + def filter_institutions(scope)
  375 + scope.joins('INNER JOIN gov_user_plugin_institutions as institutions
  376 + ON profiles.id = institutions.community_id')
  377 + end
363 end 378 end
src/noosfero-spb/gov_user/lib/gov_user_plugin/institutions_block.rb
@@ -3,10 +3,6 @@ class GovUserPlugin::InstitutionsBlock &lt; CommunitiesBlock @@ -3,10 +3,6 @@ class GovUserPlugin::InstitutionsBlock &lt; CommunitiesBlock
3 _('Institutions') 3 _('Institutions')
4 end 4 end
5 5
6 - def profile_count  
7 - profile_list.count  
8 - end  
9 -  
10 def default_title 6 def default_title
11 n_('{#} institution', '{#} institutions', profile_count) 7 n_('{#} institution', '{#} institutions', profile_count)
12 end 8 end
@@ -33,38 +29,4 @@ class GovUserPlugin::InstitutionsBlock &lt; CommunitiesBlock @@ -33,38 +29,4 @@ class GovUserPlugin::InstitutionsBlock &lt; CommunitiesBlock
33 '' 29 ''
34 end 30 end
35 end 31 end
36 -  
37 - def profile_list  
38 - result = get_visible_profiles  
39 -  
40 - result = result.select { |p| p.class == Community && p.institution? }  
41 -  
42 - result.slice(0..get_limit-1)  
43 - end  
44 -  
45 - def profiles  
46 - owner.communities  
47 - end  
48 -  
49 - private  
50 -  
51 - def get_visible_profiles  
52 - include_list = [:image,:domains,:preferred_domain,:environment]  
53 - visible_profiles = profiles.visible.includes(include_list)  
54 -  
55 - if !prioritize_profiles_with_image  
56 - visible_profiles.all(:limit => get_limit,  
57 - :order => 'profiles.updated_at DESC'  
58 - ).sort_by{ rand }  
59 - elsif profiles.visible.with_image.count >= get_limit  
60 - visible_profiles.with_image.all(:limit => get_limit * 5,  
61 - :order => 'profiles.updated_at DESC'  
62 - ).sort_by{ rand }  
63 - else  
64 - visible_profiles.with_image.sort_by{ rand } +  
65 - visible_profiles.without_image.all(:limit => get_limit * 5,  
66 - :order => 'profiles.updated_at DESC'  
67 - ).sort_by{ rand }  
68 - end  
69 - end  
70 end 32 end
src/noosfero-spb/gov_user/test/unit/communities_block.rb 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../helpers/institution_test_helper'
  3 +
  4 +class CommunitiesBlockTest < ActiveSupport::TestCase
  5 + def setup
  6 + environment = Environment.default
  7 + environment.enable_plugin(GovUserPlugin)
  8 + end
  9 +
  10 + should 'not list instutitions' do
  11 + person = create_user('some-user').person
  12 + institution = InstitutionTestHelper.create_private_institution("inst name", "IN", "country", "state",
  13 + "city", "00.111.222/3333-44")
  14 + community = fast_create(Community)
  15 + institution.community.add_member(person)
  16 + community.add_member(person)
  17 +
  18 + block = CommunitiesBlock.new
  19 + block.expects(:owner).at_least_once.returns(person)
  20 +
  21 + assert_equivalent block.profiles, [community]
  22 + end
  23 +end
src/noosfero-spb/gov_user/test/unit/gov_user_plugin/institutions_block_test.rb
@@ -2,6 +2,11 @@ require File.dirname(__FILE__) + &#39;/../../../../../test/test_helper&#39; @@ -2,6 +2,11 @@ require File.dirname(__FILE__) + &#39;/../../../../../test/test_helper&#39;
2 require File.dirname(__FILE__) + '/../../helpers/plugin_test_helper' 2 require File.dirname(__FILE__) + '/../../helpers/plugin_test_helper'
3 3
4 class GovUserPlugin::InstitutionsBlockTest < ActiveSupport::TestCase 4 class GovUserPlugin::InstitutionsBlockTest < ActiveSupport::TestCase
  5 + def setup
  6 + environment = Environment.default
  7 + environment.enable_plugin(GovUserPlugin)
  8 + end
  9 +
5 include PluginTestHelper 10 include PluginTestHelper
6 should 'inherit from Block' do 11 should 'inherit from Block' do
7 assert_kind_of Block, GovUserPlugin::InstitutionsBlock.new 12 assert_kind_of Block, GovUserPlugin::InstitutionsBlock.new
@@ -48,4 +53,26 @@ class GovUserPlugin::InstitutionsBlockTest &lt; ActiveSupport::TestCase @@ -48,4 +53,26 @@ class GovUserPlugin::InstitutionsBlockTest &lt; ActiveSupport::TestCase
48 assert_equivalent [institution.community], block.profiles 53 assert_equivalent [institution.community], block.profiles
49 end 54 end
50 55
  56 +
  57 + should 'not list communities' do
  58 + user = create_person("Jose_Augusto",
  59 + "jose_augusto@email.com",
  60 + "aaaaaaa",
  61 + "aaaaaaa",
  62 + 'jose@secondary.com',
  63 + "DF",
  64 + "Gama"
  65 + )
  66 + institution = InstitutionTestHelper.create_private_institution("inst name", "IN", "country", "state",
  67 + "city", "00.111.222/3333-44")
  68 + community = fast_create(Community)
  69 + institution.community.add_member(user)
  70 + community.add_member(user)
  71 +
  72 + block = GovUserPlugin::InstitutionsBlock.new
  73 + block.expects(:owner).at_least_once.returns(user)
  74 +
  75 + assert_equivalent block.profiles, [institution.community]
  76 + end
  77 +
51 end 78 end