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 | |