mirror of
https://github.com/internetee/registry.git
synced 2025-07-24 19:48:28 +02:00
Merge pull request #1659 from internetee/1629-change-settings-storage-mechanism
Replace rails-settings-cached with custom approach
This commit is contained in:
commit
8da95a5e43
23 changed files with 1050 additions and 258 deletions
|
@ -3,21 +3,23 @@ module Admin
|
|||
load_and_authorize_resource
|
||||
|
||||
def index
|
||||
@settings = Setting.unscoped
|
||||
@settings = SettingEntry.unscoped
|
||||
@validation_settings = SettingEntry.with_group('domain_validation')
|
||||
@expiration_settings = SettingEntry.with_group('domain_expiration')
|
||||
@other_settings = SettingEntry.with_group('other')
|
||||
.where.not(code: 'default_language')
|
||||
@billing_settings = SettingEntry.with_group('billing')
|
||||
@contacts_settings = SettingEntry.with_group('contacts')
|
||||
end
|
||||
|
||||
def create
|
||||
@errors = Setting.params_errors(casted_settings)
|
||||
if @errors.empty?
|
||||
casted_settings.each do |k, v|
|
||||
Setting[k] = v
|
||||
end
|
||||
|
||||
update = SettingEntry.update(casted_settings.keys, casted_settings.values)
|
||||
if update
|
||||
flash[:notice] = t('.saved')
|
||||
redirect_to [:admin, :settings]
|
||||
redirect_to %i[admin settings]
|
||||
else
|
||||
flash[:alert] = @errors.values.uniq.join(", ")
|
||||
render "admin/settings/index"
|
||||
flash[:alert] = update.errors.values.uniq.join(', ')
|
||||
render 'admin/settings/index'
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -27,10 +29,7 @@ module Admin
|
|||
settings = {}
|
||||
|
||||
params[:settings].each do |k, v|
|
||||
settings[k] = v
|
||||
settings[k] = v.to_i if Setting.integer_settings.include?(k.to_sym)
|
||||
settings[k] = v.to_f if Setting.float_settings.include?(k.to_sym)
|
||||
settings[k] = (v == 'true' ? true : false) if Setting.boolean_settings.include?(k.to_sym)
|
||||
settings[k] = { value: v }
|
||||
end
|
||||
|
||||
settings
|
||||
|
|
|
@ -8,7 +8,7 @@ module Concerns
|
|||
end
|
||||
|
||||
def legaldoc_not_mandatory?
|
||||
setting = Setting.find_by(var: 'legal_document_is_mandatory')&.value
|
||||
setting = Setting.legal_document_is_mandatory
|
||||
legaldoc_optout || !setting
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,74 +1,5 @@
|
|||
class Setting < RailsSettings::Base
|
||||
include Versions # version/setting_version.rb
|
||||
source Rails.root.join('config', 'app.yml')
|
||||
# frozen_string_literal: true
|
||||
|
||||
# When config/app.yml has changed, you need change this prefix to v2, v3 ... to expires caches
|
||||
cache_prefix { 'v2' }
|
||||
|
||||
def self.reload_settings!
|
||||
STDOUT << "#{Time.zone.now.utc} - Clearing settings cache\n"
|
||||
Rails.cache.delete_matched('settings:.*')
|
||||
STDOUT << "#{Time.zone.now.utc} - Settings cache cleared\n"
|
||||
end
|
||||
|
||||
|
||||
# cannot do instance validation because CachedSetting use save!
|
||||
def self.params_errors(params)
|
||||
errors = {}
|
||||
# DS data allowed and Allow key data cannot be both true
|
||||
if !!params["key_data_allowed"] && params["key_data_allowed"] == params["ds_data_allowed"]
|
||||
msg = "#{I18n.t(:key_data_allowed)} and #{I18n.t(:ds_data_with_key_allowed)} cannot be both true"
|
||||
errors["key_data_allowed"] = msg
|
||||
errors["ds_data_allowed"] = msg
|
||||
end
|
||||
|
||||
return errors
|
||||
end
|
||||
|
||||
def self.integer_settings
|
||||
%i[
|
||||
admin_contacts_min_count
|
||||
admin_contacts_max_count
|
||||
tech_contacts_min_count
|
||||
tech_contacts_max_count
|
||||
orphans_contacts_in_months
|
||||
ds_digest_type
|
||||
dnskeys_min_count
|
||||
dnskeys_max_count
|
||||
ns_min_count
|
||||
ns_max_count
|
||||
transfer_wait_time
|
||||
invoice_number_min
|
||||
invoice_number_max
|
||||
days_to_keep_invoices_active
|
||||
days_to_keep_overdue_invoices_active
|
||||
days_to_renew_domain_before_expire
|
||||
expire_warning_period
|
||||
redemption_grace_period
|
||||
expire_pending_confirmation
|
||||
dispute_period_in_months
|
||||
]
|
||||
end
|
||||
|
||||
def self.float_settings
|
||||
%i[
|
||||
registry_vat_prc
|
||||
minimum_deposit
|
||||
]
|
||||
end
|
||||
|
||||
def self.boolean_settings
|
||||
%i[
|
||||
ds_data_allowed
|
||||
key_data_allowed
|
||||
client_side_status_editing_enabled
|
||||
registrar_ip_whitelist_enabled
|
||||
api_ip_whitelist_enabled
|
||||
request_confrimation_on_registrant_change_enabled
|
||||
request_confirmation_on_domain_deletion_enabled
|
||||
nameserver_required
|
||||
address_processing
|
||||
legal_document_is_mandatory
|
||||
]
|
||||
end
|
||||
class Setting < SettingEntry
|
||||
# Bridge Setting calls to SettingEntry, so we don't have to drop legacy settings yet
|
||||
end
|
||||
|
|
92
app/models/setting_entry.rb
Normal file
92
app/models/setting_entry.rb
Normal file
|
@ -0,0 +1,92 @@
|
|||
class SettingEntry < ApplicationRecord
|
||||
include Versions
|
||||
validates :code, presence: true, uniqueness: true, format: { with: /\A([a-z])[a-z|_]+[a-z]\z/ }
|
||||
validates :format, presence: true
|
||||
validates :group, presence: true
|
||||
validate :validate_value_format
|
||||
validate :validate_code_is_not_using_reserved_name
|
||||
before_update :replace_boolean_nil_with_false
|
||||
|
||||
VALUE_FORMATS = {
|
||||
string: :string_format,
|
||||
integer: :integer_format,
|
||||
float: :float_format,
|
||||
boolean: :boolean_format,
|
||||
hash: :hash_format,
|
||||
array: :array_format,
|
||||
}.with_indifferent_access.freeze
|
||||
|
||||
def retrieve
|
||||
method = VALUE_FORMATS[format]
|
||||
return false if self.format == 'boolean' && value.blank?
|
||||
return if value.blank?
|
||||
|
||||
send(method)
|
||||
end
|
||||
|
||||
def self.with_group(group_name)
|
||||
SettingEntry.order(id: :asc).where(group: group_name)
|
||||
end
|
||||
|
||||
# rubocop:disable Style/MethodMissingSuper
|
||||
# rubocop:disable Style/MissingRespondToMissing
|
||||
def self.method_missing(method, *args)
|
||||
super(method, *args)
|
||||
rescue NoMethodError
|
||||
get_or_set(method.to_s, args[0])
|
||||
end
|
||||
# rubocop:enable Style/MissingRespondToMissing
|
||||
# rubocop:enable Style/MethodMissingSuper
|
||||
|
||||
def self.get_or_set(method_name, arg)
|
||||
if method_name[-1] == '='
|
||||
SettingEntry.find_by!(code: method_name.sub('=', '')).update(value: arg.to_s)
|
||||
else
|
||||
stg = SettingEntry.find_by(code: method_name)
|
||||
stg ? stg.retrieve : nil
|
||||
end
|
||||
end
|
||||
|
||||
# Hooks
|
||||
def replace_boolean_nil_with_false
|
||||
return unless self.format == 'boolean'
|
||||
return if value == 'true'
|
||||
|
||||
self.value = 'false'
|
||||
end
|
||||
|
||||
def validate_code_is_not_using_reserved_name
|
||||
disallowed = []
|
||||
ActiveRecord::Base.instance_methods.sort.each { |m| disallowed << m.to_s }
|
||||
errors.add(:code, :invalid) if disallowed.include? code
|
||||
end
|
||||
|
||||
def validate_value_format
|
||||
formats = VALUE_FORMATS.with_indifferent_access
|
||||
errors.add(:format, :invalid) unless formats.keys.any? format
|
||||
end
|
||||
|
||||
def string_format
|
||||
value
|
||||
end
|
||||
|
||||
def integer_format
|
||||
value.to_i
|
||||
end
|
||||
|
||||
def float_format
|
||||
value.to_f
|
||||
end
|
||||
|
||||
def boolean_format
|
||||
value == 'true'
|
||||
end
|
||||
|
||||
def hash_format
|
||||
JSON.parse(value)
|
||||
end
|
||||
|
||||
def array_format
|
||||
JSON.parse(value).to_a
|
||||
end
|
||||
end
|
4
app/models/version/setting_entry_version.rb
Normal file
4
app/models/version/setting_entry_version.rb
Normal file
|
@ -0,0 +1,4 @@
|
|||
class SettingEntryVersion < PaperTrail::Version
|
||||
self.table_name = :log_setting_entries
|
||||
self.sequence_name = :log_setting_entries
|
||||
end
|
|
@ -1,9 +1,8 @@
|
|||
- value = Setting.send(var)
|
||||
%tr{class: (@errors && @errors.has_key?(var.to_s) && "danger")}
|
||||
%td.col-md-6= var.to_s.humanize
|
||||
- if [TrueClass, FalseClass].include?(value.class)
|
||||
%tr{class: (@errors && @errors.has_key?(setting.code) && "danger")}
|
||||
%td.col-md-6= setting.code.humanize
|
||||
- if [TrueClass, FalseClass].include?(setting.retrieve.class)
|
||||
%td.col-md-6
|
||||
= hidden_field_tag("[settings][#{var}]", '', id: nil)
|
||||
= check_box_tag("[settings][#{var}]", true, value)
|
||||
= hidden_field_tag("[settings][#{setting.id}]", '', id: nil)
|
||||
= check_box_tag("[settings][#{setting.id}]", true, setting.retrieve)
|
||||
- else
|
||||
%td.col-md-6= text_field_tag("[settings][#{var}]", value, class: 'form-control')
|
||||
%td.col-md-6= text_field_tag("[settings][#{setting.id}]", setting.value, class: 'form-control')
|
||||
|
|
|
@ -9,20 +9,8 @@
|
|||
.table-responsive
|
||||
%table.table.table-hover.table-bordered.table-condensed
|
||||
%tbody
|
||||
= render 'setting_row', var: :admin_contacts_min_count
|
||||
= render 'setting_row', var: :admin_contacts_max_count
|
||||
= render 'setting_row', var: :tech_contacts_min_count
|
||||
= render 'setting_row', var: :tech_contacts_max_count
|
||||
= render 'setting_row', var: :orphans_contacts_in_months
|
||||
= render 'setting_row', var: :ds_data_allowed
|
||||
= render 'setting_row', var: :key_data_allowed
|
||||
= render 'setting_row', var: :dnskeys_min_count
|
||||
= render 'setting_row', var: :dnskeys_max_count
|
||||
= render 'setting_row', var: :nameserver_required
|
||||
= render 'setting_row', var: :ns_min_count
|
||||
= render 'setting_row', var: :ns_max_count
|
||||
= render 'setting_row', var: :expire_pending_confirmation
|
||||
= render 'setting_row', var: :legal_document_is_mandatory
|
||||
- @validation_settings.each do |setting|
|
||||
= render 'setting_row', setting: setting
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
|
@ -30,10 +18,8 @@
|
|||
.table-responsive
|
||||
%table.table.table-hover.table-bordered.table-condensed
|
||||
%tbody
|
||||
= render 'setting_row', var: :days_to_renew_domain_before_expire
|
||||
= render 'setting_row', var: :expire_warning_period
|
||||
= render 'setting_row', var: :redemption_grace_period
|
||||
= render 'setting_row', var: :expiration_reminder_mail
|
||||
- @expiration_settings.each do |setting|
|
||||
= render 'setting_row', setting: setting
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
|
@ -41,19 +27,12 @@
|
|||
.table-responsive
|
||||
%table.table.table-hover.table-bordered.table-condensed
|
||||
%tbody
|
||||
= render 'setting_row', var: :transfer_wait_time
|
||||
= render 'setting_row', var: :ds_digest_type
|
||||
= render 'setting_row', var: :client_side_status_editing_enabled
|
||||
= render 'setting_row', var: :api_ip_whitelist_enabled
|
||||
= render 'setting_row', var: :registrar_ip_whitelist_enabled
|
||||
= render 'setting_row', var: :request_confrimation_on_registrant_change_enabled
|
||||
= render 'setting_row', var: :request_confirmation_on_domain_deletion_enabled
|
||||
= render 'setting_row', var: :address_processing
|
||||
= render 'setting_row', var: :dispute_period_in_months
|
||||
- @other_settings.each do |setting|
|
||||
= render 'setting_row', setting: setting
|
||||
%tr
|
||||
%td.col-md-6= label_tag :default_language
|
||||
%td.col-md-6
|
||||
= select_tag '[settings][default_language]',
|
||||
= select_tag "[settings][#{SettingEntry.find_by(code: 'default_language').id || 1}]",
|
||||
options_for_select(available_languages, Setting.default_language),
|
||||
class: 'form-control'
|
||||
|
||||
|
@ -63,25 +42,8 @@
|
|||
.table-responsive
|
||||
%table.table.table-hover.table-bordered.table-condensed
|
||||
%tbody
|
||||
= render 'setting_row', var: :invoice_number_min
|
||||
= render 'setting_row', var: :invoice_number_max
|
||||
= render 'setting_row', var: :directo_monthly_number_min
|
||||
= render 'setting_row', var: :directo_monthly_number_max
|
||||
= render 'setting_row', var: :directo_monthly_number_last
|
||||
= render 'setting_row', var: :days_to_keep_invoices_active
|
||||
= render 'setting_row', var: :days_to_keep_overdue_invoices_active
|
||||
= render 'setting_row', var: :minimum_deposit
|
||||
= render 'setting_row', var: :directo_receipt_payment_term
|
||||
= render 'setting_row', var: :directo_receipt_product_name
|
||||
= render 'setting_row', var: :directo_sales_agent
|
||||
= render 'setting_row', var: :registry_billing_email
|
||||
= render 'setting_row', var: :registry_invoice_contact
|
||||
= render 'setting_row', var: :registry_vat_no
|
||||
= render 'setting_row', var: :registry_vat_prc
|
||||
= render 'setting_row', var: :registry_bank
|
||||
= render 'setting_row', var: :registry_bank_code
|
||||
= render 'setting_row', var: :registry_iban
|
||||
= render 'setting_row', var: :registry_swift
|
||||
- @billing_settings.each do |setting|
|
||||
= render 'setting_row', setting: setting
|
||||
|
||||
.panel.panel-default
|
||||
.panel-heading
|
||||
|
@ -89,17 +51,8 @@
|
|||
.table-responsive
|
||||
%table.table.table-hover.table-bordered.table-condensed
|
||||
%tbody
|
||||
= render 'setting_row', var: :registry_juridical_name
|
||||
= render 'setting_row', var: :registry_reg_no
|
||||
= render 'setting_row', var: :registry_email
|
||||
= render 'setting_row', var: :registry_phone
|
||||
= render 'setting_row', var: :registry_url
|
||||
= render 'setting_row', var: :registry_street
|
||||
= render 'setting_row', var: :registry_city
|
||||
= render 'setting_row', var: :registry_state
|
||||
= render 'setting_row', var: :registry_zip
|
||||
= render 'setting_row', var: :registry_country_code
|
||||
= render 'setting_row', var: :registry_whois_disclaimer
|
||||
- @contacts_settings.each do |setting|
|
||||
= render 'setting_row', setting: setting
|
||||
|
||||
.row
|
||||
.col-md-12.text-right
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue