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
153
154
155
156
157
158
159
160
161
162
163
164
165
|
# frozen_string_literal: true
class Form::AdminSettings
include ActiveModel::Model
KEYS = %i(
site_contact_username
site_contact_email
site_title
site_short_description
site_extended_description
site_terms
registrations_mode
closed_registrations_message
timeline_preview
bootstrap_timeline_accounts
flavour
skin
activity_api_enabled
peers_api_enabled
preview_sensitive_media
custom_css
profile_directory
hide_followers_count
flavour_and_skin
thumbnail
mascot
show_reblogs_in_public_timelines
show_replies_in_public_timelines
trends
trends_as_landing_page
trendable_by_default
trending_status_cw
show_domain_blocks
show_domain_blocks_rationale
noindex
outgoing_spoilers
require_invite_text
captcha_enabled
media_cache_retention_period
content_cache_retention_period
backups_retention_period
status_page_url
).freeze
INTEGER_KEYS = %i(
media_cache_retention_period
content_cache_retention_period
backups_retention_period
).freeze
BOOLEAN_KEYS = %i(
timeline_preview
activity_api_enabled
peers_api_enabled
preview_sensitive_media
profile_directory
hide_followers_count
show_reblogs_in_public_timelines
show_replies_in_public_timelines
trends
trends_as_landing_page
trendable_by_default
trending_status_cw
noindex
require_invite_text
captcha_enabled
).freeze
UPLOAD_KEYS = %i(
thumbnail
mascot
).freeze
PSEUDO_KEYS = %i(
flavour_and_skin
).freeze
attr_accessor(*KEYS)
validates :registrations_mode, inclusion: { in: %w(open approved none) }, if: -> { defined?(@registrations_mode) }
validates :site_contact_email, :site_contact_username, presence: true, if: -> { defined?(@site_contact_username) || defined?(@site_contact_email) }
validates :site_contact_username, existing_username: true, if: -> { defined?(@site_contact_username) }
validates :bootstrap_timeline_accounts, existing_username: { multiple: true }, if: -> { defined?(@bootstrap_timeline_accounts) }
validates :show_domain_blocks, inclusion: { in: %w(disabled users all) }, if: -> { defined?(@show_domain_blocks) }
validates :show_domain_blocks_rationale, inclusion: { in: %w(disabled users all) }, if: -> { defined?(@show_domain_blocks_rationale) }
validates :media_cache_retention_period, :content_cache_retention_period, :backups_retention_period, numericality: { only_integer: true }, allow_blank: true, if: -> { defined?(@media_cache_retention_period) || defined?(@content_cache_retention_period) || defined?(@backups_retention_period) }
validates :site_short_description, length: { maximum: 200 }, if: -> { defined?(@site_short_description) }
validates :status_page_url, url: true, allow_blank: true
validate :validate_site_uploads
KEYS.each do |key|
define_method(key) do
return instance_variable_get("@#{key}") if instance_variable_defined?("@#{key}")
stored_value = if UPLOAD_KEYS.include?(key)
SiteUpload.where(var: key).first_or_initialize(var: key)
else
Setting.public_send(key)
end
instance_variable_set("@#{key}", stored_value)
end
end
UPLOAD_KEYS.each do |key|
define_method("#{key}=") do |file|
value = public_send(key)
value.file = file
rescue Mastodon::DimensionsValidationError => e
errors.add(key.to_sym, e.message)
end
end
def save
# NOTE: Annoyingly, files are processed and can error out before
# validations are called, and `valid?` clears errors…
# So for now, return early if errors aren't empty.
return false unless errors.empty? && valid?
KEYS.each do |key|
next if PSEUDO_KEYS.include?(key) || !instance_variable_defined?("@#{key}")
if UPLOAD_KEYS.include?(key)
public_send(key).save
else
setting = Setting.where(var: key).first_or_initialize(var: key)
setting.update(value: typecast_value(key, instance_variable_get("@#{key}")))
end
end
end
def flavour_and_skin
"#{Setting.flavour}/#{Setting.skin}"
end
def flavour_and_skin=(value)
@flavour, @skin = value.split('/', 2)
end
private
def typecast_value(key, value)
if BOOLEAN_KEYS.include?(key)
value == '1'
elsif INTEGER_KEYS.include?(key)
value.blank? ? value : Integer(value)
else
value
end
end
def validate_site_uploads
UPLOAD_KEYS.each do |key|
next unless instance_variable_defined?("@#{key}")
upload = instance_variable_get("@#{key}")
next if upload.valid?
upload.errors.each do |error|
errors.import(error, attribute: key)
end
end
end
end
|