revisions can be restored
Oleg
committed May 06, 2011
commit 1d248e628d64e0e1b4f88d1dfb6cb6bc253e8140
Showing 3
changed files with
52 additions
and 5 deletions
comfortable_mexican_sofa/has_revisions.rb b/lib/comfortable_mexican_sofa/has_revisions.rb
+9
-1
| @@ | @@ -14,7 +14,7 @@ module ComfortableMexicanSofa::HasRevisions |
| has_many :revisions, | |
| :as => :record, | |
| :dependent => :destroy | |
| - | |
| + | |
| before_save :prepare_revision | |
| after_save :create_revision | |
| @@ | @@ -26,6 +26,7 @@ module ComfortableMexicanSofa::HasRevisions |
| module InstanceMethods | |
| + | # Preparing revision data. A bit of a special thing to grab page blocks |
| def prepare_revision | |
| if (self.respond_to?(:blocks_attributes_changed) && self.blocks_attributes_changed) || | |
| !(self.changed & revision_fields).empty? | |
| @@ | @@ -36,10 +37,17 @@ module ComfortableMexicanSofa::HasRevisions |
| end | |
| end | |
| + | # Revision is created only if relevant data changed |
| def create_revision | |
| return unless self.revision_data | |
| self.revisions.create!(:data => self.revision_data) | |
| end | |
| + | |
| + | # Assigning whatever is found in revision data and attemptint to save the object |
| + | def restore_from_revision(revision) |
| + | return unless revision.record == self |
| + | self.update_attributes!(revision.data) |
| + | end |
| end | |
| end | |
test/fixtures/cms/revisions.yml
+3
-2
| @@ | @@ -7,12 +7,13 @@ layout: |
| page: | |
| record: default (Cms::Page) | |
| - | data: <%= [ |
| + | data: <%= { |
| + | 'blocks_attributes' => [ |
| { 'label' => 'default_page_text', | |
| 'content' => 'revision page content' }, | |
| { 'label' => 'default_field_text', | |
| 'content' => 'revision field content'} | |
| - | ].to_yaml.inspect %> |
| + | ]}.to_yaml.inspect %> |
| snippet: | |
| record: default (Cms::Snippet) | |
test/unit/revisions_test.rb
+40
-2
| @@ | @@ -8,10 +8,10 @@ class RevisionsTest < ActiveSupport::TestCase |
| 'css' => 'revision css', | |
| 'js' => 'revision js' }), cms_revisions(:layout).data | |
| - | assert_equal ([ |
| + | assert_equal ({'blocks_attributes' => [ |
| { 'label' => 'default_page_text', 'content' => 'revision page content' }, | |
| { 'label' => 'default_field_text', 'content' => 'revision field content' } | |
| - | ]), cms_revisions(:page).data |
| + | ]}), cms_revisions(:page).data |
| assert_equal ({ | |
| 'content' => 'revision content' | |
| @@ | @@ -103,4 +103,42 @@ class RevisionsTest < ActiveSupport::TestCase |
| end | |
| end | |
| + | def test_restore_from_revision_for_layout |
| + | layout = cms_layouts(:default) |
| + | revision = cms_revisions(:layout) |
| + | |
| + | assert_difference 'layout.revisions.count' do |
| + | layout.restore_from_revision(revision) |
| + | layout.reload |
| + | assert_equal 'revision {{cms:page:default_page_text}}', layout.content |
| + | assert_equal 'revision css', layout.css |
| + | assert_equal 'revision js', layout.js |
| + | end |
| + | end |
| + | |
| + | def test_restore_from_revision_for_page |
| + | page = cms_pages(:default) |
| + | revision = cms_revisions(:page) |
| + | |
| + | assert_difference 'page.revisions.count' do |
| + | page.restore_from_revision(revision) |
| + | page.reload |
| + | assert_equal [ |
| + | { :label => 'default_field_text', :content => 'revision field content' }, |
| + | { :label => 'default_page_text', :content => 'revision page content' } |
| + | ], page.blocks_attributes |
| + | end |
| + | end |
| + | |
| + | def test_restore_from_revision_for_snippet |
| + | snippet = cms_snippets(:default) |
| + | revision = cms_revisions(:snippet) |
| + | |
| + | assert_difference 'snippet.revisions.count' do |
| + | snippet.restore_from_revision(revision) |
| + | snippet.reload |
| + | assert_equal 'revision content', snippet.content |
| + | end |
| + | end |
| + | |
| end | |
| \ No newline at end of file | |