mirror of
https://github.com/internetee/registry.git
synced 2025-07-31 15:06:23 +02:00
Basic disclosure support
This commit is contained in:
parent
4b5e25636e
commit
0a1c2d3d57
6 changed files with 119 additions and 4 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
46
app/models/contact_disclosure.rb
Normal file
46
app/models/contact_disclosure.rb
Normal 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
|
19
db/migrate/20140828133057_create_contact_disclosures.rb
Normal file
19
db/migrate/20140828133057_create_contact_disclosures.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
class CreateContactDisclosures < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :contact_disclosures do |t|
|
||||
t.integer :contact_id
|
||||
|
||||
t.boolean :int_name, default: false
|
||||
t.boolean :int_org_name, default: false
|
||||
t.boolean :int_addr, default: false
|
||||
t.boolean :loc_name, default: false
|
||||
t.boolean :loc_org_name, default: false
|
||||
t.boolean :loc_addr, default: false
|
||||
t.boolean :phone, default: false
|
||||
t.boolean :fax, default: false
|
||||
t.boolean :email, default: false
|
||||
|
||||
t.timestamps
|
||||
end
|
||||
end
|
||||
end
|
22
db/schema.rb
22
db/schema.rb
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20140828080320) do
|
||||
ActiveRecord::Schema.define(version: 20140828133057) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
@ -31,6 +31,21 @@ ActiveRecord::Schema.define(version: 20140828080320) do
|
|||
t.string "type"
|
||||
end
|
||||
|
||||
create_table "contact_disclosures", force: true do |t|
|
||||
t.integer "contact_id"
|
||||
t.boolean "int_name", default: false
|
||||
t.boolean "int_org_name", default: false
|
||||
t.boolean "int_addr", default: false
|
||||
t.boolean "loc_name", default: false
|
||||
t.boolean "loc_org_name", default: false
|
||||
t.boolean "loc_addr", default: false
|
||||
t.boolean "phone", default: false
|
||||
t.boolean "fax", default: false
|
||||
t.boolean "email", default: false
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
end
|
||||
|
||||
create_table "contacts", force: true do |t|
|
||||
t.string "code"
|
||||
t.string "type"
|
||||
|
@ -104,6 +119,11 @@ ActiveRecord::Schema.define(version: 20140828080320) do
|
|||
t.string "period_unit", limit: 1
|
||||
end
|
||||
|
||||
create_table "domains_nameservers", force: true do |t|
|
||||
t.integer "domain_id"
|
||||
t.integer "nameserver_id"
|
||||
end
|
||||
|
||||
create_table "epp_sessions", force: true do |t|
|
||||
t.string "session_id"
|
||||
t.text "data"
|
||||
|
|
28
spec/models/contact_disclosure_spec.rb
Normal file
28
spec/models/contact_disclosure_spec.rb
Normal file
|
@ -0,0 +1,28 @@
|
|||
require 'rails_helper'
|
||||
|
||||
describe ContactDisclosure do
|
||||
it { should belong_to(:contact) }
|
||||
end
|
||||
|
||||
describe '.extract_attributes' do
|
||||
it 'should return empty hash for empty arguments' do
|
||||
result = ContactDisclosure.extract_attributes(Nokogiri::XML::Document.new)
|
||||
expect(result).to eq({})
|
||||
end
|
||||
|
||||
it 'should return empty hash if no disclosure' do
|
||||
parsed_frame = Nokogiri::XML(contact_create_xml).remove_namespaces!
|
||||
result = ContactDisclosure.extract_attributes(parsed_frame)
|
||||
expect(result).to eq({})
|
||||
end
|
||||
|
||||
# TODO: remodel create contact xml to support disclosure
|
||||
it 'should return disclosure has if disclosure' do
|
||||
f = File.open('spec/epp/requests/contacts/create_with_two_addresses.xml')
|
||||
parsed_frame = Nokogiri::XML(f).remove_namespaces!
|
||||
f.close
|
||||
result = ContactDisclosure.extract_attributes(parsed_frame)
|
||||
expect(result).to eq({ phone: '0', email: '0' })
|
||||
end
|
||||
end
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue