redmine_extensions 0.1.27 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 451e934cd71d0033f53660ace685eb233fbd3b6b
4
- data.tar.gz: 9804c4626e6f694cf8409c6c339435400b77ab0a
3
+ metadata.gz: d8cb8428973f6c3353ad74154a7e78037c8e368e
4
+ data.tar.gz: 83333323c82696c521141ba162396926da14e9d5
5
5
  SHA512:
6
- metadata.gz: a42b5bab9106b6adc5506d0ff0f76824ae02a5735dcdb78f7e1c593d0ef60bae341cf147263229e20466c27f1ce6cfc86aaf9e6dc4b877634985f5c75baf78cb
7
- data.tar.gz: d9dbcb38a805254a8da611e6708fd0b89facc05bb98c31bf22069c424664df31ea3a22cfaa8223d3cc0f78ae555f5a003b98cc16cb8e8800c2f8ca7110be2ded
6
+ metadata.gz: ab40411071438c646db1a43352981b6c0761fc00d9836d8de6d68f6155143df67b7b48a25b8a464f561c8e6feef997d211c77abb7f2ae5dddb2c664806d2fa09
7
+ data.tar.gz: 9f6334ced28ff923275659a8ce4ca113cf0d911580441f8e9f198acbdde69f4f095738610b929d57aaeda809a17369926771ab267cab5e637c3020bb072d7284
@@ -1,10 +1,10 @@
1
- # edit and update actions are for a plugin settings
2
- # it uses a presenter, wich prefixes the settings name by a plugin id automatically
1
+ #
2
+ # For now edit and update actions are for a plugin settings
3
+ #
3
4
  class EasySettingsController < ApplicationController
4
5
 
5
6
  before_filter :require_admin, only: [:edit, :update]
6
7
  before_filter :find_optional_project
7
- before_filter :prepare_presenter
8
8
  before_filter :find_plugin, only: [:edit, :update]
9
9
 
10
10
  def new
@@ -19,36 +19,41 @@ class EasySettingsController < ApplicationController
19
19
  end
20
20
 
21
21
  def edit
22
- @settings = Setting.send "plugin_#{@plugin.id}"
22
+ @settings = Setting.send("plugin_#{@plugin.id}")
23
+ @easy_settings = EasySettings::FormModel.new(prefix: @plugin.id, project: @project)
23
24
  end
24
25
 
25
26
  def update
26
- Setting.send "plugin_#{@plugin.id}=", params[:settings] if params[:settings]
27
- if @easy_settings.save
28
- flash[:notice] = l(:notice_successful_update)
29
- redirect_back_or_default edit_easy_setting_path(@easy_settings)
30
- else
31
- render :edit
27
+ if params[:settings]
28
+ Setting.send("plugin_#{@plugin.id}=", params[:settings])
32
29
  end
30
+
31
+ if params[:easy_setting]
32
+ @easy_settings = EasySettings::ParamsWrapper.from_params(params[:easy_setting], project: @project, prefix: @plugin.id)
33
+
34
+ if @easy_settings.save
35
+ # All good
36
+ else
37
+ render :edit
38
+ return
39
+ end
40
+ end
41
+
42
+ flash[:notice] = l(:notice_successful_update)
43
+ redirect_back_or_default edit_easy_setting_path(@plugin.id)
33
44
  end
34
45
 
35
46
  private
36
- def find_optional_project
37
- @project = Project.find(params[:project_id]) unless params[:project_id].blank?
38
- end
39
47
 
40
- def prepare_presenter
41
- @easy_settings = RedmineExtensions::EasySettingPresenter.new(params[:easy_setting], @project)
48
+ def find_optional_project
49
+ @project = Project.find_by(id: params[:project_id]) if params[:project_id].present?
42
50
  end
43
51
 
44
52
  def find_plugin
45
53
  @plugin = Redmine::Plugin.find(params[:id])
46
-
47
54
  return render_404 unless @plugin.settings.is_a?(Hash)
48
-
49
- @easy_settings.plugin = @plugin
50
-
51
55
  rescue Redmine::PluginNotFound
52
56
  render_404
53
57
  end
58
+
54
59
  end
