Commit 60eea82d7238abc13b045db0561144695fea09b4
1 parent
44a82ec3
Exists in
staging
and in
42 other branches
ActionItem154: adding EnterprisesBlock + refactoring to centralize duplicated co…
…de. I think that maybe those finders are not needed at all git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1399 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
6 changed files
with
102 additions
and
27 deletions
Show diff stats
app/models/communities_block.rb
| ... | ... | @@ -8,20 +8,20 @@ class CommunitiesBlock < ProfileListBlock |
| 8 | 8 | _('Communities') |
| 9 | 9 | end |
| 10 | 10 | |
| 11 | + def footer | |
| 12 | + profile = self.owner | |
| 13 | + lambda do | |
| 14 | + link_to _('All communities'), :profile => profile.identifier, :controller => 'profile', :action => 'communities' | |
| 15 | + end | |
| 16 | + end | |
| 17 | + | |
| 11 | 18 | def profile_finder |
| 12 | 19 | @profile_finder ||= CommunitiesBlock::Finder.new(self) |
| 13 | 20 | end |
| 14 | 21 | |
| 15 | 22 | class Finder < ProfileListBlock::Finder |
| 16 | - def find | |
| 17 | - ids = block.owner.community_memberships.map(&:id) | |
| 18 | - result = [] | |
| 19 | - [block.limit, ids.size].min.times do | |
| 20 | - i = pick_random(ids.size) | |
| 21 | - result << Profile.find(ids[i]) | |
| 22 | - ids.delete_at(i) | |
| 23 | - end | |
| 24 | - result | |
| 23 | + def ids | |
| 24 | + block.owner.community_memberships.map(&:id) | |
| 25 | 25 | end |
| 26 | 26 | end |
| 27 | 27 | ... | ... |
| ... | ... | @@ -0,0 +1,29 @@ |
| 1 | +class EnterprisesBlock < ProfileListBlock | |
| 2 | + | |
| 3 | + def title | |
| 4 | + _('Enterprises') | |
| 5 | + end | |
| 6 | + | |
| 7 | + def self.description | |
| 8 | + _('A block that displays your enterprises') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def footer | |
| 12 | + profile = self.owner | |
| 13 | + lambda do | |
| 14 | + link_to _('All enterprises'), :profile => profile.identifier, :controller => 'profile', :action => 'enterprises' | |
| 15 | + end | |
| 16 | + end | |
| 17 | + | |
| 18 | + | |
| 19 | + def profile_finder | |
| 20 | + @profile_finder ||= EnterprisesBlock::Finder.new(self) | |
| 21 | + end | |
| 22 | + | |
| 23 | + class Finder < ProfileListBlock::Finder | |
| 24 | + def ids | |
| 25 | + block.owner.enterprise_memberships.map(&:id) | |
| 26 | + end | |
| 27 | + end | |
| 28 | + | |
| 29 | +end | ... | ... |
app/models/members_block.rb
| ... | ... | @@ -20,23 +20,10 @@ class MembersBlock < ProfileListBlock |
| 20 | 20 | end |
| 21 | 21 | |
| 22 | 22 | # Finds random members, up to the limit. |
| 23 | - class Finder | |
| 24 | - def initialize(block) | |
| 25 | - @block = block | |
| 23 | + class Finder < ProfileListBlock::Finder | |
| 24 | + def ids | |
| 25 | + block.owner.members.map(&:id) | |
| 26 | 26 | end |
| 27 | - attr_reader :block | |
| 28 | - | |
| 29 | - def find | |
| 30 | - ids = block.owner.members.map(&:id) | |
| 31 | - result = [] | |
| 32 | - [block.limit, ids.size].min.times do | |
| 33 | - i = pick_random(ids.size) | |
| 34 | - result << Profile.find(ids[i]) | |
| 35 | - ids.delete_at(i) | |
| 36 | - end | |
| 37 | - result | |
| 38 | - end | |
| 39 | - | |
| 40 | 27 | end |
| 41 | 28 | |
| 42 | 29 | ... | ... |
app/models/profile_list_block.rb
| ... | ... | @@ -29,11 +29,21 @@ class ProfileListBlock < Block |
| 29 | 29 | end |
| 30 | 30 | attr_reader :block |
| 31 | 31 | def find |
| 32 | - Profile.find(:all, :limit => block.limit, :order => 'created_at desc') | |
| 32 | + id_list = self.ids | |
| 33 | + result = [] | |
| 34 | + [block.limit, id_list.size].min.times do | |
| 35 | + i = pick_random(id_list.size) | |
| 36 | + result << Profile.find(id_list[i]) | |
| 37 | + id_list.delete_at(i) | |
| 38 | + end | |
| 39 | + result | |
| 33 | 40 | end |
| 34 | 41 | def pick_random(top) |
| 35 | 42 | rand(top) |
| 36 | 43 | end |
| 44 | + def ids | |
| 45 | + Profile.connection.select_all('select id from profiles').map { |entry| entry['id'].to_i } | |
| 46 | + end | |
| 37 | 47 | end |
| 38 | 48 | |
| 39 | 49 | def profiles |
| ... | ... | @@ -50,7 +60,7 @@ class ProfileListBlock < Block |
| 50 | 60 | title = self.title |
| 51 | 61 | lambda do |
| 52 | 62 | block_title(title) + |
| 53 | - profiles.map {|item| content_tag('div', profile_image_link(item)) }.join("\n") | |
| 63 | + profiles.map {|item| content_tag('div', profile_image_link(item), :class => 'profile-list-block-link') }.join("\n") | |
| 54 | 64 | end |
| 55 | 65 | end |
| 56 | 66 | ... | ... |
| ... | ... | @@ -0,0 +1,45 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class EnterprisesBlockTest < Test::Unit::TestCase | |
| 4 | + | |
| 5 | + should 'inherit from ProfileListBlock' do | |
| 6 | + assert_kind_of ProfileListBlock, EnterprisesBlock.new | |
| 7 | + end | |
| 8 | + | |
| 9 | + should 'declare its title' do | |
| 10 | + assert_not_equal ProfileListBlock.new.title, EnterprisesBlock.new.title | |
| 11 | + end | |
| 12 | + | |
| 13 | + should 'describe itself' do | |
| 14 | + assert_not_equal ProfileListBlock.description, EnterprisesBlock.description | |
| 15 | + end | |
| 16 | + | |
| 17 | + should 'use its own finder' do | |
| 18 | + assert_not_equal EnterprisesBlock::Finder, ProfileListBlock::Finder | |
| 19 | + assert_kind_of EnterprisesBlock::Finder, EnterprisesBlock.new.profile_finder | |
| 20 | + end | |
| 21 | + | |
| 22 | + should 'list owner communities' do | |
| 23 | + | |
| 24 | + block = EnterprisesBlock.new | |
| 25 | + block.limit = 2 | |
| 26 | + | |
| 27 | + owner = mock | |
| 28 | + block.expects(:owner).returns(owner) | |
| 29 | + | |
| 30 | + member1 = mock; member1.stubs(:id).returns(1) | |
| 31 | + member2 = mock; member2.stubs(:id).returns(2) | |
| 32 | + member3 = mock; member3.stubs(:id).returns(3) | |
| 33 | + | |
| 34 | + owner.expects(:enterprise_memberships).returns([member1, member2, member3]) | |
| 35 | + | |
| 36 | + block.profile_finder.expects(:pick_random).with(3).returns(2) | |
| 37 | + block.profile_finder.expects(:pick_random).with(2).returns(0) | |
| 38 | + | |
| 39 | + Profile.expects(:find).with(3).returns(member3) | |
| 40 | + Profile.expects(:find).with(1).returns(member1) | |
| 41 | + | |
| 42 | + assert_equal [member3, member1], block.profiles | |
| 43 | + end | |
| 44 | + | |
| 45 | +end | ... | ... |
test/unit/profile_list_block_test.rb