diff --git a/History.txt b/History.txt index cbf665e2..245c246c 100644 --- a/History.txt +++ b/History.txt @@ -7,6 +7,7 @@ * Added login retry wait delay on failures. * Added support for 'in home' or 'from home' in sqliss. * Added support for any scope with 'in sub_nodes' (uses fullpath field). + * Added forced skin setting for sites (overwrites all but ACL skin settings). <== TODO: Document * Minor changes * Fixed gemspec to not include TextMate helper and selenium plugin. diff --git a/app/models/site.rb b/app/models/site.rb index b1b7a04e..d78ad611 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -62,7 +62,7 @@ class Site < ActiveRecord::Base validate :valid_site validates_uniqueness_of :host - attr_accessible :name, :languages, :default_lang, :authentication, :http_auth, :ssl_on_auth, :auto_publish, :redit_time, :api_group_id, :home_zip + attr_accessible :name, :languages, :default_lang, :authentication, :http_auth, :ssl_on_auth, :auto_publish, :redit_time, :api_group_id, :home_zip, :skin_zip has_many :groups, :order => "name" has_many :nodes has_many :users @@ -405,6 +405,30 @@ def home_zip=(zip) @home_zip_error = _('could not be found') end end + + def skin_zip + skin ? skin.zip : nil + end + + def skin_zip=(zip) + if zip.blank? + self[:skin_id] = nil + else + if id = secure(Node) { Node.translate_pseudo_id(zip) } + self[:skin_id] = id + else + @skin_zip_error = _('could not be found') + end + end + end + + def skin + secure(Skin) { Skin.find_by_id(skin_id) } + end + + def skin_id + @alias && @alias[:skin_id] || self[:skin_id] + end def create_alias(hostname) raise "Hostname '#{hostname}' already exists" if Site.find_by_host(hostname) @@ -604,9 +628,14 @@ def valid_site end if @home_zip_error - errors.add('root_id', @home_zip_error) + errors.add('root_zip', @home_zip_error) @home_zip_error = nil end + + if @skin_zip_error + errors.add('skin_zip', @skin_zip_error) + @skin_zip_error = nil + end end end diff --git a/app/models/user.rb b/app/models/user.rb index dff84f91..ff420fcc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -339,7 +339,7 @@ def get_skin(node) nil when ANY_SKIN_ID # normal skin - node.skin || (node.parent ? node.parent.skin : nil) + current_site.skin || node.skin || (node.parent ? node.parent.skin : nil) else # find skin from zip secure(Skin) { Skin.find_by_zip(skin_zip)} diff --git a/app/views/sites/_form.erb b/app/views/sites/_form.erb index 4b82dc2a..92140ce4 100644 --- a/app/views/sites/_form.erb +++ b/app/views/sites/_form.erb @@ -15,6 +15,7 @@ + <% Site.attributes_for_form(@site.is_alias?)[:text].each do |name| -%> <% end -%> diff --git a/bricks/zena/zena/migrate/20131105160420_add_model_flag_and_skin_id.rb b/bricks/zena/zena/migrate/20131105160420_add_model_flag_and_skin_id.rb new file mode 100644 index 00000000..8512b56d --- /dev/null +++ b/bricks/zena/zena/migrate/20131105160420_add_model_flag_and_skin_id.rb @@ -0,0 +1,11 @@ +class AddModelFlagAndSkinId < ActiveRecord::Migration + def self.up + add_column :users, :is_model, :boolean + add_column :sites, :skin_id, :integer + end + + def self.down + remove_column :users, :is_model + remove_column :sites, :skin_id + end +end diff --git a/test/sites/zena/sites.yml b/test/sites/zena/sites.yml index 3ade14e8..01aa3ab8 100644 --- a/test/sites/zena/sites.yml +++ b/test/sites/zena/sites.yml @@ -22,6 +22,7 @@ alias: host: alias.host root: zena home: wiki + skin: wikiSkin anon: anon public_group: public site_group: workers diff --git a/test/sites/zena/users.yml b/test/sites/zena/users.yml index 4422da1f..1aade272 100644 --- a/test/sites/zena/users.yml +++ b/test/sites/zena/users.yml @@ -15,6 +15,7 @@ ant: groups: public, workers status: user lang: fr + is_model: true tiger: login: tiger diff --git a/test/unit/site_test.rb b/test/unit/site_test.rb index ffdc3183..4a36a042 100644 --- a/test/unit/site_test.rb +++ b/test/unit/site_test.rb @@ -406,6 +406,10 @@ def test_rebuild_fullpath should 'return alias home node' do assert_equal nodes_id(:wiki), subject.home_id end + + should 'return alias skin node' do + assert_equal nodes_id(:wikiSkin), subject.skin_id + end end context 'Creating a site alias' do @@ -434,6 +438,24 @@ def test_rebuild_fullpath end end + context 'Editing a site alias skin' do + subject do + secure(Site) { sites(:alias) } + end + + should 'allow setting skin' do + assert_equal nodes_id(:wikiSkin), subject.skin_id + assert subject.update_attributes(:skin_zip => nodes_zip(:default)) + assert_equal nodes_id(:default), sites(:alias).skin.id + end + + should 'allow setting skin to nil' do + assert_equal nodes_id(:wikiSkin), subject.skin_id + assert subject.update_attributes(:skin_zip => '') + assert_nil sites(:alias).skin_id + end + end + private def fullpath(*args) args.map {|sym| nodes_zip(sym).to_s}.join('/') diff --git a/test/unit/zena/use/rendering_test.rb b/test/unit/zena/use/rendering_test.rb index ec57b121..f6dea396 100644 --- a/test/unit/zena/use/rendering_test.rb +++ b/test/unit/zena/use/rendering_test.rb @@ -63,6 +63,10 @@ class RenderingTest < Zena::View::TestCase should 'find site alias on visitor site' do assert_equal 'alias.host', visitor.site.host end + + should 'find forced skin on any node' do + assert_equal 'wiki skin', visitor.get_skin(nodes(:zena)).title + end end should 'return a fullpath on fullpath_from_template_url' do
<%= _('host') %><%= @site[:host] %>
<%= _('home') %><%= text_field('site', :home_zip, :size=>15, :value => @site.home_zip) %>
<%= _('skin') %><%= text_field('site', :skin_zip, :size=>15, :value => @site.skin_zip) %>
<%= _(name) %><%= text_field('site', name, :size=>nil) %>