@@ -1,15 +1,120 @@
1
+ require 'redmine_extensions/easy_settings'
2
+
3
+ ##
4
+ # EasySetting
5
+ #
6
+ # == Mapping
7
+ # type::
8
+ # boolean, integer, float
9
+ # (default: none)
10
+ #
11
+ # default::
12
+ # (default: nil)
13
+ #
14
+ # disabled_from_params::
15
+ # (default: false)
16
+ #
17
+ # skip_blank_params::
18
+ # (default: false)
19
+ #
20
+ # from_params::
21
+ # Accept block or lambda with one argument for raw_value. Evaluated in EasySetting instance.
22
+ # (default: none)
23
+ #
24
+ # validate::
25
+ # Accept block or lambda. Evaluated in EasySetting instance.
26
+ # (default: none)
27
+ #
28
+ # after_save::
29
+ # Accept block or lambda. Evaluated in EasySetting instance.
30
+ # (default: none)
31
+ #
32
+ # == Mapping examples
33
+ #
34
+ # EasySetting.map do
35
+ #
36
+ # # Integer key
37
+ # key :integer_key do
38
+ # type 'integer'
39
+ # default 42
40
+ #
41
+ # validate { errors.add(:value, 'Bad range') if value < 0 || value > 500 }
42
+ # after_save { Mailer.integer_key_changed }
43
+ # end
44
+ #
45
+ # # Custom definition
46
+ # key :custom_key do
47
+ # default 'Ondra'
48
+ # from_params lambda {|v| v.to_s }
49
+ # end
50
+ #
51
+ # # Cannot be changed via params
52
+ # key :not_from_params do
53
+ # default 'Ondra'
54
+ # disabled_from_params
55
+ # end
56
+ #
57
+ # end
58
+ #
59
+ # # Boolean key definition
60
+ # EasySetting.map.key(:boolean_key, type: 'boolean')
61
+ #
62
+ # # Multiple defintions
63
+ # EasySetting.map.keys(:key1, :key2, :key3, disabled_from_params: true)
64
+ #
1
65
  class EasySetting < ActiveRecord::Base
2
66
 
3
67
  belongs_to :project
4
68
 
5
- serialize :value
6
-
7
- validates :name, :presence => true
8
- attr_protected :id
69
+ validates :name, presence: true
70
+ validate :mapper_validate
9
71
 
10
72
  after_save :update_cache
73
+ after_save :mapper_after_save
11
74
  after_destroy :invalidate_cache
12
75
 
76
+ attr_protected :id
77
+ serialize :value
78
+
79
+ @@mapper = EasySettings::Mapper.new
80
+
81
+ def self.map(&block)
82
+ if block_given?
83
+ @@mapper.instance_eval(&block)
84
+ else
85
+ @@mapper
86
+ end
87
+ end
88
+
89
+ def self.mapper_defaults
90
+ @mapper_defaults ||= @@mapper.default_values
91
+ end
92
+
93
+ def self.mapper_clear_caches
94
+ @mapper_defaults = nil
95
+ end
96
+
97
+ def mapper_after_save
98
+ @@mapper.after_save(self)
99
+ end
100
+
101
+ def mapper_validate
102
+ @@mapper.validate(self)
103
+ end
104
+
105
+ def from_params(raw_value)
106
+ return if disabled_from_params?
107
+ self.value = @@mapper.from_params(self, raw_value)
108
+ end
109
+
110
+ def disabled_from_params?
111
+ @@mapper.disabled_from_params?(self)
112
+ end
113
+
114
+ def skip_blank_params?
115
+ @@mapper.skip_blank_params?(self)
116
+ end
117
+
13
118
  def self.boolean_keys
14
119
  []
15
120
  end
@@ -18,8 +123,8 @@ class EasySetting < ActiveRecord::Base
18
123
  source_project = source_project.id if source_project.is_a?(Project)
19
124
  target_project = target_project.id if target_project.is_a?(Project)
20
125
 
21
- options = {:scope => EasySetting.where(project_id: source_project)}
22
- Redmine::Hook.call_hook(:copy_all_project_settings_exceceptions, :options => options)
126
+ options = { scope: EasySetting.where(project_id: source_project) }
127
+ Redmine::Hook.call_hook(:copy_all_project_settings_exceceptions, options: options)
23
128
  source_project_names = options[:scope].pluck(:name)
