Project

General

Profile

Download (5.97 KB) Statistics
| Branch: | Tag: | Revision:
4deab2f3 Lukas Zapletal
class LookupKey < ApplicationRecord
a03e5341 Marek Hulan
audited :associated_with => :audit_class
acfbc458 Marek Hulan
include Authorizable
e4ae4a69 Ori Rabin
include HiddenValue
60cf5a37 Shimon Shtein
include Classification
9afa092e Ohad Levy
4c4f30bc Tomer Brisker
KEY_TYPES = [N_("string"), N_("boolean"), N_("integer"), N_("real"), N_("array"), N_("hash"), N_("yaml"), N_("json")]
VALIDATOR_TYPES = [N_("regexp"), N_("list") ]
f8d94608 Amos Benari
9afa092e Ohad Levy
KEY_DELM = ","
EQ_DELM = "="
9d43fc71 Michael Moll
VALUE_REGEX = /\A[^#{KEY_DELM}]+#{EQ_DELM}[^#{KEY_DELM}]+(#{KEY_DELM}[^#{KEY_DELM}]+#{EQ_DELM}[^#{KEY_DELM}]+)*\Z/
9afa092e Ohad Levy
3034e8e2 Ori Rabin
validates_lengths_from_database
971fee79 Dominic Cleal
f8d94608 Amos Benari
serialize :default_value

9afa092e Ohad Levy
has_many :lookup_values, :dependent => :destroy, :inverse_of => :lookup_key
8e53b7c9 Ori Rabin
accepts_nested_attributes_for :lookup_values,
09ce8a63 Ori Rabin
:reject_if => :reject_invalid_lookup_values,
8e53b7c9 Ori Rabin
:allow_destroy => true
f8d94608 Amos Benari
98e79eff Ori Rabin
alias_attribute :value, :default_value
3034e8e2 Ori Rabin
f2c78d4a Joseph Magen
validates :key, :presence => true
cba97ace Joseph Magen
validates :validator_type, :inclusion => { :in => VALIDATOR_TYPES, :message => N_("invalid")}, :allow_blank => true, :allow_nil => true
validates :key_type, :inclusion => {:in => KEY_TYPES, :message => N_("invalid")}, :allow_blank => true, :allow_nil => true
0265427b Ohad Levy
validates_associated :lookup_values

9afa092e Ohad Levy
before_save :sanitize_path
3b656b8d Joseph Mitchell Magen
attr_name :key
9afa092e Ohad Levy
6b4b489f Ori Rabin
def self.inherited(child)
child.instance_eval do
ed67b8c9 Dominic Cleal
scoped_search :on => :key, :aliases => [:parameter], :complete_value => true, :default_order => true
6b4b489f Ori Rabin
scoped_search :on => :override, :complete_value => {:true => true, :false => false}
scoped_search :on => :merge_overrides, :complete_value => {:true => true, :false => false}
scoped_search :on => :merge_default, :complete_value => {:true => true, :false => false}
scoped_search :on => :avoid_duplicates, :complete_value => {:true => true, :false => false}
end
8f14d696 Shlomi Zadok
super
6b4b489f Ori Rabin
end
9afa092e Ohad Levy
e4ae4a69 Ori Rabin
def self.hidden_value
HIDDEN_VALUE
end

bb3572ff Daniel Lobato
default_scope -> { order('lookup_keys.key') }
f2c78d4a Joseph Magen
bb3572ff Daniel Lobato
scope :override, -> { where(:override => true) }
9afa092e Ohad Levy
21bf889a Joseph Mitchell Magen
# new methods for API instead of revealing db names
alias_attribute :parameter, :key
alias_attribute :variable, :key
alias_attribute :parameter_type, :key_type
alias_attribute :variable_type, :key_type
alias_attribute :override_value_order, :path
bbf64d99 Joseph Magen
alias_attribute :override_values, :lookup_values
alias_attribute :override_value_ids, :lookup_value_ids
21bf889a Joseph Mitchell Magen
# to prevent errors caused by find_resource from override_values controller
def self.find_by_name(str)
nil
end

d4b8428f amirfefer
def reject_invalid_lookup_values(attributes)
attributes[:match].empty?
end

6b4b489f Ori Rabin
def audit_class
self
21bf889a Joseph Mitchell Magen
end

6b4b489f Ori Rabin
def to_label
"#{audit_class}::#{key}"
21bf889a Joseph Mitchell Magen
end

ea4eec44 Ori Rabin
def supports_merge?
['array', 'hash'].include?(key_type)
end

def supports_uniq?
key_type == 'array'
end

9afa092e Ohad Levy
def to_param
ea740cfe Ori Rabin
# to_param is used in views to create a link to the lookup_key.
# If the key has whitespace in it the link will break so this replaced the whitespace.
3cd8c84b Michael Moll
search_key = key.tr(' ', '_') unless key.nil?
ea740cfe Ori Rabin
Parameterizable.parameterize("#{id}-#{search_key}")
0265427b Ohad Levy
end

b28fdce4 Ohad Levy
def to_s
key
end

9afa092e Ohad Levy
def path
74275f51 Michael Moll
path = self[:path]
20b2ec5b Michael Moll
path.presence || array2path(Setting["Default_variables_Lookup_Path"])
9afa092e Ohad Levy
end

def path=(v)
77a8080a Ohad Levy
return unless v
3cd8c84b Michael Moll
using_default = v.tr("\r", "") == array2path(Setting["Default_variables_Lookup_Path"])
74275f51 Michael Moll
self[:path] = using_default ? nil : v
f8d94608 Amos Benari
end

def default_value_before_type_cast
74275f51 Michael Moll
return self[:default_value] if errors[:default_value].present?
f8d94608 Amos Benari
value_before_type_cast default_value
end

5f029ed6 Daniel Lobato
def value_before_type_cast(val)
6a7e5074 Tomer Brisker
return val if val.nil? || val.contains_erb?
75bd351e Ohad Levy
case key_type.to_sym
801a90d1 Stephen Benjamin
when :json, :array
57000497 Tomer Brisker
val = JSON.dump(val)
f8d94608 Amos Benari
when :yaml, :hash
val = YAML.dump val
d076d573 Joseph Mitchell Magen
val.sub!(/\A---\s*$\n/, '')
85021506 Michael Moll
end if key_type.present?
f8d94608 Amos Benari
val
end

71291a46 Dmitri Dolguikh
def path_elements
path.split.map do |paths|
paths.split(KEY_DELM).map do |element|
element
end
end
end

6501082f Tomer Brisker
def overridden?(obj)
return false unless obj.respond_to? :lookup_values
overridden_value(obj).present?
end

# check if obj has a lookupvalue that relates to this key and return it
# we cannot search the database, in case the lookup value hasn't been saved yet
def overridden_value(obj)
obj.lookup_values.detect do |lookup_value|
lookup_value.lookup_key_id == self.id
end
0575b5b0 Tom Caspy
end

6b4b489f Ori Rabin
def puppet?
false
end

ffdcc07d Tomer Brisker
def sorted_values
prio = path.split
lookup_values.sort_by{|val| prio.index(val.path)}
end

9afa092e Ohad Levy
private

def sanitize_path
3cd8c84b Michael Moll
self.path = path.tr("\s", "").downcase if path.present?
9afa092e Ohad Levy
end

5f029ed6 Daniel Lobato
def array2path(array)
bfbf7ed8 Lukas Zapletal
raise ::Foreman::Exception.new(N_("invalid path")) unless array.is_a?(Array)
9afa092e Ohad Levy
array.map do |sub_array|
sub_array.is_a?(Array) ? sub_array.join(KEY_DELM) : sub_array
end.join("\n")
end

9f88e8a1 Tom Caspy
def cast_default_value
6a7e5074 Tomer Brisker
return true if default_value.nil? || default_value.contains_erb?
f8d94608 Amos Benari
begin
9f88e8a1 Tom Caspy
Foreman::Parameters::Caster.new(self, :attribute_name => :default_value, :to => key_type).cast!
f8d94608 Amos Benari
rescue
bfbf7ed8 Lukas Zapletal
errors.add(:default_value, _("is invalid"))
f8d94608 Amos Benari
end
4db14e17 Tom Caspy
true
f8d94608 Amos Benari
end

5f029ed6 Daniel Lobato
def load_yaml_or_json(value)
f8d94608 Amos Benari
return value unless value.is_a? String
begin
JSON.load value
rescue
YAML.load value
end
end

9f88e8a1 Tom Caspy
def validate_default_value
Foreman::Parameters::Validator.new(self,
:type => validator_type,
:validate_with => validator_rule,
:getter => :default_value).validate!
9afa092e Ohad Levy
end

ea4eec44 Ori Rabin
def disable_merge_overrides
if merge_overrides && !supports_merge?
self.errors.add(:merge_overrides, _("can only be set for array or hash"))
end
end

def disable_avoid_duplicates
if avoid_duplicates && (!merge_overrides || !supports_uniq?)
self.errors.add(:avoid_duplicates, _("can only be set for arrays that have merge_overrides set to true"))
end
end
8347a5ef Ori Rabin
def disable_merge_default
if merge_default && !merge_overrides
self.errors.add(:merge_default, _("can only be set when merge overrides is set"))
end
end
c2ae41a8 Tomer Brisker
def skip_strip_attrs
['default_value']
end
0265427b Ohad Levy
end
afe87279 Marek Hulán
require_dependency 'puppetclass_lookup_key'
require_dependency 'variable_lookup_key'