##// END OF EJS Templates
Adds methods for loading and adding settings....
Jean-Philippe Lang -
r13337:ca71cf380046
parent child
Show More
@@ -75,16 +75,12 class Setting < ActiveRecord::Base
75 75 TIS-620)
76 76
77 77 cattr_accessor :available_settings
78 @@available_settings = YAML::load(File.open("#{Rails.root}/config/settings.yml"))
79 Redmine::Plugin.all.each do |plugin|
80 next unless plugin.settings
81 @@available_settings["plugin_#{plugin.id}"] = {'default' => plugin.settings[:default], 'serialized' => true}
82 end
78 self.available_settings ||= {}
83 79
84 80 validates_uniqueness_of :name
85 validates_inclusion_of :name, :in => @@available_settings.keys
81 validates_inclusion_of :name, :in => Proc.new {available_settings.keys}
86 82 validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting|
87 (s = @@available_settings[setting.name]) && s['format'] == 'int'
83 (s = available_settings[setting.name]) && s['format'] == 'int'
88 84 }
89 85 attr_protected :id
90 86
@@ -95,13 +91,13 class Setting < ActiveRecord::Base
95 91 def value
96 92 v = read_attribute(:value)
97 93 # Unserialize serialized settings
98 v = YAML::load(v) if @@available_settings[name]['serialized'] && v.is_a?(String)
99 v = v.to_sym if @@available_settings[name]['format'] == 'symbol' && !v.blank?
94 v = YAML::load(v) if available_settings[name]['serialized'] && v.is_a?(String)
95 v = v.to_sym if available_settings[name]['format'] == 'symbol' && !v.blank?
100 96 v
101 97 end
102 98
103 99 def value=(v)
104 v = v.to_yaml if v && @@available_settings[name] && @@available_settings[name]['serialized']
100 v = v.to_yaml if v && available_settings[name] && available_settings[name]['serialized']
105 101 write_attribute(:value, v.to_s)
106 102 end
107 103
@@ -119,26 +115,6 class Setting < ActiveRecord::Base
119 115 setting.value
120 116 end
121 117
122 # Defines getter and setter for each setting
123 # Then setting values can be read using: Setting.some_setting_name
124 # or set using Setting.some_setting_name = "some value"
125 @@available_settings.each do |name, params|
126 src = <<-END_SRC
127 def self.#{name}
128 self[:#{name}]
129 end
130
131 def self.#{name}?
132 self[:#{name}].to_i > 0
133 end
134
135 def self.#{name}=(value)
136 self[:#{name}] = value
137 end
138 END_SRC
139 class_eval src, __FILE__, __LINE__
140 end
141
142 118 # Sets a setting value from params
143 119 def self.set_from_params(name, params)
144 120 params = params.dup
@@ -217,17 +193,61 END_SRC
217 193 logger.info "Settings cache cleared." if logger
218 194 end
219 195
196 def self.define_plugin_setting(plugin)
197 if plugin.settings
198 name = "plugin_#{plugin.id}"
199 define_setting name, {'default' => plugin.settings[:default], 'serialized' => true}
200 end
201 end
202
203 # Defines getter and setter for each setting
204 # Then setting values can be read using: Setting.some_setting_name
205 # or set using Setting.some_setting_name = "some value"
206 def self.define_setting(name, options={})
207 available_settings[name.to_s] = options
208
209 src = <<-END_SRC
210 def self.#{name}
211 self[:#{name}]
212 end
213
214 def self.#{name}?
215 self[:#{name}].to_i > 0
216 end
217
218 def self.#{name}=(value)
219 self[:#{name}] = value
220 end
221 END_SRC
222 class_eval src, __FILE__, __LINE__
223 end
224
225 def self.load_available_settings
226 YAML::load(File.open("#{Rails.root}/config/settings.yml")).each do |name, options|
227 define_setting name, options
228 end
229 end
230
231 def self.load_plugin_settings
232 Redmine::Plugin.all.each do |plugin|
233 define_plugin_setting(plugin)
234 end
235 end
236
237 load_available_settings
238 load_plugin_settings
239
220 240 private
221 241 # Returns the Setting instance for the setting named name
222 242 # (record found in database or new record with default value)
223 243 def self.find_or_default(name)
224 244 name = name.to_s
225 raise "There's no setting named #{name}" unless @@available_settings.has_key?(name)
245 raise "There's no setting named #{name}" unless available_settings.has_key?(name)
226 246 setting = where(:name => name).first
227 247 unless setting
228 248 setting = new
229 249 setting.name = name
230 setting.value = @@available_settings[name]['default']
250 setting.value = available_settings[name]['default']
231 251 end
232 252 setting
233 253 end
@@ -95,6 +95,11 module Redmine #:nodoc:
95 95 ActiveSupport::Dependencies.autoload_paths += [dir]
96 96 end
97 97
98 # Defines plugin setting if present
99 if p.settings
100 Setting.define_plugin_setting p
101 end
102
98 103 # Warn for potential settings[:partial] collisions
99 104 if p.configurable?
100 105 partial = p.settings[:partial]
@@ -137,10 +137,10 class SettingsControllerTest < ActionController::TestCase
137 137 end
138 138
139 139 def test_get_plugin_settings
140 Setting.stubs(:plugin_foo).returns({'sample_setting' => 'Plugin setting value'})
141 140 ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins"))
142 141 Redmine::Plugin.register :foo do
143 settings :partial => "foo_plugin/foo_plugin_settings"
142 settings :partial => "foo_plugin/foo_plugin_settings",
143 :default => {'sample_setting' => 'Plugin setting value'}
144 144 end
145 145
146 146 get :plugin, :id => 'foo'
@@ -169,13 +169,15 class SettingsControllerTest < ActionController::TestCase
169 169 end
170 170
171 171 def test_post_plugin_settings
172 Setting.expects(:plugin_foo=).with({'sample_setting' => 'Value'}).returns(true)
173 172 Redmine::Plugin.register(:foo) do
174 settings :partial => 'not blank' # so that configurable? is true
173 settings :partial => 'not blank', # so that configurable? is true
174 :default => {'sample_setting' => 'Plugin setting value'}
175 175 end
176 176
177 177 post :plugin, :id => 'foo', :settings => {'sample_setting' => 'Value'}
178 178 assert_redirected_to '/settings/plugin/foo'
179
180 assert_equal({'sample_setting' => 'Value'}, Setting.plugin_foo)
179 181 end
180 182
181 183 def test_post_non_configurable_plugin_settings
General Comments 0
You need to be logged in to leave comments. Login now