mirroring functionality works now (kinda... but better!)

Oleg committed Feb 23, 2012
commit d47e9814e176f0fce36059f0ec58fd4fe0d246f1
Showing 6 changed files with 126 additions and 20 deletions
app/models/cms/site.rb +17 -4
@@ @@ -5,16 +5,17 @@ class Cms::Site < ActiveRecord::Base
self.table_name = 'cms_sites'
# -- Relationships --------------------------------------------------------
- has_many :layouts, :dependent => :destroy
- has_many :pages, :dependent => :destroy
- has_many :snippets, :dependent => :destroy
+ has_many :layouts, :dependent => :delete_all
+ has_many :pages, :dependent => :delete_all
+ has_many :snippets, :dependent => :delete_all
has_many :files, :dependent => :destroy
- has_many :categories, :dependent => :destroy
+ has_many :categories, :dependent => :delete_all
# -- Callbacks ------------------------------------------------------------
before_validation :assign_identifier,
:assign_label
before_save :clean_path
+ after_save :sync_mirrors
# -- Validations ----------------------------------------------------------
validates :identifier,
@@ @@ -63,4 +64,16 @@ protected
self.path.gsub!(/\/$/, '')
end
+ # When site is marked as a mirror we need to sync its structure
+ # with other mirrors.
+ def sync_mirrors
+ return unless is_mirrored_changed? && is_mirrored?
+
+ [self, Cms::Site.mirrored.where("id != #{id}").first].compact.each do |site|
+ (site.layouts(:reload).roots + site.layouts.roots.map(&:descendants)).flatten.map(&:sync_mirror)
+ (site.pages(:reload).roots + site.pages.roots.map(&:descendants)).flatten.map(&:sync_mirror)
+ site.snippets(:reload).map(&:sync_mirror)
+ end
+ end
+
end
\ No newline at end of file
app/views/cms_admin/pages/_index_branch.html.erb +1 -1
@@ @@ -29,7 +29,7 @@
<%= link_to page.label, edit_cms_admin_site_page_path(@site, page) %>
<%= render :partial => '/cms_admin/categories/categories', :object => page %>
<div class='sublabel'>
- <%= link_to page.url, page.full_path, :target => '_blank' %>
+ <%= link_to page.url, page.url, :target => '_blank' %>
</div>
</div>
</div>
comfortable_mexican_sofa/extensions/acts_as_tree.rb b/lib/comfortable_mexican_sofa/extensions/acts_as_tree.rb +1 -1
@@ @@ -46,8 +46,8 @@ module ComfortableMexicanSofa::ActsAsTree
end
end
end
-
EOV
+
end
end
comfortable_mexican_sofa/extensions/is_mirrored.rb b/lib/comfortable_mexican_sofa/extensions/is_mirrored.rb +2 -2
@@ @@ -33,7 +33,7 @@ module ComfortableMexicanSofa::IsMirrored
# but content is unique. When updating need to grab mirrors based on
# self.slug_was, new objects will use self.slug.
def sync_mirror
- return if self.is_mirrored
+ return if self.is_mirrored || !self.site.is_mirrored?
(Cms::Site.mirrored - [self.site]).each do |site|
mirror = case self
@@ @@ -68,7 +68,7 @@ module ComfortableMexicanSofa::IsMirrored
# Mirrors should be destroyed
def destroy_mirror
- return if self.is_mirrored
+ return if self.is_mirrored || !self.site.is_mirrored?
mirrors.each do |mirror|
mirror.is_mirrored = true
mirror.destroy
comfortable_mexican_sofa/fixtures.rb b/lib/comfortable_mexican_sofa/fixtures.rb +6 -6
@@ @@ -16,7 +16,7 @@ module ComfortableMexicanSofa::Fixtures
site = Cms::Site.find_or_create_by_hostname(to_hostname)
unless path ||= find_fixtures_path((from_hostname || to_hostname), 'layouts')
ComfortableMexicanSofa.logger.warn('Cannot find Layout fixtures')
- return
+ return []
end
Dir.glob("#{path}/*").select{|f| File.directory?(f)}.each do |path|
@@ @@ -60,7 +60,7 @@ module ComfortableMexicanSofa::Fixtures
ComfortableMexicanSofa.logger.warn("[Fixtures] Saved Layout {#{layout.identifier}}")
else
ComfortableMexicanSofa.logger.error("[Fixtures] Failed to save Layout {#{layout.errors.inspect}}")
- return
+ next
end
end
layout_ids << layout.id
@@ @@ -83,7 +83,7 @@ module ComfortableMexicanSofa::Fixtures
site = Cms::Site.find_or_create_by_hostname(to_hostname)
unless path ||= find_fixtures_path((from_hostname || to_hostname), 'pages')
ComfortableMexicanSofa.logger.warn('Cannot find Page fixtures')
- return
+ return []
end
Dir.glob("#{path}/*").select{|f| File.directory?(f)}.each do |path|
@@ @@ -138,7 +138,7 @@ module ComfortableMexicanSofa::Fixtures
ComfortableMexicanSofa.logger.warn("[Fixtures] Saved Page {#{page.full_path}}")
else
ComfortableMexicanSofa.logger.warn("[Fixtures] Failed to save Page {#{page.errors.inspect}}")
- return
+ next
end
end
page_ids << page.id
@@ @@ -161,7 +161,7 @@ module ComfortableMexicanSofa::Fixtures
site = Cms::Site.find_or_create_by_hostname(to_hostname)
unless path = find_fixtures_path((from_hostname || to_hostname), 'snippets')
ComfortableMexicanSofa.logger.warn('Cannot find Snippet fixtures')
- return
+ return []
end
snippet_ids = []
@@ @@ -192,7 +192,7 @@ module ComfortableMexicanSofa::Fixtures
ComfortableMexicanSofa.logger.warn("[Fixtures] Saved Snippet {#{snippet.identifier}}")
else
ComfortableMexicanSofa.logger.warn("[Fixtures] Failed to save Snippet {#{snippet.errors.inspect}}")
- return
+ next
end
end
snippet_ids << snippet.id
test/unit/mirrors_test.rb +99 -6
@@ @@ -2,13 +2,8 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
class MirrorsTest < ActiveSupport::TestCase
- def setup
- Cms::Site.delete_all
- @site_a = Cms::Site.create!(:identifier => 'site_a', :hostname => 'site-a.host', :is_mirrored => true)
- @site_b = Cms::Site.create!(:identifier => 'site_b', :hostname => 'site-b.host', :is_mirrored => true)
- end
-
def test_layout_creation
+ setup_sites
assert_difference 'Cms::Layout.count', 2 do
layout = @site_a.layouts.create!(:identifier => 'test')
assert_equal 1, layout.mirrors.size
@@ @@ -17,6 +12,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_page_creation
+ setup_sites
layout = @site_a.layouts.create!(:identifier => 'test')
assert_difference 'Cms::Page.count', 2 do
@@ @@ -30,6 +26,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_snippet_creation
+ setup_sites
assert_difference 'Cms::Snippet.count', 2 do
snippet = @site_a.snippets.create(:identifier => 'test')
assert_equal 1, snippet.mirrors.size
@@ @@ -38,6 +35,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_layout_update
+ setup_sites
layout_1a = @site_a.layouts.create!(:identifier => 'test_a')
layout_1b = @site_a.layouts.create!(:identifier => 'test_b')
layout_1c = @site_a.layouts.create!(:identifier => 'nested', :parent => layout_1a)
@@ @@ -59,6 +57,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_page_update
+ setup_sites
layout_1a = @site_a.layouts.create!(:identifier => 'test_a')
layout_1b = @site_a.layouts.create!(:identifier => 'test_b')
@@ @@ -84,6 +83,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_snippet_update
+ setup_sites
snippet_1 = @site_a.snippets.create(:identifier => 'test')
assert snippet_2 = snippet_1.mirrors.first
snippet_1.update_attributes!(
@@ @@ -96,6 +96,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_layout_destroy
+ setup_sites
layout_1a = @site_a.layouts.create!(:identifier => 'test_a')
layout_1b = @site_a.layouts.create!(:identifier => 'test_b')
layout_1c = @site_a.layouts.create!(:identifier => 'nested', :parent => layout_1b)
@@ @@ -116,6 +117,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_page_destroy
+ setup_sites
layout = @site_a.layouts.create!(:identifier => 'test')
page_1r = @site_a.pages.create!(:slug => 'root', :layout => layout)
page_1a = @site_a.pages.create!(:slug => 'test_a', :layout => layout)
@@ @@ -137,6 +139,7 @@ class MirrorsTest < ActiveSupport::TestCase
end
def test_snippet_destroy
+ setup_sites
snippet_1 = @site_a.snippets.create(:identifier => 'test')
assert snippet_2 = snippet_1.mirrors.first
@@ @@ -146,4 +149,94 @@ class MirrorsTest < ActiveSupport::TestCase
end
end
+ def test_site_creation_as_mirror
+ site = cms_sites(:default)
+ Cms::Site.update_all(:is_mirrored => true) # bypassing callbacks
+
+ assert_difference 'Cms::Site.count' do
+ assert_difference 'Cms::Layout.count', site.layouts.count do
+ assert_difference 'Cms::Page.count', site.pages.count do
+ assert_difference 'Cms::Snippet.count', site.snippets.count do
+ mirror = Cms::Site.create!(
+ :identifier => 'mirror',
+ :hostname => 'mirror.host',
+ :is_mirrored => true
+ )
+ end
+ end
+ end
+ end
+ end
+
+ def test_site_update_to_mirror
+ site = cms_sites(:default)
+ Cms::Site.update_all(:is_mirrored => true) # bypassing callbacks
+
+ mirror = Cms::Site.create!(
+ :identifier => 'mirror',
+ :hostname => 'mirror.host'
+ )
+ layout = mirror.layouts.create!(
+ :identifier => 'mirror_layout'
+ )
+ home_page = mirror.pages.create!(
+ :label => 'mirror home',
+ :layout => layout
+ )
+ child_page = mirror.pages.create!(
+ :label => 'mirror child',
+ :layout => layout,
+ :slug => 'mirror-child',
+ :parent => home_page
+ )
+ snippet = mirror.snippets.create!(
+ :identifier => 'mirror_snippet'
+ )
+
+ assert_difference ['site.layouts.count', 'site.pages.count', 'site.snippets.count'], 1 do
+ assert_difference 'mirror.layouts.count', 3 do
+ assert_difference 'mirror.pages.count', 1 do
+ assert_difference 'mirror.snippets.count', 1 do
+
+ mirror.update_attribute(:is_mirrored, true)
+
+ site.reload
+ assert site.layouts.where(:identifier => 'mirror_layout').present?
+ assert site.pages.where(:slug => 'mirror-child').present?
+ assert site.snippets.where(:identifier => 'mirror_snippet').present?
+
+ mirror.reload
+ assert mirror.layouts.where(:identifier => 'default').present?
+ assert mirror.pages.where(:slug => 'child-page').present?
+ assert mirror.snippets.where(:identifier => 'default').present?
+ end
+ end
+ end
+ end
+ end
+
+ def test_site_destruction
+ site = cms_sites(:default)
+ Cms::Site.update_all(:is_mirrored => true) # bypassing callbacks
+
+ mirror = Cms::Site.create!(
+ :identifier => 'mirror',
+ :hostname => 'mirror.host',
+ :is_mirrored => true
+ )
+ mirror.reload
+
+ assert_no_difference ['site.layouts.count', 'site.pages.count', 'site.snippets.count'] do
+ mirror.destroy
+ end
+ end
+
+ protected
+
+ def setup_sites
+ Cms::Site.delete_all
+ @site_a = Cms::Site.create!(:identifier => 'site_a', :hostname => 'site-a.host', :is_mirrored => true)
+ @site_b = Cms::Site.create!(:identifier => 'site_b', :hostname => 'site-b.host', :is_mirrored => true)
+ end
+
end
\ No newline at end of file