forked from discourse/discourse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsite_settings_task.rb
41 lines (38 loc) · 1.26 KB
/
site_settings_task.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
# frozen_string_literal: true
class SiteSettingsTask
def self.export_to_hash(include_defaults: false, include_hidden: false)
site_settings = SiteSetting.all_settings(include_hidden: include_hidden)
h = {}
site_settings.each do |site_setting|
next if site_setting[:default] == site_setting[:value] if !include_defaults
h.store(site_setting[:setting].to_s, site_setting[:value])
end
h
end
def self.import(yml)
h = SiteSettingsTask.export_to_hash(include_defaults: true, include_hidden: true)
counts = { updated: 0, not_found: 0, errors: 0 }
log = []
site_settings = YAML::safe_load(yml)
site_settings.each do |site_setting|
key = site_setting[0]
val = site_setting[1]
if h.has_key?(key)
if val != h[key] #only update if different
begin
result = SiteSetting.set_and_log(key, val)
log << "Changed #{key} FROM: #{result.previous_value} TO: #{result.new_value}"
counts[:updated] += 1
rescue => e
log << "ERROR: #{e.message}"
counts[:errors] += 1
end
end
else
log << "NOT FOUND: existing site setting not found for #{key}"
counts[:not_found] += 1
end
end
[log, counts]
end
end