noosfero | 2 new commits pushed to repository
Antonio Terceiro
gitlab at gitlab.com
Wed Jan 21 16:25:34 BRST 2015
Antonio Terceiro pushed to refs/heads/master at <a href="https://gitlab.com/noosfero/noosfero">Noosfero / noosfero</a>
Commits:
<a href="https://gitlab.com/noosfero/noosfero/commit/5d28b4b38df71b4d73a14cb8ba166a8a00cdb886">5d28b4b3</a> by Fabio Teixeira
Add ability to mark blocks as fixed
Fixed blocks can't be modified by regular users, but only by
administrators. The main use case is defining a few blocks in the user
or community templates, so that users and communities can't remove or
change them.
Signed-off-by: Antonio Terceiro <terceiro at colivre.coop.br>
Signed-off-by: Arthur Del Esposte <arthurmde at gmail.com>
Signed-off-by: Fabio Teixeira <fabio1079 at gmail.com>
Signed-off-by: Gabriela Navarro <navarro1703 at gmail.com>
Signed-off-by: Gustavo Jaruga <darksshades at gmail.com>
- - - - -
<a href="https://gitlab.com/noosfero/noosfero/commit/7eefa439e719d9e7f7d22cb26b42563253b6985e">7eefa439</a> by Antonio Terceiro
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
- - - - -
Changes:
=====================================
app/controllers/my_profile/profile_design_controller.rb
=====================================
--- a/app/controllers/my_profile/profile_design_controller.rb
+++ b/app/controllers/my_profile/profile_design_controller.rb
@@ -3,7 +3,16 @@ class ProfileDesignController < BoxOrganizerController
needs_profile
protect 'edit_profile_design', :profile
-
+
+ before_filter :protect_fixed_block, :only => [:save, :move_block]
+
+ def protect_fixed_block
+ block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, ''))
+ if block.fixed && !current_person.is_admin?
+ render_access_denied
+ end
+ end
+
def available_blocks
blocks = [ ArticleBlock, TagsBlock, RecentDocumentsBlock, ProfileInfoBlock, LinkListBlock, MyNetworkBlock, FeedReaderBlock, ProfileImageBlock, LocationBlock, SlideshowBlock, ProfileSearchBlock, HighlightsBlock ]
=====================================
app/helpers/boxes_helper.rb
=====================================
--- a/app/helpers/boxes_helper.rb
+++ b/app/helpers/boxes_helper.rb
@@ -170,49 +170,54 @@ module BoxesHelper
else
"before-block-#{block.id}"
end
-
- 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')
+ if block.nil? or modifiable?(block)
+ 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')
+ else
+ ""
+ end
end
# makes the given block draggable so it can be moved away.
def block_handle(block)
- draggable_element("block-#{block.id}", :revert => true)
+ modifiable?(block) ? draggable_element("block-#{block.id}", :revert => true) : ""
end
def block_edit_buttons(block)
buttons = []
nowhere = 'javascript: return false;'
- if block.first?
- buttons << icon_button('up-disabled', _("Can't move up anymore."), nowhere)
- else
- buttons << icon_button('up', _('Move block up'), { :action => 'move_block_up', :id => block.id }, { :method => 'post' })
- end
+ if modifiable?(block)
+ if block.first?
+ buttons << icon_button('up-disabled', _("Can't move up anymore."), nowhere)
+ else
+ buttons << icon_button('up', _('Move block up'), { :action => 'move_block_up', :id => block.id }, { :method => 'post' })
+ end
- if block.last?
- buttons << icon_button('down-disabled', _("Can't move down anymore."), nowhere)
- else
- buttons << icon_button(:down, _('Move block down'), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'})
- end
+ if block.last?
+ buttons << icon_button('down-disabled', _("Can't move down anymore."), nowhere)
+ else
+ buttons << icon_button(:down, _('Move block down'), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'})
+ end
- holder = block.owner
- # move to opposite side
- # FIXME too much hardcoded stuff
- if holder.layout_template == 'default'
- if block.box.position == 2 # area 2, left side => move to right side
- 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' )
- elsif block.box.position == 3 # area 3, right side => move to left side
- 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' )
+ holder = block.owner
+ # move to opposite side
+ # FIXME too much hardcoded stuff
+ if holder.layout_template == 'default'
+ if block.box.position == 2 # area 2, left side => move to right side
+ 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' )
+ elsif block.box.position == 3 # area 3, right side => move to left side
+ 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' )
+ end
end
- end
- if block.editable?
- buttons << colorbox_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id })
- end
+ if block.editable?
+ buttons << colorbox_icon_button(:edit, _('Edit'), { :action => 'edit', :id => block.id })
+ end
- if !block.main?
- buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')})
- buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' })
+ if !block.main?
+ buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post', :confirm => _('Are you sure you want to remove this block?')})
+ buttons << icon_button(:clone, _('Clone'), { :action => 'clone_block', :id => block.id }, { :method => 'post' })
+ end
end
if block.respond_to?(:help)
@@ -248,5 +253,7 @@ module BoxesHelper
classes
end
-
+ def modifiable?(block)
+ return !block.fixed || environment.admins.include?(user)
+ end
end
=====================================
app/models/block.rb
=====================================
--- a/app/models/block.rb
+++ b/app/models/block.rb
@@ -1,6 +1,6 @@
class Block < ActiveRecord::Base
- attr_accessible :title, :display, :limit, :box_id, :posts_per_page, :visualization_format, :language, :display_user, :box
+ attr_accessible :title, :display, :limit, :box_id, :posts_per_page, :visualization_format, :language, :display_user, :box, :fixed
# to be able to generate HTML
include ActionView::Helpers::UrlHelper
@@ -110,6 +110,9 @@ class Block < ActiveRecord::Base
# * <tt>'all'</tt>: the block is always displayed
settings_items :language, :type => :string, :default => 'all'
+ # The block can be configured to be fixed. Only can be edited by environment admins
+ settings_items :fixed, :type => :boolean, :default => false
+
# returns the description of the block, used when the user sees a list of
# blocks to choose one to include in the design.
#
=====================================
app/views/box_organizer/edit.html.erb
=====================================
--- a/app/views/box_organizer/edit.html.erb
+++ b/app/views/box_organizer/edit.html.erb
@@ -5,6 +5,12 @@
<%= labelled_form_field(_('Custom title for this block: '), text_field(:block, :title, :maxlength => 20)) %>
+ <% if environment.admins.include?(user) %>
+ <div class="fixed_block">
+ <%= labelled_check_box(_("Fixed"), "block[fixed]", value = "1", checked = @block.fixed) %>
+ </div>
+ <% end %>
+
<%= render :partial => partial_for_class(@block.class) %>
<div class="display">
=====================================
test/functional/profile_design_controller_test.rb
=====================================
--- a/test/functional/profile_design_controller_test.rb
+++ b/test/functional/profile_design_controller_test.rb
@@ -737,4 +737,22 @@ class ProfileDesignControllerTest < ActionController::TestCase
end
end
+ test 'should forbid POST to save for fixed blocks' do
+ block = profile.blocks.last
+ block.fixed = true
+ block.save!
+
+ post :save, id: block.id, profile: profile.identifier
+ assert_response :forbidden
+ end
+
+ test 'should forbid POST to move_block for fixed blocks' do
+ block = profile.blocks.last
+ block.fixed = true
+ block.save!
+
+ post :move_block, id: block.id, profile: profile.identifier, target: "end-of-box-#{@box3.id}"
+ assert_response :forbidden
+ end
+
end
=====================================
test/unit/boxes_helper_test.rb
=====================================
--- a/test/unit/boxes_helper_test.rb
+++ b/test/unit/boxes_helper_test.rb
@@ -1,4 +1,5 @@
require File.dirname(__FILE__) + '/../test_helper'
+require File.dirname(__FILE__) + '/../../app/helpers/boxes_helper'
class BoxesHelperTest < ActionView::TestCase
@@ -119,4 +120,31 @@ class BoxesHelperTest < ActionView::TestCase
display_box_content(box, '')
end
+ should 'not show move options on block when block is fixed' do
+ p = create_user_with_blocks
+
+ b = p.blocks.select{|bk| !bk.kind_of?(MainBlock) }[0]
+ b.fixed = true
+ b.save!
+
+ stubs(:environment).returns(p.environment)
+ stubs(:user).returns(p)
+
+ assert_equal false, modifiable?(b)
+ end
+
+ should 'show move options on block when block is fixed and user is admin' do
+ p = create_user_with_blocks
+
+ b = p.blocks.select{|bk| !bk.kind_of?(MainBlock) }[0]
+ b.fixed = true
+ b.save!
+
+ p.environment.add_admin(p)
+
+ stubs(:environment).returns(p.environment)
+ stubs(:user).returns(p)
+
+ assert_equal true, modifiable?(b)
+ end
end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-dev/attachments/20150121/965a6b39/attachment-0001.html>
More information about the Noosfero-dev
mailing list