24
129
 
25
130
  source_project_names.each do |name|
@@ -28,13 +133,13 @@ class EasySetting < ActiveRecord::Base
28
133
  end
29
134
 
30
135
  def self.copy_project_settings(setting_name, source_project_id, target_project_id)
31
- source = EasySetting.where(:name => setting_name, :project_id => source_project_id).first
32
- target = EasySetting.where(:name => setting_name, :project_id => target_project_id).first
136
+ source = EasySetting.where(name: setting_name, project_id: source_project_id).first
137
+ target = EasySetting.where(name: setting_name, project_id: target_project_id).first
33
138
 
34
139
  if source.nil? && !target.nil?
35
140
  target.destroy
36
141
  elsif !source.nil? && target.nil?
37
- EasySetting.create(:name => setting_name, :project_id => target_project_id, :value => source.value)
142
+ EasySetting.create(name: setting_name, project_id: target_project_id, value: source.value)
38
143
  elsif !source.nil? && !target.nil? && target.value != source.value
39
144
  target.value = source.value
40
145
  target.save
@@ -52,45 +157,47 @@ class EasySetting < ActiveRecord::Base
52
157
  end
53
158
  end
54
159
 
55
- def self.value(key, project_or_project_id = nil, use_fallback = true)
56
- if project_or_project_id.is_a?(Project)
57
- project_id = project_or_project_id.id
58
- elsif !project_or_project_id.nil?
59
- project_id = project_or_project_id.to_i
160
+ def self.value(key, project = nil, use_fallback = true)
161
+ if project.is_a?(Project)
162
+ project_id = project.id
163
+ elsif project.present?
164
+ project_id = project.to_i
60
165
  else
61
166
  project_id = nil
62
167
  end
63
168
 
64
- cache_key = "EasySetting/#{key}/#{project_id}"
169
+ cache_key = "EasySetting/#{key}/#{project_id}"
65
170
  fallback_cache_key = "EasySetting/#{key}/"
66
171
 
67
- cached_value = Rails.cache.fetch cache_key do
68
- EasySetting.where(name: key, project_id: project_id).pluck(:value).first
172
+ result = Rails.cache.fetch(cache_key) do
173
+ EasySetting.where(name: key, project_id: project_id).limit(1).pluck(:value).first
69
174
  end
70
175
 
71
- result = if use_fallback && (cached_value.nil? || cached_value == '')
72
- Rails.cache.fetch fallback_cache_key do
73
- EasySetting.where(name: key, project_id: nil).pluck(:value).first
74
- end
75
- else
76
- cached_value
176
+ if use_fallback && result.blank?
177
+ result = Rails.cache.fetch(fallback_cache_key) do
178
+ EasySetting.where(name: key, project_id: nil).limit(1).pluck(:value).first
77
179
  end
180
+ end
181
+
78
182
  result = plugin_defaults[key.to_s] if result.nil?
183
+ result = mapper_defaults[key.to_s] if result.nil?
79
184
  result
80
185
  end
81
186
 
82
- def self.delete_key(key, project_or_project_id)
83
- if project_or_project_id.is_a?(Project)
84
- project_id = project_or_project_id.id
85
- elsif !project_or_project_id.nil?
86
- project_id = project_or_project_id.to_i
187
+ def self.delete_key(key, project)
188
+ if project.is_a?(Project)
189
+ project_id = project.id
190
+ elsif project.present?
191
+ project_id = project.to_i
87
192
  else
88
193
  project_id = nil
89
194
  end
195
+
90
196
  return if project_id.nil?
91
- EasySetting.where(:name => key, :project_id => project_id).destroy_all
197
+ EasySetting.where(name: key, project_id: project_id).destroy_all
92
198
  end
93
199
 
200
+ # TODO: Move away
94
201
  def self.get_beginning_of_fiscal_for_year(year = nil)
95
202
  f_y = year || Date.today.year
96
203
  f_m = (EasySetting.value('fiscal_month') || 1).to_i
@@ -103,6 +210,7 @@ class EasySetting < ActiveRecord::Base
103
210
  end
104
211
  end
105
212
 
