Commit 969dd1a39e39601c6dc09b844dd86ef0da1b9cf9
Committed by
Rodrigo Souto
1 parent
4c1e0c9f
Exists in
master
and in
29 other branches
Add mirror option for template's blocks. Now if a mirrored block is changed on t…
…he template it is changed on all users that follow that template. Signed-off-by: Arthur Del Esposte <arthurmde@gmail.com> Signed-off-by: Gabriela Navarro <navarro1703@gmail.com> Signed-off-by: Thiago Ribeiro <thiagitosouza@gmail.com>
Showing
7 changed files
with
125 additions
and
2 deletions
Show diff stats
app/models/block.rb
@@ -2,7 +2,7 @@ class Block < ActiveRecord::Base | @@ -2,7 +2,7 @@ class Block < ActiveRecord::Base | ||
2 | 2 | ||
3 | attr_accessible :title, :display, :limit, :box_id, :posts_per_page, | 3 | attr_accessible :title, :display, :limit, :box_id, :posts_per_page, |
4 | :visualization_format, :language, :display_user, | 4 | :visualization_format, :language, :display_user, |
5 | - :box, :edit_modes, :move_modes | 5 | + :box, :edit_modes, :move_modes, :mirror |
6 | 6 | ||
7 | # to be able to generate HTML | 7 | # to be able to generate HTML |
8 | include ActionView::Helpers::UrlHelper | 8 | include ActionView::Helpers::UrlHelper |
@@ -15,11 +15,23 @@ class Block < ActiveRecord::Base | @@ -15,11 +15,23 @@ class Block < ActiveRecord::Base | ||
15 | 15 | ||
16 | acts_as_list :scope => :box | 16 | acts_as_list :scope => :box |
17 | belongs_to :box | 17 | belongs_to :box |
18 | + belongs_to :mirror_block, :class_name => "Block" | ||
19 | + has_many :observers, :class_name => "Block", :foreign_key => "mirror_block_id" | ||
18 | 20 | ||
19 | acts_as_having_settings | 21 | acts_as_having_settings |
20 | 22 | ||
21 | scope :enabled, :conditions => { :enabled => true } | 23 | scope :enabled, :conditions => { :enabled => true } |
22 | 24 | ||
25 | + after_save do |block| | ||
26 | + if block.owner.kind_of?(Profile) && block.owner.is_template? && block.mirror? | ||
27 | + block.observers.each do |observer| | ||
28 | + observer.copy_from(block) | ||
29 | + observer.title = block.title | ||
30 | + observer.save | ||
31 | + end | ||
32 | + end | ||
33 | + end | ||
34 | + | ||
23 | def embedable? | 35 | def embedable? |
24 | false | 36 | false |
25 | end | 37 | end |
@@ -269,6 +281,10 @@ class Block < ActiveRecord::Base | @@ -269,6 +281,10 @@ class Block < ActiveRecord::Base | ||
269 | self.position = block.position | 281 | self.position = block.position |
270 | end | 282 | end |
271 | 283 | ||
284 | + def add_observer(block) | ||
285 | + self.observers << block | ||
286 | + end | ||
287 | + | ||
272 | private | 288 | private |
273 | 289 | ||
274 | def home_page_path | 290 | def home_page_path |
app/models/profile.rb
@@ -392,6 +392,9 @@ class Profile < ActiveRecord::Base | @@ -392,6 +392,9 @@ class Profile < ActiveRecord::Base | ||
392 | new_block = block.class.new(:title => block[:title]) | 392 | new_block = block.class.new(:title => block[:title]) |
393 | new_block.copy_from(block) | 393 | new_block.copy_from(block) |
394 | new_box.blocks << new_block | 394 | new_box.blocks << new_block |
395 | + if block.mirror? | ||
396 | + block.add_observer(new_block) | ||
397 | + end | ||
395 | end | 398 | end |
396 | end | 399 | end |
397 | end | 400 | end |
app/views/box_organizer/edit.html.erb
@@ -25,6 +25,11 @@ | @@ -25,6 +25,11 @@ | ||
25 | </div> | 25 | </div> |
26 | <div class="move-modes"> | 26 | <div class="move-modes"> |
27 | <%= labelled_form_field _('Move options:'), select_tag('block[move_modes]', options_from_collection_for_select(@block.move_block_options, :first, :last, @block.move_modes)) %> | 27 | <%= labelled_form_field _('Move options:'), select_tag('block[move_modes]', options_from_collection_for_select(@block.move_block_options, :first, :last, @block.move_modes)) %> |
28 | + <% end %> | ||
29 | + | ||
30 | + <% if @block.owner.kind_of?(Profile) && @block.owner.is_template? %> | ||
31 | + <div class="mirror_block"> | ||
32 | + <%= labelled_check_box(_("Mirror"), "block[mirror]", value = "1", checked = @block.mirror) %> | ||
28 | </div> | 33 | </div> |
29 | <% end %> | 34 | <% end %> |
30 | 35 |
@@ -0,0 +1,15 @@ | @@ -0,0 +1,15 @@ | ||
1 | +class AddMirrorToBlock < ActiveRecord::Migration | ||
2 | + def up | ||
3 | + change_table :blocks do |t| | ||
4 | + t.boolean :mirror, :default => false | ||
5 | + t.references :mirror_block | ||
6 | + t.references :observers | ||
7 | + end | ||
8 | + end | ||
9 | + | ||
10 | + def down | ||
11 | + remove_column :blocks, :mirror | ||
12 | + remove_column :blocks, :mirror_block_id | ||
13 | + remove_column :blocks, :observers_id | ||
14 | + end | ||
15 | +end |
db/schema.rb
@@ -183,10 +183,13 @@ ActiveRecord::Schema.define(:version => 20150513213939) do | @@ -183,10 +183,13 @@ ActiveRecord::Schema.define(:version => 20150513213939) do | ||
183 | t.string "type" | 183 | t.string "type" |
184 | t.text "settings" | 184 | t.text "settings" |
185 | t.integer "position" | 185 | t.integer "position" |
186 | - t.boolean "enabled", :default => true | 186 | + t.boolean "enabled", :default => true |
187 | t.datetime "created_at" | 187 | t.datetime "created_at" |
188 | t.datetime "updated_at" | 188 | t.datetime "updated_at" |
189 | t.datetime "fetched_at" | 189 | t.datetime "fetched_at" |
190 | + t.boolean "mirror", :default => false | ||
191 | + t.integer "mirror_block_id" | ||
192 | + t.integer "observers_id" | ||
190 | end | 193 | end |
191 | 194 | ||
192 | add_index "blocks", ["box_id"], :name => "index_blocks_on_box_id" | 195 | add_index "blocks", ["box_id"], :name => "index_blocks_on_box_id" |
@@ -0,0 +1,64 @@ | @@ -0,0 +1,64 @@ | ||
1 | +Feature: user template | ||
2 | + As an user | ||
3 | + I want to create templates with mirror blocks | ||
4 | + In order to keep these blocks always updated | ||
5 | + | ||
6 | + Background: | ||
7 | + Given the following users | ||
8 | + | login | name | is_template | | ||
9 | + | person | person | true | | ||
10 | + And the following blocks | ||
11 | + | owner | type | mirror | | ||
12 | + | person | ArticleBlock | true | | ||
13 | + | person | RawHTMLBlock | false | | ||
14 | + And I go to /account/signup | ||
15 | + And I fill in "Username" with "mario" | ||
16 | + And I fill in "Password" with "123456" | ||
17 | + And I fill in "Password confirmation" with "123456" | ||
18 | + And I fill in "e-Mail" with "mario@mario.com" | ||
19 | + And I fill in "Full name" with "Mario" | ||
20 | + And wait for the captcha signup time | ||
21 | + And I press "Create my account" | ||
22 | + And I am logged in as admin | ||
23 | + | ||
24 | + @selenium | ||
25 | + Scenario: The block Article name is changed | ||
26 | + Given I am on person's control panel | ||
27 | + And I follow "Edit sideboxes" | ||
28 | + And display ".button-bar" | ||
29 | + And I follow "Edit" within ".article-block" | ||
30 | + And I fill in "Custom title for this block:" with "Mirror" | ||
31 | + And I press "Save" | ||
32 | + And I go to /profile/mario | ||
33 | + Then I should see "Mirror" | ||
34 | + | ||
35 | + @selenium | ||
36 | + Scenario: The block LinkList is changed but the user's block doesnt change | ||
37 | + Given I am on person's control panel | ||
38 | + And I follow "Edit sideboxes" | ||
39 | + And display ".button-bar" | ||
40 | + And I follow "Edit" within ".raw-html-block" | ||
41 | + And I fill in "Custom title for this block:" with "Raw HTML Block" | ||
42 | + And I press "Save" | ||
43 | + And I go to /profile/mario | ||
44 | + Then I should not see "Raw HTML Block" | ||
45 | + | ||
46 | + @selenium | ||
47 | + Scenario: The block Article cannot move or modify | ||
48 | + Given I am on person's control panel | ||
49 | + And I follow "Edit sideboxes" | ||
50 | + And display ".button-bar" | ||
51 | + And I follow "Edit" within ".article-block" | ||
52 | + And I select "Cannot be moved" from "Move options:" | ||
53 | + And I select "Cannot be modified" from "Edit options:" | ||
54 | + And I press "Save" | ||
55 | + And I follow "Logout" | ||
56 | + And Mario's account is activated | ||
57 | + And I follow "Login" | ||
58 | + And I fill in "Username / Email" with "mario" | ||
59 | + And I fill in "Password" with "123456" | ||
60 | + And I press "Log in" | ||
61 | + And I go to /myprofile/mario | ||
62 | + And I follow "Edit sideboxes" | ||
63 | + And display ".button-bar" | ||
64 | + Then I should not see "Edit" within ".article-block" |
test/unit/profile_test.rb
@@ -1122,6 +1122,23 @@ class ProfileTest < ActiveSupport::TestCase | @@ -1122,6 +1122,23 @@ class ProfileTest < ActiveSupport::TestCase | ||
1122 | assert_equal 'default title', p.boxes[0].blocks.first[:title] | 1122 | assert_equal 'default title', p.boxes[0].blocks.first[:title] |
1123 | end | 1123 | end |
1124 | 1124 | ||
1125 | + should 'have blocks observer on template when applying template with mirror' do | ||
1126 | + template = fast_create(Profile) | ||
1127 | + template.boxes.destroy_all | ||
1128 | + template.boxes << Box.new | ||
1129 | + b = Block.new(:title => 'default title', :mirror => true) | ||
1130 | + template.boxes[0].blocks << b | ||
1131 | + | ||
1132 | + p = create(Profile) | ||
1133 | + assert !b[:title].blank? | ||
1134 | + | ||
1135 | + p.copy_blocks_from(template) | ||
1136 | + | ||
1137 | + assert_equal 'default title', p.boxes[0].blocks.first[:title] | ||
1138 | + assert_equal p.boxes[0].blocks.first, template.boxes[0].blocks.first.observers.first | ||
1139 | + | ||
1140 | + end | ||
1141 | + | ||
1125 | TMP_THEMES_DIR = Rails.root.join('test', 'tmp', 'profile_themes') | 1142 | TMP_THEMES_DIR = Rails.root.join('test', 'tmp', 'profile_themes') |
1126 | should 'have themes' do | 1143 | should 'have themes' do |
1127 | Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | 1144 | Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) |