Commit 2084ef4738da4ceda0e44cf5ff80f5a0db2acf3a

Authored by AntonioTerceiro
1 parent b9adeec9

ActionItem490: "finishing" products block

git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2152 3f533792-8f58-4932-b0fe-aaf55b0a4547
app/controllers/my_profile/profile_design_controller.rb
... ... @@ -18,6 +18,11 @@ class ProfileDesignController < BoxOrganizerController
18 18 blocks << FavoriteEnterprisesBlock
19 19 end
20 20  
  21 + # blocks exclusive for enterprises
  22 + if profile.enterprise?
  23 + blocks << ProductsBlock
  24 + end
  25 +
21 26 blocks
22 27 end
23 28  
... ...
app/helpers/boxes_helper.rb
... ... @@ -121,12 +121,20 @@ module BoxesHelper
121 121 def block_edit_buttons(block)
122 122 buttons = []
123 123  
124   - buttons << icon_button(:up, _('Move block up'), { :action => 'move_block_up', :id => block.id }, { :method => 'post' }) unless block.first?
125   - buttons << icon_button(:down, _('Move block down'), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'}) unless block.last?
126   - buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post'}) unless block.main?
  124 + if !block.first?
  125 + buttons << icon_button(:up, _('Move block up'), { :action => 'move_block_up', :id => block.id }, { :method => 'post' })
  126 + end
  127 +
  128 + if !block.last?
  129 + buttons << icon_button(:down, _('Move block down'), { :action => 'move_block_down' ,:id => block.id }, { :method => 'post'})
  130 + end
  131 +
  132 + if block.editable?
  133 + buttons << lightbox_icon_button(:edit, _('Edit'), { :controller => 'profile_design', :action => 'edit', :id => block.id })
  134 + end
127 135  
128   - if block.editor
129   - buttons << lightbox_button(:edit, _('Edit'), block.editor)
  136 + if !block.main?
  137 + buttons << icon_button(:delete, _('Remove block'), { :action => 'remove', :id => block.id }, { :method => 'post'})
130 138 end
131 139  
132 140 content_tag('div', buttons.join("\n") + tag('br', :style => 'clear: left'), :class => 'button-bar')
... ...
app/helpers/lightbox_helper.rb
... ... @@ -16,6 +16,10 @@ module LightboxHelper
16 16 button(type, label, url, lightbox_options(options))
17 17 end
18 18  
  19 + def lightbox_icon_button(type, label, url, options = {})
  20 + icon_button(type, label, url, lightbox_options(options))
  21 + end
  22 +
19 23 # options must be an HTML options hash as passed to link_to etc.
20 24 #
21 25 # returns a new hash with lightbox class added. Keeps existing classes.
... ...
app/models/article_block.rb
... ... @@ -36,8 +36,8 @@ class ArticleBlock &lt; Block
36 36 @article = obj
37 37 end
38 38  
39   - def editor
40   - { :controller => 'profile_design', :action => 'edit', :id => self.id }
  39 + def editable?
  40 + true
41 41 end
42 42  
43 43 end
... ...
app/models/block.rb
... ... @@ -45,10 +45,9 @@ class Block &lt; ActiveRecord::Base
45 45 nil
46 46 end
47 47  
48   - # must return a Hash with URL options poiting to the action that edits
49   - # properties of the block
50   - def editor
51   - nil
  48 + # Is this block editable? (Default to <tt>false</tt>)
  49 + def editable?
  50 + false
52 51 end
53 52  
54 53 # must always return false, except on MainBlock clas.
... ...
app/models/products_block.rb
... ... @@ -8,15 +8,21 @@ class ProductsBlock &lt; Block
8 8 block_title(_('Products')) +
9 9 content_tag(
10 10 'ul',
11   - owner.products.map {|product| content_tag('li', link_to(product.name, product.url, :style => 'background-image:url(%s)' % ( product.image ? product.image.public_filename(:minor) : '/images/icons-app/product-default-pic-minor.png' )), :class => 'product' )}
  11 + products.map {|product| content_tag('li', link_to(product.name, product.url, :style => 'background-image:url(%s)' % ( product.image ? product.image.public_filename(:minor) : '/images/icons-app/product-default-pic-minor.png' )), :class => 'product' )}
12 12 )
13 13 end
14 14  
15 15 def footer
16   - link_to(_('View all'), owner.generate_url(:controller => 'catalog', :action => 'index'))
  16 + link_to(_('View all products'), owner.generate_url(:controller => 'catalog', :action => 'index'))
17 17 end
18 18  
19 19 settings_items :product_ids, Array
  20 + def product_ids=(array)
  21 + self.settings[:product_ids] = array
  22 + if self.settings[:product_ids]
  23 + self.settings[:product_ids] = self.settings[:product_ids].map(&:to_i)
  24 + end
  25 + end
20 26  
21 27 def products(reload = false)
22 28 if product_ids.blank?
... ... @@ -31,4 +37,8 @@ class ProductsBlock &lt; Block
31 37 end
32 38 end
33 39  
  40 + def editable?
  41 + true
  42 + end
  43 +
34 44 end
... ...
app/views/box_organizer/_products_block.rhtml 0 → 100644
... ... @@ -0,0 +1,13 @@
  1 +<strong></strong>
  2 +
  3 +<p>
  4 +<strong>
  5 +<%= _('Select the products that must be shown.') %>
  6 +</strong>
  7 +</p>
  8 +
  9 +<% for product in @block.owner.products %>
  10 + <%= check_box_tag("block[product_ids][]", product.id, (!@block.product_ids.blank? && @block.product_ids.include?(product.id)), :id => "block_product_ids_#{product.id}" ) %>
  11 + <label for="block_product_ids_<%= product.id %>"><%= product.name %></label>
  12 + <br/>
  13 +<% end %>
... ...
test/fixtures/roles.yml
... ... @@ -32,6 +32,8 @@ profile_admin:
32 32 key: 'profile_admin'
33 33 name: 'Profile Administrator'
34 34 system: true
  35 + permissions:
  36 + - edit_profile_design
35 37 profile_member:
36 38 id: 6
37 39 key: 'profile_member'
... ...
test/functional/profile_design_controller_test.rb
... ... @@ -5,12 +5,13 @@ class ProfileDesignController; def rescue_action(e) raise e end; end
5 5  
6 6 class ProfileDesignControllerTest < Test::Unit::TestCase
7 7  
  8 + attr_reader :holder
8 9 def setup
9 10 @controller = ProfileDesignController.new
10 11 @request = ActionController::TestRequest.new
11 12 @response = ActionController::TestResponse.new
12 13  
13   - holder = create_user('designtestuser').person
  14 + @holder = create_user('designtestuser').person
14 15 holder.save!
15 16  
16 17 @box1 = Box.new
... ... @@ -59,11 +60,11 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
59 60 @request.env['HTTP_REFERER'] = '/editor'
60 61  
61 62 @controller.stubs(:boxes_holder).returns(holder)
62   - login_as 'ze'
  63 + login_as 'designtestuser'
63 64 end
64 65  
65 66 def test_local_files_reference
66   - assert_local_files_reference :get, :index, :profile => 'ze'
  67 + assert_local_files_reference :get, :index, :profile => 'designtestuser'
67 68 end
68 69  
69 70 def test_valid_xhtml
... ... @@ -74,7 +75,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
74 75 # BEGIN - tests for BoxOrganizerController features
75 76 ######################################################
76 77 def test_should_move_block_to_the_end_of_another_block
77   - get :move_block, :profile => 'ze', :id => "block-#{@b1.id}", :target => "end-of-box-#{@box2.id}"
  78 + get :move_block, :profile => 'designtestuser', :id => "block-#{@b1.id}", :target => "end-of-box-#{@box2.id}"
78 79  
79 80 assert_response :success
80 81  
... ... @@ -88,7 +89,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
88 89  
89 90 def test_should_move_block_to_the_middle_of_another_block
90 91 # block 4 is in box 2
91   - get :move_block, :profile => 'ze', :id => "block-#{@b1.id}", :target => "before-block-#{@b4.id}"
  92 + get :move_block, :profile => 'designtestuser', :id => "block-#{@b1.id}", :target => "before-block-#{@b4.id}"
92 93  
93 94 assert_response :success
94 95  
... ... @@ -101,7 +102,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
101 102 end
102 103  
103 104 def test_block_can_be_moved_up
104   - get :move_block, :profile => 'ze', :id => "block-#{@b4.id}", :target => "before-block-#{@b3.id}"
  105 + get :move_block, :profile => 'designtestuser', :id => "block-#{@b4.id}", :target => "before-block-#{@b3.id}"
105 106  
106 107 assert_response :success
107 108 @b4.reload
... ... @@ -114,7 +115,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
114 115 assert_equal [1,2,3], [@b3,@b4,@b5].map {|item| item.position}
115 116  
116 117 # b3 -> before b5
117   - get :move_block, :profile => 'ze', :id => "block-#{@b3.id}", :target => "before-block-#{@b5.id}"
  118 + get :move_block, :profile => 'designtestuser', :id => "block-#{@b3.id}", :target => "before-block-#{@b5.id}"
118 119  
119 120 [@b3,@b4,@b5].each do |item|
120 121 item.reload
... ... @@ -124,7 +125,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
124 125 end
125 126  
126 127 def test_should_be_able_to_move_block_directly_down
127   - post :move_block_down, :profile => 'ze', :id => @b1.id
  128 + post :move_block_down, :profile => 'designtestuser', :id => @b1.id
128 129 assert_response :redirect
129 130  
130 131 @b1.reload
... ... @@ -134,7 +135,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
134 135 end
135 136  
136 137 def test_should_be_able_to_move_block_directly_up
137   - post :move_block_up, :profile => 'ze', :id => @b2.id
  138 + post :move_block_up, :profile => 'designtestuser', :id => @b2.id
138 139 assert_response :redirect
139 140  
140 141 @b1.reload
... ... @@ -145,7 +146,7 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
145 146  
146 147 def test_should_remove_block
147 148 assert_difference Block, :count, -1 do
148   - post :remove, :profile => 'ze', :id => @b2.id
  149 + post :remove, :profile => 'designtestuser', :id => @b2.id
149 150 assert_response :redirect
150 151 assert_redirected_to :action => 'index'
151 152 end
... ... @@ -160,14 +161,14 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
160 161 ######################################################
161 162  
162 163 should 'display popup for adding a new block' do
163   - get :add_block, :profile => 'ze'
  164 + get :add_block, :profile => 'designtestuser'
164 165 assert_response :success
165 166 assert_no_tag :tag => 'body' # e.g. no layout
166 167 end
167 168  
168 169 should 'actually add a new block' do
169 170 assert_difference Block, :count do
170   - post :add_block, :profile => 'ze', :box_id => @box1.id, :type => RecentDocumentsBlock.name
  171 + post :add_block, :profile => 'designtestuser', :box_id => @box1.id, :type => RecentDocumentsBlock.name
171 172 assert_redirected_to :action => 'index'
172 173 end
173 174 end
... ... @@ -175,19 +176,19 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
175 176 should 'not allow to create unknown types' do
176 177 assert_no_difference Block, :count do
177 178 assert_raise ArgumentError do
178   - post :add_block, :profile => 'ze', :box_id => @box1.id, :type => "PleaseLetMeCrackYourSite"
  179 + post :add_block, :profile => 'designtestuser', :box_id => @box1.id, :type => "PleaseLetMeCrackYourSite"
179 180 end
180 181 end
181 182 end
182 183  
183 184 should 'provide edit screen for blocks' do
184   - get :edit, :profile => 'ze', :id => @b1.id
  185 + get :edit, :profile => 'designtestuser', :id => @b1.id
185 186 assert_template 'edit'
186 187 assert_no_tag :tag => 'body' # e.g. no layout
187 188 end
188 189  
189 190 should 'be able to save a block' do
190   - post :save, :profile => 'ze', :id => @b1.id, :block => { :article_id => 999 }
  191 + post :save, :profile => 'designtestuser', :id => @b1.id, :block => { :article_id => 999 }
191 192  
192 193 assert_redirected_to :action => 'index'
193 194  
... ... @@ -195,6 +196,45 @@ class ProfileDesignControllerTest &lt; Test::Unit::TestCase
195 196 assert_equal 999, @b1.article_id
196 197 end
197 198  
  199 + should 'be able to edit ProductsBlock' do
  200 + block = ProductsBlock.new
  201 +
  202 + enterprise = Enterprise.create!(:name => "test", :identifier => 'testenterprise')
  203 + p1 = enterprise.products.create!(:name => 'product one')
  204 + p2 = enterprise.products.create!(:name => 'product two')
  205 + enterprise.boxes.first.blocks << block
  206 + enterprise.add_admin(holder)
  207 +
  208 + @controller.stubs(:boxes_holder).returns(enterprise)
  209 + login_as('designtestuser')
  210 +
  211 + get :edit, :profile => 'testenterprise', :id => block.id
  212 +
  213 + assert_response :success
  214 + assert_tag :tag => 'input', :attributes => { :name => "block[product_ids][]", :value => p1.id.to_s }
  215 + assert_tag :tag => 'input', :attributes => { :name => "block[product_ids][]", :value => p2.id.to_s }
  216 + end
  217 +
  218 + should 'be able to save ProductsBlock' do
  219 + block = ProductsBlock.new
  220 +
  221 + enterprise = Enterprise.create!(:name => "test", :identifier => 'testenterprise')
  222 + p1 = enterprise.products.create!(:name => 'product one')
  223 + p2 = enterprise.products.create!(:name => 'product two')
  224 + enterprise.boxes.first.blocks << block
  225 + enterprise.add_admin(holder)
  226 +
  227 + @controller.stubs(:boxes_holder).returns(enterprise)
  228 + login_as('designtestuser')
  229 +
  230 + post :save, :profile => 'testenterprise', :id => block.id, :block => { :product_ids => [p1.id.to_s, p2.id.to_s ] }
  231 +
  232 + assert_response :redirect
  233 +
  234 + block.reload
  235 + assert_equal [p1.id, p2.id], block.product_ids
  236 +
  237 + end
198 238  
199 239 end
200 240  
... ...
test/unit/article_block_test.rb
... ... @@ -52,4 +52,8 @@ class ArticleBlockTest &lt; Test::Unit::TestCase
52 52 assert_nil block.article_id
53 53 end
54 54  
  55 + should 'be editable' do
  56 + assert ArticleBlock.new.editable?
  57 + end
  58 +
55 59 end
... ...
test/unit/block_test.rb
... ... @@ -32,4 +32,8 @@ class BlockTest &lt; Test::Unit::TestCase
32 32 assert_nil Block.new.footer
33 33 end
34 34  
  35 + should 'not be editable by default' do
  36 + assert !Block.new.editable?
  37 + end
  38 +
35 39 end
... ...
test/unit/lightbox_helper_test.rb
... ... @@ -44,6 +44,12 @@ class LightboxHelperTest &lt; Test::Unit::TestCase
44 44 assert_equal '[button]', lightbox_button('type', 'label', { :action => 'popup'})
45 45 end
46 46  
  47 + should 'provide lightbox_icon_button' do
  48 + expects(:icon_button).with('type', 'label', { :action => 'popup'}, { :class => 'lbOn' }).returns('[button]')
  49 +
  50 + assert_equal '[button]', lightbox_icon_button('type', 'label', { :action => 'popup'})
  51 + end
  52 +
47 53 should 'tell if rendering inside lightbox' do
48 54 request = mock
49 55 expects(:request).returns(request)
... ...
test/unit/products_block_test.rb
... ... @@ -11,14 +11,13 @@ class ProductsBlockTest &lt; ActiveSupport::TestCase
11 11 assert_kind_of Block, block
12 12 end
13 13  
14   - should "list owner's products" do
  14 + should "list owner products" do
15 15  
16 16 enterprise = Enterprise.create!(:name => 'testenterprise', :identifier => 'testenterprise')
17 17 enterprise.products.create!(:name => 'product one')
18 18 enterprise.products.create!(:name => 'product two')
19 19  
20   - block.stubs(:owner).returns(enterprise)
21   -
  20 + block.expects(:products).returns(enterprise.products)
22 21  
23 22 content = block.content
24 23  
... ... @@ -38,7 +37,7 @@ class ProductsBlockTest &lt; ActiveSupport::TestCase
38 37  
39 38 footer = block.footer
40 39  
41   - assert_tag_in_string footer, :tag => 'a', :attributes => { :href => /\/catalog\/testenterprise$/ }, :content => 'View all'
  40 + assert_tag_in_string footer, :tag => 'a', :attributes => { :href => /\/catalog\/testenterprise$/ }, :content => 'View all products'
42 41 end
43 42  
44 43 should 'list 4 random products by default' do
... ... @@ -94,4 +93,14 @@ class ProductsBlockTest &lt; ActiveSupport::TestCase
94 93 assert_equal [p1.id, p2.id], ProductsBlock.find(block.id).product_ids
95 94 end
96 95  
  96 + should 'accept strings in product_ids but store integers' do
  97 + block = ProductsBlock.new
  98 + block.product_ids = [ '1', '2']
  99 + assert_equal [1, 2], block.product_ids
  100 + end
  101 +
  102 + should 'be editable' do
  103 + assert ProductsBlock.new.editable?
  104 + end
  105 +
97 106 end
... ...