213
+ # TODO: Move away
106
214
  def self.beginning_of_fiscal_year(date = nil)
107
215
  today = date || Date.today
108
216
  fy = get_beginning_of_fiscal_for_year(today.year)
@@ -114,18 +222,19 @@ class EasySetting < ActiveRecord::Base
114
222
  end
115
223
  end
116
224
 
225
+ # TODO: Move away
117
226
  def self.end_of_fiscal_year(date = nil)
118
227
  beginning_of_fiscal_year(date) + 1.year - 1.day
119
228
  end
120
229
 
121
230
  private
122
231
 
123
- def invalidate_cache
124
- Rails.cache.delete "EasySetting/#{self.name}/#{self.project_id}"
125
- end
232
+ def invalidate_cache
233
+ Rails.cache.delete("EasySetting/#{name}/#{project_id}")
234
+ end
126
235
 
127
- def update_cache
128
- Rails.cache.write "EasySetting/#{self.name}/#{self.project_id}", self.value
129
- end
236
+ def update_cache
237
+ Rails.cache.write("EasySetting/#{name}/#{project_id}", value)
238
+ end
130
239
 
131
240
  end
@@ -4,10 +4,12 @@ module RedmineExtensions
4
4
  attr_accessor :project_id, :plugin
5
5
 
6
6
  def self.boolean_keys
7
- @boolean_keys ||= []
7
+ @boolean_keys ||= BooleanKeysAlsoToMapperKey.new
8
8
  end
9
9
 
10
10
  def initialize(settings_params={}, project = nil)
11
+ ActiveSupport::Deprecation.warn('RedmineExtensions::EasySettingPresenter is deprecated in favor of EasySettings::ParamsWrapper.')
12
+
11
13
  @settings = settings_params || {}
12
14
  @settings = @settings.dup.symbolize_keys
13
15
  self.project = project
@@ -124,5 +126,20 @@ module RedmineExtensions
124
126
  end
125
127
  end
126
128
 
129
+ # To keep backward compatibility with old presenter
130
+ class BooleanKeysAlsoToMapperKey < Array
131
+
132
+ def <<(key)
133
+ EasySetting.map.key(key, type: 'boolean')
134
+ super
135
+ end
136
+
137
+ def concat(keys)
138
+ EasySetting.map.keys(*keys, type: 'boolean')
139
+ super
140
+ end
141
+
142
+ end
143
+
127
144
  end
128
145
  end
@@ -1,7 +1,7 @@
1
- <%= form_for(@easy_settings, html: { class: 'form-box easy-setting-plugin-form' }) do |f| %>
1
+ <%= form_for(@easy_settings, url: easy_setting_path(@plugin.id), html: { class: 'form-box easy-setting-plugin-form' }) do |f| %>
2
2
  <%= hidden_field_tag :back_url, params[:back_url] %>
3
3
 
4
- <%= render "easy_settings/#{@easy_settings.plugin.id}", easy_settings: @easy_settings, settings: @settings, form: f %>
4
+ <%= render "easy_settings/#{@plugin.id}", easy_settings: @easy_settings, settings: @settings, form: f %>
5
5
 
6
6
  <div class="form-actions">
7
7
  <%= f.submit l(:button_update_easy_settings), class: 'button-1' %>
