Commit 60eea82d7238abc13b045db0561144695fea09b4

Authored by AntonioTerceiro
1 parent 44a82ec3

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
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  
... ...
app/models/enterprises_block.rb 0 → 100644
... ... @@ -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 &lt; 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 &lt; 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 &lt; 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  
... ...
test/unit/enterprises_block_test.rb 0 → 100644
... ... @@ -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
... ... @@ -54,5 +54,9 @@ class ProfileListBlockTest &lt; Test::Unit::TestCase
54 54 block.profiles
55 55 end
56 56  
  57 + should 'provide random numbers' do
  58 + assert_respond_to ProfileListBlock::Finder.new(nil), :pick_random
  59 + end
  60 +
57 61  
58 62 end
... ...