Commit f92f835b5c5fe168ea348f3cdc9617c79689a934

Authored by Daniela Feitosa
Committed by Antonio Terceiro
1 parent afb1b60d

Added language for blocks

Blocks will be displayed according to the browser locale:
  * "all": displayed in all languages
  * some language: displayed only in the selected language

(ActionItem1774)

Signed-off-by: Antonio Terceiro <terceiro@colivre.coop.br>
app/helpers/boxes_helper.rb
... ... @@ -65,7 +65,7 @@ module BoxesHelper
65 65 end
66 66  
67 67 def display_box_content(box, main_content)
68   - context = { :article => @page, :request_path => request.path }
  68 + context = { :article => @page, :request_path => request.path, :locale => locale }
69 69 box_decorator.select_blocks(box.blocks, context).map { |item| display_block(item, main_content) }.join("\n") + box_decorator.block_target(box)
70 70 end
71 71  
... ...
app/models/block.rb
... ... @@ -19,15 +19,21 @@ class Block &lt; ActiveRecord::Base
19 19 # may contain the following keys:
20 20 #
21 21 # * <tt>:article</tt>: the article being viewed currently
  22 + # * <tt>:language</tt>: in which language the block will be displayed
22 23 def visible?(context = nil)
23 24 if display == 'never'
24 25 return false
25 26 end
26   - if context && display == 'home_page_only'
27   - if context[:article]
28   - return context[:article] == owner.home_page
29   - else
30   - return context[:request_path] == '/'
  27 + if context
  28 + if language != 'all' && language != context[:locale]
  29 + return false
  30 + end
  31 + if display == 'home_page_only'
  32 + if context[:article]
  33 + return context[:article] == owner.home_page
  34 + else
  35 + return context[:request_path] == '/'
  36 + end
31 37 end
32 38 end
33 39 true
... ... @@ -41,6 +47,11 @@ class Block &lt; ActiveRecord::Base
41 47 # homepage of its owner.
42 48 settings_items :display, :type => :string, :default => 'always'
43 49  
  50 + # The block can be configured to be displayed in all languages or in just one language. It can assume any locale of the environment:
  51 + #
  52 + # * <tt>'all'</tt>: the block is always displayed
  53 + settings_items :language, :type => :string, :default => 'all'
  54 +
44 55 # returns the description of the block, used when the user sees a list of
45 56 # blocks to choose one to include in the design.
46 57 #
... ...
app/views/box_organizer/edit.rhtml
... ... @@ -18,6 +18,8 @@
18 18 <%= label_tag('block_display_never', _("Don't display")) %>
19 19 </div>
20 20  
  21 + <%= labelled_form_field(_('Show for:'), select(:block, :language, [ [ _('all languages'), 'all']] + Noosfero.locales.map {|key, value| [value, key]} )) %>
  22 +
21 23 <% button_bar do %>
22 24 <%= submit_button(:save, _('Save')) %>
23 25 <%= lightbox_close_button(_('Cancel')) %>
... ...
features/edit_language_block.feature 0 → 100644
... ... @@ -0,0 +1,38 @@
  1 +Feature: edit language of block
  2 + As a profile owner
  3 + I want to configure in which language a block will be displayed
  4 +
  5 + Background:
  6 + Given the following users
  7 + | login | name |
  8 + | joaosilva | Jose Silva |
  9 + And the following blocks
  10 + | owner | type |
  11 + | joaosilva | ArticleBlock |
  12 + | joaosilva | LinkListBlock |
  13 + And I am logged in as "joaosilva"
  14 +
  15 + Scenario: display in all languages
  16 + Given I go to edit ArticleBlock of joaosilva
  17 + And I fill in "Custom title for this block" with "Block displayed"
  18 + And I select "all languages"
  19 + And I press "Save"
  20 + When I go to Jose Silva's homepage
  21 + Then I should see "Block displayed"
  22 +
  23 + Scenario: display in the selected language
  24 + Given I go to edit LinkListBlock of joaosilva
  25 + And I fill in "Custom title for this block" with "Block displayed"
  26 + And I select "Português"
  27 + And I press "Save"
  28 + And my browser prefers Portuguese
  29 + When I go to Jose Silva's homepage
  30 + Then I should see "Block displayed"
  31 +
  32 + Scenario: not display in a not selected language
  33 + Given I go to edit LinkListBlock of joaosilva
  34 + And I fill in "Custom title for this block" with "Block not displayed"
  35 + And I select "Português"
  36 + And I press "Save"
  37 + When I go to Jose Silva's homepage
  38 + Then I should not see "Block displayed"
... ...
test/unit/block_test.rb
... ... @@ -110,4 +110,30 @@ class BlockTest &lt; Test::Unit::TestCase
110 110 assert_equal 'always', block.display
111 111 end
112 112  
  113 + should 'display block in all languages by default' do
  114 + profile = Profile.new
  115 + block = Block.new
  116 + block.stubs(:owner).returns(profile)
  117 +
  118 + assert_equal 'all', block.language
  119 + end
  120 +
  121 + should 'be able to be displayed in all languages' do
  122 + profile = Profile.new
  123 + block = Block.new(:language => 'all')
  124 + block.stubs(:owner).returns(profile)
  125 +
  126 + assert_equal true, block.visible?(:locale => 'pt')
  127 + assert_equal true, block.visible?(:locale => 'en')
  128 + end
  129 +
  130 + should 'be able to be displayed only in the selected language' do
  131 + profile = Profile.new
  132 + block = Block.new(:language => 'pt')
  133 + block.stubs(:owner).returns(profile)
  134 +
  135 + assert_equal true, block.visible?(:locale => 'pt')
  136 + assert_equal false, block.visible?(:locale => 'en')
  137 + end
  138 +
113 139 end
... ...
test/unit/boxes_helper_test.rb
... ... @@ -50,6 +50,7 @@ class BoxesHelperTest &lt; Test::Unit::TestCase
50 50 expects(:display_block).with(b, '')
51 51 expects(:request).returns(request)
52 52 stubs(:block_target).returns('')
  53 + expects(:locale).returns('en')
53 54 with_box_decorator self do
54 55 display_box_content(box, '')
55 56 end
... ... @@ -67,6 +68,7 @@ class BoxesHelperTest &lt; Test::Unit::TestCase
67 68 expects(:display_block).with(b, '').never
68 69 expects(:request).returns(request)
69 70 stubs(:block_target).returns('')
  71 + expects(:locale).returns('en')
70 72 display_box_content(box, '')
71 73 end
72 74  
... ... @@ -102,14 +104,15 @@ class BoxesHelperTest &lt; Test::Unit::TestCase
102 104 assert block_css_classes(Block.new(:display => 'never')).split.any? { |item| item == 'invisible-block'}
103 105 end
104 106  
105   - should 'fill context with the article and request_path' do
  107 + should 'fill context with the article, request_path and locale' do
106 108 request = mock()
107 109 box = mock()
108 110  
109 111 box.expects(:blocks).returns([])
110 112 request.expects(:path).returns('/')
111 113 expects(:request).returns(request)
112   - box_decorator.expects(:select_blocks).with([], {:article => nil, :request_path => '/'}).returns([])
  114 + expects(:locale).returns('en')
  115 + box_decorator.expects(:select_blocks).with([], {:article => nil, :request_path => '/', :locale => 'en'}).returns([])
113 116  
114 117 display_box_content(box, '')
115 118 end
... ...