class Form::AdminSettings
include ActiveModel::Model
- delegate(
- :site_contact_username,
- :site_contact_username=,
- :site_contact_email,
- :site_contact_email=,
- :site_title,
- :site_title=,
- :site_short_description,
- :site_short_description=,
- :site_description,
- :site_description=,
- :site_extended_description,
- :site_extended_description=,
- :site_terms,
- :site_terms=,
- :registrations_mode,
- :registrations_mode=,
- :closed_registrations_message,
- :closed_registrations_message=,
- :open_deletion,
- :open_deletion=,
- :timeline_preview,
- :timeline_preview=,
- :show_staff_badge,
- :show_staff_badge=,
- :bootstrap_timeline_accounts,
- :bootstrap_timeline_accounts=,
- :hide_followers_count,
- :hide_followers_count=,
- :flavour,
- :flavour=,
- :skin,
- :skin=,
- :min_invite_role,
- :min_invite_role=,
- :activity_api_enabled,
- :activity_api_enabled=,
- :peers_api_enabled,
- :peers_api_enabled=,
- :show_known_fediverse_at_about_page,
- :show_known_fediverse_at_about_page=,
- :preview_sensitive_media,
- :preview_sensitive_media=,
- :custom_css,
- :custom_css=,
- :profile_directory,
- :profile_directory=,
- to: Setting
- )
+ KEYS = %i(
+ site_contact_username
+ site_contact_email
+ site_title
+ site_short_description
+ site_description
+ site_extended_description
+ site_terms
+ registrations_mode
+ closed_registrations_message
+ open_deletion
+ timeline_preview
+ show_staff_badge
+ bootstrap_timeline_accounts
- theme
++ flavour
++ skin
+ min_invite_role
+ activity_api_enabled
+ peers_api_enabled
+ show_known_fediverse_at_about_page
+ preview_sensitive_media
+ custom_css
+ profile_directory
++ hide_followers_count
++ flavour_and_skin
+ ).freeze
+
+ BOOLEAN_KEYS = %i(
+ open_deletion
+ timeline_preview
+ show_staff_badge
+ activity_api_enabled
+ peers_api_enabled
+ show_known_fediverse_at_about_page
+ preview_sensitive_media
+ profile_directory
++ hide_followers_count
+ ).freeze
+
+ UPLOAD_KEYS = %i(
+ thumbnail
+ hero
+ mascot
+ ).freeze
+
++ PSEUDO_KEYS = %i(
++ flavour_and_skin
++ ).freeze
++
+ attr_accessor(*KEYS)
+
+ validates :site_short_description, :site_description, :site_extended_description, :site_terms, :closed_registrations_message, html: true
+ validates :registrations_mode, inclusion: { in: %w(open approved none) }
+ validates :min_invite_role, inclusion: { in: %w(disabled user moderator admin) }
+ validates :site_contact_email, :site_contact_username, presence: true
+ validates :site_contact_username, existing_username: true
+ validates :bootstrap_timeline_accounts, existing_username: { multiple: true }
+
+ def initialize(_attributes = {})
+ super
+ initialize_attributes
+ end
+
+ def save
+ return false unless valid?
+
+ KEYS.each do |key|
++ next if PSEUDO_KEYS.include?(key)
+ value = instance_variable_get("@#{key}")
+
+ if UPLOAD_KEYS.include?(key)
+ upload = SiteUpload.where(var: key).first_or_initialize(var: key)
+ upload.update(file: value)
+ else
+ setting = Setting.where(var: key).first_or_initialize(var: key)
+ setting.update(value: typecast_value(key, value))
+ 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 initialize_attributes
+ KEYS.each do |key|
++ next if PSEUDO_KEYS.include?(key)
+ instance_variable_set("@#{key}", Setting.public_send(key)) if instance_variable_get("@#{key}").nil?
+ end
+ end
+
+ def typecast_value(key, value)
+ if BOOLEAN_KEYS.include?(key)
+ value == '1'
+ else
+ value
+ end
+ end
end
settings.item :import, safe_join([fa_icon('cloud-upload fw'), t('settings.import')]), settings_import_url
settings.item :export, safe_join([fa_icon('cloud-download fw'), t('settings.export')]), settings_export_url
settings.item :authorized_apps, safe_join([fa_icon('list fw'), t('settings.authorized_apps')]), oauth_authorized_applications_url
- settings.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}
+ settings.item :identity_proofs, safe_join([fa_icon('key fw'), t('settings.identity_proofs')]), settings_identity_proofs_path, highlights_on: %r{/settings/identity_proofs*}, if: proc { current_account.identity_proofs.exists? }
end
+ primary.item :flavours, safe_join([fa_icon('paint-brush fw'), t('settings.flavours')]), settings_flavours_url do |flavours|
+ Themes.instance.flavours.each do |flavour|
+ flavours.item flavour.to_sym, safe_join([fa_icon('star fw'), t("flavours.#{flavour}.name", default: flavour)]), settings_flavour_url(flavour)
+ end
+ end
+
primary.item :relationships, safe_join([fa_icon('users fw'), t('settings.relationships')]), relationships_url
primary.item :filters, safe_join([fa_icon('filter fw'), t('filters.index.title')]), filters_path, highlights_on: %r{/filters}
primary.item :invites, safe_join([fa_icon('user-plus fw'), t('invites.title')]), invites_path, if: proc { Setting.min_invite_role == 'user' }