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