@@ -0,0 +1,8 @@
1
+ module EasySettings
2
+ end
3
+
4
+ require 'redmine_extensions/easy_settings/key'
5
+ require 'redmine_extensions/easy_settings/key_dsl'
6
+ require 'redmine_extensions/easy_settings/mapper'
7
+ require 'redmine_extensions/easy_settings/form_model'
8
+ require 'redmine_extensions/easy_settings/params_wrapper'
@@ -0,0 +1,39 @@
1
+ module EasySettings
2
+ ##
3
+ # EasySettings::FormModel
4
+ #
5
+ # Fake models/proxy for easy seettings. Usable in rails form.
6
+ #
7
+ # settings = EasySettings::FormModel.new(prefix: 'easy_gantt')
8
+ # settings.show_holidays == EasySetting.value(:easy_gantt_show_holidays)
9
+ #
10
+ class FormModel
11
+
12
+ def initialize(prefix: nil, project: nil)
13
+ @prefix = "#{prefix}_" if prefix.present?
14
+ @project_id = project.is_a?(Project) ? project.id : project
15
+ end
16
+
17
+ def model_name
18
+ EasySetting.model_name
19
+ end
20
+
21
+ def persisted?
22
+ true
23
+ end
24
+
25
+ def to_model
26
+ self
27
+ end
28
+
29
+ # Called for missing :id parameter
30
+ #
31
+ # def to_param
32
+ # end
33
+
34
+ def method_missing(name, *args)
35
+ EasySetting.value("#{@prefix}#{name}", @project_id)
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,113 @@
1
+ module EasySettings
2
+ ##
3
+ # EasySettings::Key
4
+ #
5
+ # Definition of easy setting key
6
+ #
7
+ class Key
8
+
9
+ attr_reader :name, :options
10
+
11
+ def self.init(name, **options)
12
+ key_class =
13
+ case options[:type].to_s
14
+ when 'boolean', 'bool'
15
+ BooleanKey
16
+ when 'integer', 'int'
17
+ IntegerKey
18
+ when 'float'
19
+ FloatKey
20
+ else
21
+ Key
22
+ end
23
+
24
+ key_class.new(name, options)
25
+ end
26
+
27
+ def initialize(name, **options)
28
+ @name = name
29
+ @options = options
30
+ end
31
+
32
+ def default
33
+ @options[:default]
34
+ end
35
+
36
+ def validate(easy_setting)
37
+ if options[:validate].is_a?(Proc)
38
+ easy_setting.instance_eval(&options[:validate])
39
+ end
40
+ end
41
+
42
+ def after_save(easy_setting)
43
+ if options[:after_save].is_a?(Proc)
44
+ easy_setting.instance_eval(&options[:after_save])
45
+ end
46
+ end
47
+
48
+ def from_params(easy_setting, value)
49
+ if options[:from_params].is_a?(Proc)
50
+ easy_setting.instance_exec(value, &options[:from_params])
51
+ else
52
+ value
53
+ end
54
+ end
55
+
56
+ def disabled_from_params?
57
+ !!options[:disabled_from_params]
58
+ end
59
+
60
+ def skip_blank_params?
61
+ !!options[:skip_blank_params]
62
+ end
63
+
64
+ end
65
+
66
+ class BooleanKey < Key
67
+
68
+ def from_params(easy_setting, value)
69
+ value.to_s.to_boolean
70
+ end
71
+
72
+ def validate(easy_setting)
73
+ easy_setting.instance_eval do
74
+ if ![nil, true, false].include?(value)
75
+ errors.add(:base, "#{name} must be boolean")
76
+ end
77
+ end
78
+ end
79
+
80
+ end
81
+
82
+ class IntegerKey < Key
83
+
84
+ def from_params(easy_setting, value)
85
+ value.try(:to_i)
86
+ end
87
+
88
+ def validate(easy_setting)
89
+ easy_setting.instance_eval do
90
+ if !value.nil? && !value.is_a?(Integer)
91
+ errors.add(:base, "#{name} must be inetger")
92
+ end
93
+ end
94
+ end
95
+
96
+ end
97
+
98
+ class FloatKey < Key
99
+
100
+ def from_params(easy_setting, value)
101
+ value.try(:to_f)
102
+ end
103
+
104
+ def validate(easy_setting)
105
+ easy_setting.instance_eval do
106
+ if !value.nil? && !value.is_a?(Float)
107
+ errors.add(:base, "#{name} must be float")
108
+ end
109
+ end
110
+ end
111
+
112
+ end
113
+ end
@@ -0,0 +1,44 @@
1
+ module EasySettings
2
+ ##
3
+ # EasySettings::KeyDSL
4
+ #
5
+ # For a comfortable way how to set new key via DSL
6
+ #
7
+ class KeyDSL
8
+
9
+ attr_reader :options
10
+
11
+ def initialize
12
+ @options = {}
13
+ end
14
+
15
+ def type(new_type)
16
+ @options[:type] = new_type
17
+ end
18
+
19
+ def default(new_default)
20
+ @options[:default] = new_default
21
+ end
22
+
23
+ def disabled_from_params
24
+ @options[:disabled_from_params] = true
25
+ end
26
+
27
+ def skip_blank_params
28
+ @options[:skip_blank_params] = true
29
+ end
30
+
31
+ def from_params(func=nil, &block)
32
+ @options[:from_params] = func || block
33
+ end
34
+
35
+ def validate(func=nil, &block)
36
+ @options[:validate] = func || block
37
+ end
38
+
39
+ def after_save(func=nil, &block)
40
+ @options[:after_save] = func || block
41
+ end
42
+
43
+ end
44
+ end
@@ -0,0 +1,87 @@
1
+ module EasySettings
2
+ class Mapper
3
+
4
+ def initialize
5
+ @all_keys = {}
6
+ end
7
+
8
+ # Be careful for double definition of the same key
9
+ # Last definition wins
10
+ def key(name, **options, &block)
11
+ name = name.to_s
12
+
13
+ if block_given?
14
+ key_dsl = EasySettings::KeyDSL.new
15
+ key_dsl.instance_eval(&block)
16
+ options = options.merge(key_dsl.options)
17
+ end
18
+
19
+ EasySetting.mapper_clear_caches
20
+ @all_keys[name] = EasySettings::Key.init(name, options)
21
+ end
22
+ alias_method :add_key, :key
23
+
24
+ def keys(*names, **options, &block)
25
+ names.each do |name|
26
+ key(name, options, &block)
27
+ end
28
+ end
29
+ alias_method :add_keys, :keys
30
+
31
+ # Shortcust due to frequent usage
32
+ def boolean_keys(*names)
33
+ names.each do |name|
34
+ key(name, type: 'boolean')
35
+ end
36
+ end
37
+
38
+ def default_values
39
+ values = {}
40
+ @all_keys.each do |name, key|
41
+ values[name] = key.default
42
+ end
43
+ values
44
+ end
45
+
46
+ def validate(easy_setting)
47
+ if @all_keys.has_key?(easy_setting.name)
48
+ @all_keys[easy_setting.name].validate(easy_setting)
49
+ else
50
+ true
51
+ end
52
+ end
53
+
54
+ def after_save(easy_setting)
55
+ if @all_keys.has_key?(easy_setting.name)
56
+ @all_keys[easy_setting.name].after_save(easy_setting)
57
+ else
58
+ true
59
+ end
60
+ end
61
+
62
+ def from_params(easy_setting, value)
63
+ if @all_keys.has_key?(easy_setting.name)
64
+ @all_keys[easy_setting.name].from_params(easy_setting, value)
65
+ else
66
+ value
67
+ end
68
+ end
69
+
70
+ def disabled_from_params?(easy_setting)
71
+ if @all_keys.has_key?(easy_setting.name)
72
+ @all_keys[easy_setting.name].disabled_from_params?
73
+ else
74
+ false
75
+ end
76
+ end
77
+
78
+ def skip_blank_params?(easy_setting)
79
+ if @all_keys.has_key?(easy_setting.name)
80
+ @all_keys[easy_setting.name].skip_blank_params?
81
+ else
82
+ false
83
+ end
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,82 @@
1
+ module EasySettings
2
+ class ParamsWrapper
3
+
4
+ attr_reader :errors
5
+
6
+ def self.from_params(raw_params, project: nil, prefix: nil)
7
+ if !raw_params.is_a?(Hash) && !raw_params.is_a?(ActionController::Parameters)
8
+ raw_params = {}
9
+ end
10
+
11
+ new(raw_params, project, prefix)
12
+ end
13
+
14
+ def initialize(raw_params, project, prefix)
15
+ @raw_params = raw_params
16
+ @project_id = project.is_a?(Project) ? project.id : project
17
+ @prefix = "#{prefix}_" if prefix.present?
18
+ @errors = []
19
+
20
+ prepare_params
21
+ prepare_easy_settings
22
+ end
23
+
24
+ def valid?
25
+ validate
26
+ @errors.empty?
27
+ end
28
+
29
+ def save
30
+ @errors.clear
31
+
32
+ @easy_settings.each do |setting|
33
+ # TO CONSIDER: Should this line exist?
34
+ # This skip callbacks after saving
35
+ # setting but is it desirable?
36
+ next if !setting.changed?
37
+
38
+ if setting.save
39
+ # All good
40
+ else
41
+ @errors << [setting, setting.errors]
42
+ end
43
+ end
44
+
45
+ @errors.empty?
46
+ end
47
+
48
+ private
49
+
50
+ def prepare_params
51
+ @params = {}
52
+ @raw_params.each do |name, value|
53
+ @params["#{@prefix}#{name}"] = value
54
+ end
55
+ end
56
+
57
+ def prepare_easy_settings
58
+ saved_settings = EasySetting.where(name: @params.keys, project_id: @project_id).map{|e| [e.name, e] }.to_h
59
+
60
+ @easy_settings = []
61
+ @params.each do |name, value|
62
+ setting = saved_settings[name]
63
+ setting ||= EasySetting.new(name: name, project_id: @project_id)
64
+ next if setting.disabled_from_params?
65
+ next if value.blank? && setting.skip_blank_params?
66
+
67
+ setting.from_params(value)
68
+ @easy_settings << setting
69
+ end
70
+ end
71
+
72
+ def validate
73
+ @errors.clear
74
+ @easy_settings.each do |setting|
75
+ if !setting.valid?
76
+ @errors << [setting, setting.errors]
77
+ end
78
+ end
79
+ end
80
+
81
+ end
82
+ end
@@ -27,6 +27,16 @@ module RedmineExtensions
27
27
  self.class.easy_extensions?
