@@ -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 => |
|
|
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 = |
|
|
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 |
|
|
99 |
v = v.to_sym if |
|
|
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 && |
|
|
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 |
|
|
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 = |
|
|
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