-
Notifications
You must be signed in to change notification settings - Fork 9
/
custom_message_setting.rb
152 lines (126 loc) · 4.53 KB
/
custom_message_setting.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
class CustomMessageSetting < Setting
validate :convertible_to_yaml,
:custom_message_languages_are_available, :custom_message_keys_are_available
def self.find_or_default
super('plugin_redmine_message_customize')
end
def enabled?
self.value[:enabled] != 'false'
end
def custom_messages(lang=nil, check_enabled=false)
return {} if check_enabled && !self.enabled?
messages = raw_custom_messages
messages = messages[lang.to_s] if lang.present?
messages || {}
end
def custom_messages_with_timestamp(lang=nil, check_enabled=false)
messages = self.custom_messages(lang, check_enabled)
messages.merge({'redmine_message_customize_timestamp' => self.try(:updated_on).to_i.to_s})
end
def latest_messages_applied?(lang)
return true if self.new_record?
redmine_message_customize_timestamp = I18n.backend.send(:translations)[:"#{lang}"][:redmine_message_customize_timestamp]
redmine_message_customize_timestamp == self.updated_on.to_i.to_s
end
def custom_messages_to_flatten_hash(lang=nil)
self.class.flatten_hash(custom_messages(lang))
end
def custom_messages_to_yaml
messages = custom_messages
if messages.is_a?(Hash)
messages.present? ? YAML.dump(messages) : ''
else
raw_custom_messages
end
end
def update_with_custom_messages(custom_messages, lang)
value = CustomMessageSetting.nested_hash(custom_messages)
original_custom_messages = self.custom_messages
messages =
if value.present?
original_custom_messages.merge({lang => value})
else
original_custom_messages.delete(lang)
original_custom_messages
end
self.custom_messages = messages
self.save
end
def update_with_custom_messages_yaml(yaml)
self.custom_messages = yaml
self.save
end
def toggle_enabled!
self.value = self.value.merge({enabled: (!self.enabled?).to_s})
self.save
end
# { date: { formats: { defaults: '%m/%d/%Y'}}} to {'date.formats.defaults' => '%m/%d/%Y'}
def self.flatten_hash(hash=nil)
return hash unless hash.is_a?(Hash)
hash.each_with_object({}) do |(key, value), content|
next self.flatten_hash(value).each do |k, v|
content[:"#{key}.#{k}"] = v
end if value.is_a? Hash
content[key] = value
end
end
# {'date.formats.defaults' => '%m/%d/%Y'} to { date: { formats: { defaults: '%m/%d/%Y'}}}
def self.nested_hash(hash=nil)
new_hash = {}
hash.each do |key, value|
h = value
key.to_s.split('.').reverse_each do |k|
h = {k => h}
end
new_hash = new_hash.deep_merge(h)
end
new_hash
end
private
def raw_custom_messages
self.value[:custom_messages] || self.value['custom_messages']
end
def custom_messages=(messages)
messages = YAML.load("#{messages}") unless messages.is_a?(Hash)
self.value = self.value.merge({custom_messages: messages.presence || {}})
rescue Psych::SyntaxError => e
self.value = self.value.merge({custom_messages: messages})
end
def custom_message_keys_are_available
return if errors.present?
en_translation_hash = self.class.flatten_hash(MessageCustomize::Locale.available_messages('en'))
custom_message_keys =
custom_messages.values.each_with_object([]){|val, ar|
ar.concat(self.class.flatten_hash(val).keys)
}.uniq
unused_keys = custom_message_keys.reject{|k| en_translation_hash.keys.include?(:"#{k}")}
unusable_type_of_keys = (custom_message_keys - unused_keys).reject{|k| en_translation_hash[:"#{k}"].is_a?(String)}
if unused_keys.present?
errors.add(:base, "#{l(:error_unused_keys)} keys: [#{unused_keys.join(', ')}]")
end
if unusable_type_of_keys.present?
errors.add(:base, "#{l(:error_unusable_type_of_keys)} keys: [#{unusable_type_of_keys.join(', ')}]")
end
end
def custom_message_languages_are_available
return if errors.present?
unavailable_languages =
custom_messages.keys.compact.reject do |language|
MessageCustomize::Locale.available_locales.include?(language.to_sym)
end
if unavailable_languages.present?
errors.add(:base, l(:error_unavailable_languages) + " [#{unavailable_languages.join(', ')}]")
end
end
def convertible_to_yaml
raw_messages = raw_custom_messages
if raw_messages.present? && !raw_messages.is_a?(Hash)
begin
YAML.load("#{raw_messages}")
errors.add(:base, l(:error_invalid_yaml_format))
rescue Psych::SyntaxError => e
errors.add(:base, "#{l(:error_invalid_yaml_format)} #{e.message}")
end
end
end
end