28
28
  end
29
29
 
30
+ private
31
+
32
+ def save_easy_settings(project = nil)
33
+ if params[:easy_setting].is_a?(Hash) || params[:easy_setting].is_a?(ActionController::Parameters)
34
+ wrapper = EasySettings::ParamsWrapper.from_params(params.delete(:easy_setting), project: project)
35
+ wrapper.save
36
+ wrapper
37
+ end
38
+ end
39
+
30
40
  end
31
41
 
32
42
  module ClassMethods
@@ -1,3 +1,3 @@
1
1
  module RedmineExtensions
2
- VERSION = '0.1.27'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmine_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.27
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Easy Software Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-04 00:00:00.000000000 Z
11
+ date: 2017-07-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -218,6 +218,12 @@ files:
218
218
  - lib/redmine_extensions/easy_form_builder.rb
219
219
  - lib/redmine_extensions/easy_query_adapter.rb
220
220
  - lib/redmine_extensions/easy_query_helpers/outputs.rb
221
+ - lib/redmine_extensions/easy_settings.rb
222
+ - lib/redmine_extensions/easy_settings/form_model.rb
223
+ - lib/redmine_extensions/easy_settings/key.rb
224
+ - lib/redmine_extensions/easy_settings/key_dsl.rb
225
+ - lib/redmine_extensions/easy_settings/mapper.rb
226
+ - lib/redmine_extensions/easy_settings/params_wrapper.rb
221
227
  - lib/redmine_extensions/engine.rb
