##// 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 TIS-620)
75 TIS-620)
76
76
77 cattr_accessor :available_settings
77 cattr_accessor :available_settings
78 @@available_settings = YAML::load(File.open("#{Rails.root}/config/settings.yml"))
78 self.available_settings ||= {}
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
83
79
84 validates_uniqueness_of :name
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 validates_numericality_of :value, :only_integer => true, :if => Proc.new { |setting|
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 attr_protected :id
85 attr_protected :id
90
86
@@ -95,13 +91,13 class Setting < ActiveRecord::Base
95 def value
91 def value
96 v = read_attribute(:value)
92 v = read_attribute(:value)
97 # Unserialize serialized settings
93 # Unserialize serialized settings
98 v = YAML::load(v) if @@available_settings[name]['serialized'] && v.is_a?(String)
94 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?
95 v = v.to_sym if available_settings[name]['format'] == 'symbol' && !v.blank?
100 v
96 v
101 end
97 end
102
98
103 def value=(v)
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 write_attribute(:value, v.to_s)
101 write_attribute(:value, v.to_s)
106 end
102 end
107
103
@@ -119,26 +115,6 class Setting < ActiveRecord::Base
119 setting.value
115 setting.value
120 end
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 # Sets a setting value from params
118 # Sets a setting value from params
143 def self.set_from_params(name, params)
119 def self.set_from_params(name, params)
144 params = params.dup
120 params = params.dup
@@ -217,17 +193,61 END_SRC
217 logger.info "Settings cache cleared." if logger
193 logger.info "Settings cache cleared." if logger
218 end
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 private
240 private
221 # Returns the Setting instance for the setting named name
241 # Returns the Setting instance for the setting named name
222 # (record found in database or new record with default value)
242 # (record found in database or new record with default value)
223 def self.find_or_default(name)
243 def self.find_or_default(name)
224 name = name.to_s
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 setting = where(:name => name).first
246 setting = where(:name => name).first
227 unless setting
247 unless setting
228 setting = new
248 setting = new
229 setting.name = name
249 setting.name = name
230 setting.value = @@available_settings[name]['default']
250 setting.value = available_settings[name]['default']
231 end
251 end
232 setting
252 setting
233 end
253 end
@@ -95,6 +95,11 module Redmine #:nodoc:
95 ActiveSupport::Dependencies.autoload_paths += [dir]
95 ActiveSupport::Dependencies.autoload_paths += [dir]
96 end
96 end
97
97
98 # Defines plugin setting if present
99 if p.settings
100 Setting.define_plugin_setting p
101 end
102
98 # Warn for potential settings[:partial] collisions
103 # Warn for potential settings[:partial] collisions
99 if p.configurable?
104 if p.configurable?
100 partial = p.settings[:partial]
105 partial = p.settings[:partial]
@@ -137,10 +137,10 class SettingsControllerTest < ActionController::TestCase
137 end
137 end
138
138
139 def test_get_plugin_settings
139 def test_get_plugin_settings
140 Setting.stubs(:plugin_foo).returns({'sample_setting' => 'Plugin setting value'})
141 ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins"))
140 ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins"))
142 Redmine::Plugin.register :foo do
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 end
144 end
145
145
146 get :plugin, :id => 'foo'
146 get :plugin, :id => 'foo'
@@ -169,13 +169,15 class SettingsControllerTest < ActionController::TestCase
169 end
169 end
170
170
171 def test_post_plugin_settings
171 def test_post_plugin_settings
172 Setting.expects(:plugin_foo=).with({'sample_setting' => 'Value'}).returns(true)
173 Redmine::Plugin.register(:foo) do
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 end
175 end
176
176
177 post :plugin, :id => 'foo', :settings => {'sample_setting' => 'Value'}
177 post :plugin, :id => 'foo', :settings => {'sample_setting' => 'Value'}
178 assert_redirected_to '/settings/plugin/foo'
178 assert_redirected_to '/settings/plugin/foo'
179
180 assert_equal({'sample_setting' => 'Value'}, Setting.plugin_foo)
179 end
181 end
180
182
181 def test_post_non_configurable_plugin_settings
183 def test_post_non_configurable_plugin_settings
General Comments 0
You need to be logged in to leave comments. Login now