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
|
require 'active_ldap/association/collection'
require 'active_ldap/association/has_many_utils'
module ActiveLdap
module Association
class HasManyWrap < Collection
include HasManyUtils
private
def insert_entry(entry)
old_value = @owner[@options[:wrap], true]
_foreign_key = foreign_key
if _foreign_key == "dn"
old_value = dn_values_to_string_values(old_value)
end
current_value = entry[_foreign_key, true]
current_value = dn_values_to_string_values(current_value)
new_value = (old_value + current_value).uniq.sort
if old_value != new_value
@owner[@options[:wrap]] = new_value
@owner.save unless @owner.new_entry?
end
end
def delete_entries(entries)
old_value = @owner[@options[:wrap], true]
_foreign_key = foreign_key
if _foreign_key == "dn"
old_value = dn_values_to_string_values(old_value)
end
current_value = entries.collect {|entry| entry[_foreign_key]}
current_value = dn_values_to_string_values(current_value)
new_value = old_value - current_value
new_value = new_value.uniq.sort
if old_value != new_value
@owner[@options[:wrap]] = new_value
@owner.save unless @owner.new_entry?
end
end
def find_target
targets, requested_targets = collect_targets(@options[:wrap], true)
return [] if targets.nil?
found_targets = {}
_foreign_key = foreign_key
targets.each do |target|
found_targets[target[_foreign_key]] ||= target
end
klass = foreign_class
requested_targets.collect do |name|
found_targets[name] || klass.new(name)
end
end
def foreign_key
@options[:primary_key_name] || foreign_class.dn_attribute
end
def add_entries(*entries)
result = true
load_target
flatten_deeper(entries).each do |entry|
infect_connection(entry)
insert_entry(entry) or result = false
@target << entry
end
result && self
end
end
end
end
|