222
228
  - lib/redmine_extensions/export/easy_other_formats_builder.rb
223
229
  - lib/redmine_extensions/hooks.rb
@@ -276,16 +282,16 @@ specification_version: 4
276
282
  summary: Redmine Extensions is set of usefull features for Redmine. Main focus is
277
283
  on development helpers, but many users can find it helpfull
278
284
  test_files:
279
- - spec/presenters/redmine_extensions/easy_setting_presenter_spec.rb
280
285
  - spec/rails_helper.rb
281
- - spec/features/autocomplete_spec.rb
282
- - spec/models/easy_setting_spec.rb
283
- - spec/factories/issues.rb
284
286
  - spec/factories/time_entries.rb
287
+ - spec/factories/easy_settings.rb
288
+ - spec/factories/issues.rb
289
+ - spec/factories/projects.rb
285
290
  - spec/factories/trackers.rb
286
291
  - spec/factories/easy_queries.rb
287
- - spec/factories/projects.rb
288
292
  - spec/factories/users.rb
289
- - spec/factories/easy_settings.rb
293
+ - spec/presenters/redmine_extensions/easy_setting_presenter_spec.rb
290
294
  - spec/support/plugin_generator.rb
291
295
  - spec/spec_helper.rb
296
+ - spec/models/easy_setting_spec.rb
297
+ - spec/features/autocomplete_spec.rb