@@ -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 => |
|
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 = |
|
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 |
|
94 | v = YAML::load(v) if available_settings[name]['serialized'] && v.is_a?(String) | |
99 |
v = v.to_sym if |
|
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 && |
|
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 |
|
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 = |
|
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