Commit 969dd1a39e39601c6dc09b844dd86ef0da1b9cf9
Committed by
Rodrigo Souto
1 parent
4c1e0c9f
Exists in
master
and in
22 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 | 2 | |
| 3 | 3 | attr_accessible :title, :display, :limit, :box_id, :posts_per_page, |
| 4 | 4 | :visualization_format, :language, :display_user, |
| 5 | - :box, :edit_modes, :move_modes | |
| 5 | + :box, :edit_modes, :move_modes, :mirror | |
| 6 | 6 | |
| 7 | 7 | # to be able to generate HTML |
| 8 | 8 | include ActionView::Helpers::UrlHelper |
| ... | ... | @@ -15,11 +15,23 @@ class Block < ActiveRecord::Base |
| 15 | 15 | |
| 16 | 16 | acts_as_list :scope => :box |
| 17 | 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 | 21 | acts_as_having_settings |
| 20 | 22 | |
| 21 | 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 | 35 | def embedable? |
| 24 | 36 | false |
| 25 | 37 | end |
| ... | ... | @@ -269,6 +281,10 @@ class Block < ActiveRecord::Base |
| 269 | 281 | self.position = block.position |
| 270 | 282 | end |
| 271 | 283 | |
| 284 | + def add_observer(block) | |
| 285 | + self.observers << block | |
| 286 | + end | |
| 287 | + | |
| 272 | 288 | private |
| 273 | 289 | |
| 274 | 290 | def home_page_path | ... | ... |
app/models/profile.rb
| ... | ... | @@ -392,6 +392,9 @@ class Profile < ActiveRecord::Base |
| 392 | 392 | new_block = block.class.new(:title => block[:title]) |
| 393 | 393 | new_block.copy_from(block) |
| 394 | 394 | new_box.blocks << new_block |
| 395 | + if block.mirror? | |
| 396 | + block.add_observer(new_block) | |
| 397 | + end | |
| 395 | 398 | end |
| 396 | 399 | end |
| 397 | 400 | end | ... | ... |
app/views/box_organizer/edit.html.erb
| ... | ... | @@ -25,6 +25,11 @@ |
| 25 | 25 | </div> |
| 26 | 26 | <div class="move-modes"> |
| 27 | 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 | 33 | </div> |
| 29 | 34 | <% end %> |
| 30 | 35 | ... | ... |
| ... | ... | @@ -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 | 183 | t.string "type" |
| 184 | 184 | t.text "settings" |
| 185 | 185 | t.integer "position" |
| 186 | - t.boolean "enabled", :default => true | |
| 186 | + t.boolean "enabled", :default => true | |
| 187 | 187 | t.datetime "created_at" |
| 188 | 188 | t.datetime "updated_at" |
| 189 | 189 | t.datetime "fetched_at" |
| 190 | + t.boolean "mirror", :default => false | |
| 191 | + t.integer "mirror_block_id" | |
| 192 | + t.integer "observers_id" | |
| 190 | 193 | end |
| 191 | 194 | |
| 192 | 195 | add_index "blocks", ["box_id"], :name => "index_blocks_on_box_id" | ... | ... |
| ... | ... | @@ -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 | 1122 | assert_equal 'default title', p.boxes[0].blocks.first[:title] |
| 1123 | 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 | 1142 | TMP_THEMES_DIR = Rails.root.join('test', 'tmp', 'profile_themes') |
| 1126 | 1143 | should 'have themes' do |
| 1127 | 1144 | Theme.stubs(:user_themes_dir).returns(TMP_THEMES_DIR) | ... | ... |