Commit 7eefa439e719d9e7f7d22cb26b42563253b6985e
Exists in
master
and in
29 other branches
Merge branch 'fixed-block' into 'master'
Fixed block Make a specific block fixed on a position. Only the environment admin can move and specify this option for the block https://gitlab.com/noosfero/noosfero/issues/26 See merge request !380
Showing
6 changed files
with
102 additions
and
31 deletions
Show diff stats
app/controllers/my_profile/profile_design_controller.rb
... | ... | @@ -3,7 +3,16 @@ class ProfileDesignController < BoxOrganizerController |
3 | 3 | needs_profile |
4 | 4 | |
5 | 5 | protect 'edit_profile_design', :profile |
6 | - | |
6 | + | |
7 | + before_filter :protect_fixed_block, :only => [:save, :move_block] | |
8 | + | |
9 | + def protect_fixed_block | |
10 | + block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) | |
11 | + if block.fixed && !current_person.is_admin? | |
12 | + render_access_denied | |
13 | + end | |
14 | + end | |
15 | + | |
7 | 16 | def available_blocks |
8 | 17 | blocks = [ ArticleBlock, TagsBlock, RecentDocumentsBlock, ProfileInfoBlock, LinkListBlock, MyNetworkBlock, FeedReaderBlock, ProfileImageBlock, LocationBlock, SlideshowBlock, ProfileSearchBlock, HighlightsBlock ] |
9 | 18 | ... | ... |
app/helpers/boxes_helper.rb
... | ... | @@ -170,49 +170,54 @@ module BoxesHelper |
170 | 170 | else |
171 | 171 | "before-block-#{block.id}" |
172 | 172 | end |
173 | - | |
174 | - content_tag('div', ' ', :id => id, :class => 'block-target' ) + drop_receiving_element(id, :url => { :action => 'move_block', :target => id }, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover') | |
173 | + if block.nil? or modifiable?(block) | |
174 | + content_tag('div', ' ', :id => id, :class => 'block-target' ) + drop_receiving_element(id, :url => { :action => 'move_block', :target => id }, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover') | |
175 | + else | |
176 | + "" | |
177 | + end | |
175 | 178 | end |
176 | 179 | |
177 | 180 | # makes the given block draggable so it can be moved away. |
178 | 181 | def block_handle(block) |
179 | - draggable_element("block-#{block.id}", :revert => true) | |
182 | + modifiable?(block) ? draggable_element("block-#{block.id}", :revert => true) : "" | |
180 | 183 | end |
181 | 184 | |
182 | 185 | def block_edit_buttons(block) |
183 | 186 | buttons = [] |
184 | 187 | nowhere = 'javascript: return false;' |
185 | 188 | |
186 | - if block.first? | |
187 | - buttons << icon_button('up-disabled', _("Can't move up anymore."), nowhere) | |
188 | - else | |
189 | - buttons << icon_button('up', _('Move block up'), { :action => 'move_block_up', :id => block.id }, { :method => 'post' }) | |
190 | - end | |
189 | + if modifiable?(block) | |
190 | + if block.first? | |
191 | + buttons << icon_button('up-disabled', _("Can't move up anymore."), nowhere) | |
192 | + else | |
193 | + buttons << icon_button('up', _('Move block up'), { :action => 'move_block_up', :id => block.id }, { :method => 'post' }) | |
194 | + end | |
191 | 195 | |
192 | - if block.last? | |
193 | - buttons << icon_button('down-disabled', _("Can't move down anymore."), nowhere) | |
194 | - else | |
195 | - buttons << icon_button(:down, _('Move block down'), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'}) | |
196 | - end | |
196 | + if block.last? | |
197 | + buttons << icon_button('down-disabled', _("Can't move down anymore."), nowhere) | |
198 | + else | |
199 | + buttons << icon_button(:down, _('Move block down'), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'}) | |
200 | + end | |
197 | 201 | |
198 | - holder = block.owner | |
199 | - # move to opposite side | |
200 | - # FIXME too much hardcoded stuff | |
201 | - if holder.layout_template == 'default' | |
202 | - if block.box.position == 2 # area 2, left side => move to right side | |
203 | - buttons << icon_button('right', _('Move to the opposite side'), { :action => 'move_block', :target => 'end-of-box-' + holder.boxes[2].id.to_s, :id => block.id }, :method => 'post' ) | |
204 | - elsif block.box.position == 3 # area 3, right side => move to left side | |
205 | - buttons << icon_button('left', _('Move to the opposite side'), { :action => 'move_block', :target => 'end-of-box-' + holder.boxes[1].id.to_s, :id => block.id }, :method => 'post' ) | |
202 | + holder = block.owner | |
203 | + # move to opposite side | |
204 | + # FIXME too much hardcoded stuff | |
205 | + if holder.layout_template == 'default' | |
206 | + if block.box.position == 2 # area 2, left side => move to right side | |
207 | + buttons << icon_button('right', _('Move to the opposite side'), { :action => 'move_block', :target => 'end-of-box-' + holder.boxes[2].id.to_s, :id => block.id }, :method => 'post' ) | |
208 | + elsif block.box.position == 3 # area 3, right side => move to left side | |
209 | + buttons << icon_button('left', _('Move to the opposite side'), { :action => 'move_block', :target => 'end-of-box-' + holder.boxes[1].id.to_s, :id => block.id }, :method => 'post' ) | |
210 | + end | |
206 | 211 | end |
207 | - end | |
208 | 212 | |
209 | - if block.editable? | |
210 | - buttons << colorbox_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id }) | |
211 | - end | |
213 | + if block.editable? | |
214 | + buttons << colorbox_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id }) | |
215 | + end | |
212 | 216 | |
213 | - if !block.main? | |
214 | - buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')}) | |
215 | - buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' }) | |
217 | + if !block.main? | |
218 | + buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')}) | |
219 | + buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' }) | |
220 | + end | |
216 | 221 | end |
217 | 222 | |
218 | 223 | if block.respond_to?(:help) |
... | ... | @@ -248,5 +253,7 @@ module BoxesHelper |
248 | 253 | classes |
249 | 254 | end |
250 | 255 | |
251 | - | |
256 | + def modifiable?(block) | |
257 | + return !block.fixed || environment.admins.include?(user) | |
258 | + end | |
252 | 259 | end | ... | ... |
app/models/block.rb
1 | 1 | class Block < ActiveRecord::Base |
2 | 2 | |
3 | - attr_accessible :title, :display, :limit, :box_id, :posts_per_page, :visualization_format, :language, :display_user, :box | |
3 | + attr_accessible :title, :display, :limit, :box_id, :posts_per_page, :visualization_format, :language, :display_user, :box, :fixed | |
4 | 4 | |
5 | 5 | # to be able to generate HTML |
6 | 6 | include ActionView::Helpers::UrlHelper |
... | ... | @@ -110,6 +110,9 @@ class Block < ActiveRecord::Base |
110 | 110 | # * <tt>'all'</tt>: the block is always displayed |
111 | 111 | settings_items :language, :type => :string, :default => 'all' |
112 | 112 | |
113 | + # The block can be configured to be fixed. Only can be edited by environment admins | |
114 | + settings_items :fixed, :type => :boolean, :default => false | |
115 | + | |
113 | 116 | # returns the description of the block, used when the user sees a list of |
114 | 117 | # blocks to choose one to include in the design. |
115 | 118 | # | ... | ... |
app/views/box_organizer/edit.html.erb
... | ... | @@ -5,6 +5,12 @@ |
5 | 5 | |
6 | 6 | <%= labelled_form_field(_('Custom title for this block: '), text_field(:block, :title, :maxlength => 20)) %> |
7 | 7 | |
8 | + <% if environment.admins.include?(user) %> | |
9 | + <div class="fixed_block"> | |
10 | + <%= labelled_check_box(_("Fixed"), "block[fixed]", value = "1", checked = @block.fixed) %> | |
11 | + </div> | |
12 | + <% end %> | |
13 | + | |
8 | 14 | <%= render :partial => partial_for_class(@block.class) %> |
9 | 15 | |
10 | 16 | <div class="display"> | ... | ... |
test/functional/profile_design_controller_test.rb
... | ... | @@ -737,4 +737,22 @@ class ProfileDesignControllerTest < ActionController::TestCase |
737 | 737 | end |
738 | 738 | end |
739 | 739 | |
740 | + test 'should forbid POST to save for fixed blocks' do | |
741 | + block = profile.blocks.last | |
742 | + block.fixed = true | |
743 | + block.save! | |
744 | + | |
745 | + post :save, id: block.id, profile: profile.identifier | |
746 | + assert_response :forbidden | |
747 | + end | |
748 | + | |
749 | + test 'should forbid POST to move_block for fixed blocks' do | |
750 | + block = profile.blocks.last | |
751 | + block.fixed = true | |
752 | + block.save! | |
753 | + | |
754 | + post :move_block, id: block.id, profile: profile.identifier, target: "end-of-box-#{@box3.id}" | |
755 | + assert_response :forbidden | |
756 | + end | |
757 | + | |
740 | 758 | end | ... | ... |
test/unit/boxes_helper_test.rb
1 | 1 | require File.dirname(__FILE__) + '/../test_helper' |
2 | +require File.dirname(__FILE__) + '/../../app/helpers/boxes_helper' | |
2 | 3 | |
3 | 4 | class BoxesHelperTest < ActionView::TestCase |
4 | 5 | |
... | ... | @@ -119,4 +120,31 @@ class BoxesHelperTest < ActionView::TestCase |
119 | 120 | display_box_content(box, '') |
120 | 121 | end |
121 | 122 | |
123 | + should 'not show move options on block when block is fixed' do | |
124 | + p = create_user_with_blocks | |
125 | + | |
126 | + b = p.blocks.select{|bk| !bk.kind_of?(MainBlock) }[0] | |
127 | + b.fixed = true | |
128 | + b.save! | |
129 | + | |
130 | + stubs(:environment).returns(p.environment) | |
131 | + stubs(:user).returns(p) | |
132 | + | |
133 | + assert_equal false, modifiable?(b) | |
134 | + end | |
135 | + | |
136 | + should 'show move options on block when block is fixed and user is admin' do | |
137 | + p = create_user_with_blocks | |
138 | + | |
139 | + b = p.blocks.select{|bk| !bk.kind_of?(MainBlock) }[0] | |
140 | + b.fixed = true | |
141 | + b.save! | |
142 | + | |
143 | + p.environment.add_admin(p) | |
144 | + | |
145 | + stubs(:environment).returns(p.environment) | |
146 | + stubs(:user).returns(p) | |
147 | + | |
148 | + assert_equal true, modifiable?(b) | |
149 | + end | |
122 | 150 | end | ... | ... |