Basic disclosure support

This commit is contained in:
Andres Keskküla 2014-08-29 11:18:04 +03:00
parent 4b5e25636e
commit 0a1c2d3d57
6 changed files with 119 additions and 4 deletions

View file

@ -135,6 +135,9 @@ module Epp::ContactsHelper
contact_hash = contact_hash.merge(
Address.extract_attributes((prms.try(:[], :postalInfo) || []))
)
contact_hash[:disclosure_attributes] =
ContactDisclosure.extract_attributes(parsed_frame)
contact_hash
end

View file

@ -8,6 +8,7 @@ class Contact < ActiveRecord::Base
has_one :local_address
has_one :international_address
has_one :disclosure, class_name: 'ContactDisclosure'
has_many :domain_contacts
has_many :domains, through: :domain_contacts
@ -15,9 +16,8 @@ class Contact < ActiveRecord::Base
belongs_to :created_by, class_name: 'EppUser', foreign_key: :created_by_id
belongs_to :updated_by, class_name: 'EppUser', foreign_key: :updated_by_id
accepts_nested_attributes_for :local_address, :international_address
accepts_nested_attributes_for :local_address, :international_address, :disclosure
# validates_presence_of :code, :phone, :email, :ident
validates :code, :phone, :email, :ident, presence: true
validate :ident_must_be_valid
@ -25,7 +25,6 @@ class Contact < ActiveRecord::Base
validates :phone, format: /\+[0-9]{1,3}\.[0-9]{1,14}?/ # /\+\d{3}\.\d+/
validates :email, format: /@/
# validates_uniqueness_of :code, message: :epp_id_taken
validates :code, uniqueness: { message: :epp_id_taken }
delegate :name, to: :international_address

View file

@ -0,0 +1,46 @@
class ContactDisclosure < ActiveRecord::Base
belongs_to :contact
# value is true or false depending on disclosure flag
# rules are the contents of disclose element
class << self
def extract_attributes(parsed_frame)
disclosure_hash = {}
rules = parsed_frame.css('disclose').first
return disclosure_hash unless rules.present?
value = rules.attributes['flag'].value
disclosure_hash = parse_disclose_xml(rules)
disclosure_hash.each do |k, _v|
disclosure_hash[k] = value
end
disclosure_hash
end
private
def parse_disclose_xml(rules)
{ int_name: parse_element_attributes_for('name', rules.children, 'int'),
int_org_name: parse_element_attributes_for('org_name', rules.children, 'int'),
int_addr: parse_element_attributes_for('addr', rules.children, 'int'),
loc_name: parse_element_attributes_for('name', rules.children, 'loc'),
loc_org_name: parse_element_attributes_for('org_name', rules.children, 'loc'),
loc_addr: parse_element_attributes_for('addr', rules.children, 'loc'),
phone: rules.css('voice').present?,
email: rules.css('email').present?,
fax: rules.css('fax').present?
}.delete_if { |_k, v| v.nil? || v == false }
end
# el is the element we are looking for
# rules are the contents of disclose element
# value is loc/int depending on what type of el we are looking for
def parse_element_attributes_for(el, rules, value)
rules.css(el).each do |rule|
next unless rule.try(:attributes) || rule.attributes['type']
return rule.attributes['type'].value.present? if rule.attributes['type'].value == value
end
nil
end
end
end