Commit bce11413dbb1c9da0f5b7dffe539bed6e9b499a8
1 parent
d0561132
Exists in
master
and in
29 other branches
Added a way to display blocks only to logged/not logged users
Showing
4 changed files
with
73 additions
and
1 deletions
Show diff stats
app/helpers/boxes_helper.rb
@@ -65,7 +65,7 @@ module BoxesHelper | @@ -65,7 +65,7 @@ module BoxesHelper | ||
65 | end | 65 | end |
66 | 66 | ||
67 | def display_box_content(box, main_content) | 67 | def display_box_content(box, main_content) |
68 | - context = { :article => @page, :request_path => request.path, :locale => locale, :params => request.params } | 68 | + context = { :article => @page, :request_path => request.path, :locale => locale, :params => request.params, :user => user } |
69 | box_decorator.select_blocks(box.blocks.includes(:box), context).map { |item| display_block(item, main_content) }.join("\n") + box_decorator.block_target(box) | 69 | box_decorator.select_blocks(box.blocks.includes(:box), context).map { |item| display_block(item, main_content) }.join("\n") + box_decorator.block_target(box) |
70 | end | 70 | end |
71 | 71 |
app/models/block.rb
@@ -22,11 +22,13 @@ class Block < ActiveRecord::Base | @@ -22,11 +22,13 @@ class Block < ActiveRecord::Base | ||
22 | # | 22 | # |
23 | # * <tt>:article</tt>: the article being viewed currently | 23 | # * <tt>:article</tt>: the article being viewed currently |
24 | # * <tt>:language</tt>: in which language the block will be displayed | 24 | # * <tt>:language</tt>: in which language the block will be displayed |
25 | + # * <tt>:user</tt>: the logged user | ||
25 | def visible?(context = nil) | 26 | def visible?(context = nil) |
26 | return false if display == 'never' | 27 | return false if display == 'never' |
27 | 28 | ||
28 | if context | 29 | if context |
29 | return false if language != 'all' && language != context[:locale] | 30 | return false if language != 'all' && language != context[:locale] |
31 | + return false unless display_to_user?(context[:user]) | ||
30 | 32 | ||
31 | begin | 33 | begin |
32 | return self.send("display_#{display}", context) | 34 | return self.send("display_#{display}", context) |
@@ -38,6 +40,10 @@ class Block < ActiveRecord::Base | @@ -38,6 +40,10 @@ class Block < ActiveRecord::Base | ||
38 | true | 40 | true |
39 | end | 41 | end |
40 | 42 | ||
43 | + def display_to_user?(user) | ||
44 | + display_user == 'all' || (user.nil? && display_user == 'not_logged') || (user && display_user == 'logged') | ||
45 | + end | ||
46 | + | ||
41 | def display_always(context) | 47 | def display_always(context) |
42 | true | 48 | true |
43 | end | 49 | end |
@@ -68,6 +74,14 @@ class Block < ActiveRecord::Base | @@ -68,6 +74,14 @@ class Block < ActiveRecord::Base | ||
68 | # the homepage of its owner. | 74 | # the homepage of its owner. |
69 | settings_items :display, :type => :string, :default => 'always' | 75 | settings_items :display, :type => :string, :default => 'always' |
70 | 76 | ||
77 | + | ||
78 | + # The condition for displaying a block to users. It can assume the following values: | ||
79 | + # | ||
80 | + # * <tt>'all'</tt>: the block is always displayed | ||
81 | + # * <tt>'logged'</tt>: the block is displayed to logged users only | ||
82 | + # * <tt>'not_logged'</tt>: the block is displayed only to not logged users | ||
83 | + settings_items :display_user, :type => :string, :default => 'all' | ||
84 | + | ||
71 | # The block can be configured to be displayed in all languages or in just one language. It can assume any locale of the environment: | 85 | # The block can be configured to be displayed in all languages or in just one language. It can assume any locale of the environment: |
72 | # | 86 | # |
73 | # * <tt>'all'</tt>: the block is always displayed | 87 | # * <tt>'all'</tt>: the block is always displayed |
@@ -179,6 +193,14 @@ class Block < ActiveRecord::Base | @@ -179,6 +193,14 @@ class Block < ActiveRecord::Base | ||
179 | DISPLAY_OPTIONS[option] | 193 | DISPLAY_OPTIONS[option] |
180 | end | 194 | end |
181 | 195 | ||
196 | + def display_user_options | ||
197 | + @display_user_options ||= { | ||
198 | + 'all' => __('All users'), | ||
199 | + 'logged' => __('Logged'), | ||
200 | + 'not_logged' => __('Not logged'), | ||
201 | + } | ||
202 | + end | ||
203 | + | ||
182 | def duplicate | 204 | def duplicate |
183 | duplicated_block = self.clone | 205 | duplicated_block = self.clone |
184 | duplicated_block.display = 'never' | 206 | duplicated_block.display = 'never' |
app/views/box_organizer/edit.rhtml
@@ -15,6 +15,10 @@ | @@ -15,6 +15,10 @@ | ||
15 | <br/> | 15 | <br/> |
16 | <% end %> | 16 | <% end %> |
17 | </div> | 17 | </div> |
18 | + <div class="display_user"> | ||
19 | + <%= labelled_form_field _('Display to users:'), '' %> | ||
20 | + <%= select_tag('block[display_user]', options_from_collection_for_select(@block.display_user_options, :first, :last, @block.display_user)) %> | ||
21 | + </div> | ||
18 | 22 | ||
19 | <%= labelled_form_field(_('Show for:'), select(:block, :language, [ [ _('all languages'), 'all']] + environment.locales.map {|key, value| [value, key]} )) %> | 23 | <%= labelled_form_field(_('Show for:'), select(:block, :language, [ [ _('all languages'), 'all']] + environment.locales.map {|key, value| [value, key]} )) %> |
20 | 24 |
test/unit/block_test.rb
@@ -222,4 +222,50 @@ class BlockTest < ActiveSupport::TestCase | @@ -222,4 +222,50 @@ class BlockTest < ActiveSupport::TestCase | ||
222 | assert block.visible?(2) | 222 | assert block.visible?(2) |
223 | assert !block.visible?(3) | 223 | assert !block.visible?(3) |
224 | end | 224 | end |
225 | + | ||
226 | + should 'default value for display_user is all' do | ||
227 | + block = Block.new | ||
228 | + assert_equal 'all', block.display_user | ||
229 | + end | ||
230 | + | ||
231 | + should 'display block to not logged users for display_user = all' do | ||
232 | + block = Block.new | ||
233 | + assert block.display_to_user?(nil) | ||
234 | + end | ||
235 | + | ||
236 | + should 'display block to logged users for display_user = all' do | ||
237 | + block = Block.new | ||
238 | + assert block.display_to_user?(User.new) | ||
239 | + end | ||
240 | + | ||
241 | + should 'display block to logged users for display_user = logged' do | ||
242 | + block = Block.new | ||
243 | + block.display_user = 'logged' | ||
244 | + assert block.display_to_user?(User.new) | ||
245 | + end | ||
246 | + | ||
247 | + should 'do not display block to logged users for display_user = not_logged' do | ||
248 | + block = Block.new | ||
249 | + block.display_user = 'not_logged' | ||
250 | + assert !block.display_to_user?(User.new) | ||
251 | + end | ||
252 | + | ||
253 | + should 'do not display block to not logged users for display_user = logged' do | ||
254 | + block = Block.new | ||
255 | + block.display_user = 'logged' | ||
256 | + assert !block.display_to_user?(nil) | ||
257 | + end | ||
258 | + | ||
259 | + should 'display block to not logged users for display_user = not_logged' do | ||
260 | + block = Block.new | ||
261 | + block.display_user = 'not_logged' | ||
262 | + assert block.display_to_user?(nil) | ||
263 | + end | ||
264 | + | ||
265 | + should 'not be visible if display_to_user? is false' do | ||
266 | + block = Block.new | ||
267 | + block.expects(:display_to_user?).once.returns(false) | ||
268 | + assert !block.visible?({}) | ||
269 | + end | ||
270 | + | ||
225 | end | 271 | end |