summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2010-11-27 14:06:11 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2010-11-27 14:06:11 +0000
commit620c48fbbb8e418819e61e68d8488869fe7e2780 (patch)
tree7c5c60b37329a6d64f906bc620187efffe857a88
parent4faca3cd4a7d8c7d39c7e73784ccaae076471e7b (diff)
downloadredmine-620c48fbbb8e418819e61e68d8488869fe7e2780.tar.gz
redmine-620c48fbbb8e418819e61e68d8488869fe7e2780.zip
Reload themes so that new themes can be used without restarting Redmine (#5712).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4432 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/controllers/settings_controller.rb2
-rw-r--r--lib/redmine/themes.rb15
-rw-r--r--test/unit/lib/redmine/themes_test.rb59
3 files changed, 73 insertions, 3 deletions
diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb
index 2e904ec19..804a7fda3 100644
--- a/app/controllers/settings_controller.rb
+++ b/app/controllers/settings_controller.rb
@@ -44,6 +44,8 @@ class SettingsController < ApplicationController
@guessed_host_and_path = request.host_with_port.dup
@guessed_host_and_path << ('/'+ Redmine::Utils.relative_url_root.gsub(%r{^\/}, '')) unless Redmine::Utils.relative_url_root.blank?
+
+ Redmine::Themes.rescan
end
def plugin
diff --git a/lib/redmine/themes.rb b/lib/redmine/themes.rb
index 57cdecb10..f932f9563 100644
--- a/lib/redmine/themes.rb
+++ b/lib/redmine/themes.rb
@@ -29,8 +29,13 @@ module Redmine
end
# Return theme for given id, or nil if it's not found
- def self.theme(id)
- themes.find {|t| t.id == id}
+ def self.theme(id, options={})
+ found = themes.find {|t| t.id == id}
+ if found.nil? && options[:rescan] != false
+ rescan
+ found = theme(id, :rescan => false)
+ end
+ found
end
# Class used to represent a theme
@@ -45,7 +50,11 @@ module Redmine
# Directory name used as the theme id
def id; dir end
-
+
+ def ==(theme)
+ theme.is_a?(Theme) && theme.dir == dir
+ end
+
def <=>(theme)
name <=> theme.name
end
diff --git a/test/unit/lib/redmine/themes_test.rb b/test/unit/lib/redmine/themes_test.rb
new file mode 100644
index 000000000..a2e9236e3
--- /dev/null
+++ b/test/unit/lib/redmine/themes_test.rb
@@ -0,0 +1,59 @@
+# Redmine - project management software
+# Copyright (C) 2006-2010 Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../../../test_helper'
+
+class Redmine::ThemesTest < ActiveSupport::TestCase
+
+ def test_themes
+ themes = Redmine::Themes.themes
+ assert_kind_of Array, themes
+ assert_kind_of Redmine::Themes::Theme, themes.first
+ end
+
+ def test_rescan
+ Redmine::Themes.themes.pop
+
+ assert_difference 'Redmine::Themes.themes.size' do
+ Redmine::Themes.rescan
+ end
+ end
+
+ def test_theme_loaded
+ theme = Redmine::Themes.themes.last
+
+ assert_equal theme, Redmine::Themes.theme(theme.id)
+ end
+
+ def test_theme_loaded_without_rescan
+ theme = Redmine::Themes.themes.last
+
+ assert_equal theme, Redmine::Themes.theme(theme.id, :rescan => false)
+ end
+
+ def test_theme_not_loaded
+ theme = Redmine::Themes.themes.pop
+
+ assert_equal theme, Redmine::Themes.theme(theme.id)
+ end
+
+ def test_theme_not_loaded_without_rescan
+ theme = Redmine::Themes.themes.pop
+
+ assert_nil Redmine::Themes.theme(theme.id, :rescan => false)
+ end
+end