diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 97b3ad621..feb2a7677 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -72,4 +72,15 @@ module ApplicationHelper
link_to(title, url_for(sort: {param_name => order}), class: "sort_link #{order}")
end
+
+ def changing_css_class(version, *attrs)
+ return unless version
+ css_class = "text-warning"
+
+ if attrs.size == 1
+ version.object_changes.to_h[attrs.first] && css_class
+ else
+ version.object_changes.to_h.slice(*attrs).any? && css_class
+ end
+ end
end
diff --git a/app/models/concerns/versions.rb b/app/models/concerns/versions.rb
index 768cf021e..779bd781a 100644
--- a/app/models/concerns/versions.rb
+++ b/app/models/concerns/versions.rb
@@ -3,6 +3,7 @@ module Versions
extend ActiveSupport::Concern
included do
+ attr_accessor :version_loader
has_paper_trail class_name: "#{model_name}Version"
# add creator and updator
@@ -55,4 +56,23 @@ module Versions
domains.each(&:touch_with_version)
end
end
+
+ module ClassMethods
+ def all_versions_for(ids, time)
+ ver_klass = paper_trail_version_class
+ from_history = ver_klass.where(item_id: ids).
+ order(:item_id).
+ preceding(time + 1, true).
+ select("distinct on (item_id) #{ver_klass.table_name}.*").
+ map do |ver|
+ o = new(ver.object)
+ o.version_loader = ver
+ ver.object_changes.to_h.each { |k, v| o[k]=v[-1] }
+ o
+ end
+ not_in_history = where(id: (ids - from_history.map(&:id)))
+
+ from_history + not_in_history
+ end
+ end
end
diff --git a/app/models/domain.rb b/app/models/domain.rb
index 7880494cd..833cdba1a 100644
--- a/app/models/domain.rb
+++ b/app/models/domain.rb
@@ -746,6 +746,7 @@ class Domain < ActiveRecord::Base
log[:dnskeys] = dnskey_ids
log[:legal_documents]= [legal_document_id]
log[:registrant] = [registrant_id]
+ log[:dnskeys] = dnskeys_ids
log
end
diff --git a/app/views/admin/contact_versions/show.haml b/app/views/admin/contact_versions/show.haml
index 555c301dc..d6762a8c6 100644
--- a/app/views/admin/contact_versions/show.haml
+++ b/app/views/admin/contact_versions/show.haml
@@ -1,4 +1,6 @@
-= render 'shared/title', name: @version.reify.name
+- contact = Contact.new(@version.object.to_h)
+- @version.object_changes.to_h.each{|k,v| contact[k]=v.last}
+= render 'shared/title', name: contact.name
.row
.col-md-8
@@ -11,55 +13,64 @@
.panel-body
%dl.dl-horizontal
%dt= t(:id)
- %dd= @version.reify.code
+ %dd{class: changing_css_class(@version,"code")}
+ = contact.code
+
+ %dt= t(:statuses)
+ %dd{class: changing_css_class(@version,"statuses")}
+ = contact.statuses.join(", ")
%dt= t(:ident)
- %dd= ident_for(@version.reify)
+ %dd{class: changing_css_class(@version,"ident_country_code", "ident_type", "ident")}
+ = ident_for(contact)
%dt= t(:email)
- %dd= @version.reify.email
+ %dd{class: changing_css_class(@version,"email")}
+ = contact.email
%dt= t(:phone)
- %dd= @version.reify.phone
+ %dd{class: changing_css_class(@version,"phone")}
+ = contact.phone
- - if @version.reify.fax
+ - if contact.fax
%dt= t(:fax)
- %dd= @version.reify.fax
+ %dd{class: changing_css_class(@version,"fax")}
+ = contact.fax
%br
%dt= t(:created)
- %dd
- = l(@version.reify.created_at, format: :short)
+ %dd{class: changing_css_class(@version,"created_at")}
+ = l(contact.created_at, format: :short)
%dt= t(:updated)
- %dd
- = l(@version.reify.updated_at, format: :short)
+ %dd{class: changing_css_class(@version,"updated_at")}
+ = l(contact.updated_at, format: :short)
%dt= t(:registrar)
- %dd
- - if @version.reify.registrar.present?
- = link_to(@version.reify.registrar, admin_registrar_path(@version.reify.registrar))
+ %dd{class: changing_css_class(@version,"registrar_id")}
+ - if contact.registrar.present?
+ = link_to(contact.registrar, admin_registrar_path(contact.registrar))
%dl.dl-horizontal
- - if @version.reify.org_name.present?
+ - if contact.org_name.present?
%dt= t(:org_name)
- %dd= @version.reify.org_name
+ %dd{class: changing_css_class(@version,"org_name")}= contact.org_name
%dt= t(:street)
- %dd= @version.reify.street.to_s.gsub("\n", '
').html_safe
+ %dd{class: changing_css_class(@version,"street")}= contact.street.to_s.gsub("\n", '
').html_safe
%dt= t(:city)
- %dd= @version.reify.city
+ %dd{class: changing_css_class(@version,"city")}= contact.city
%dt= t(:zip)
- %dd= @version.reify.zip
+ %dd{class: changing_css_class(@version,"zip")}= contact.zip
%dt= t(:state)
- %dd= @version.reify.state
+ %dd{class: changing_css_class(@version,"state")}= contact.state
%dt= t(:country)
- %dd= @version.reify.country
+ %dd{class: changing_css_class(@version,"country_code")}= contact.country
%span{:style => "padding-right:10px; float: right;"}
diff --git a/app/views/admin/domain_versions/show.haml b/app/views/admin/domain_versions/show.haml
index e6076a3db..6244e60f0 100644
--- a/app/views/admin/domain_versions/show.haml
+++ b/app/views/admin/domain_versions/show.haml
@@ -1,11 +1,13 @@
= render 'shared/title', name: @version.reify.name
+- domain = Domain.new(@version.object.to_h)
+- @version.object_changes.to_h.each{|k,v| domain[k]=v.last}
- if @version
- children = HashWithIndifferentAccess.new(@version.children)
- - nameservers = Nameserver.where(id: children[:nameservers])
- - tech_contacts = Contact.where(id: children[:tech_contacts])
- - admin_contacts = Contact.where(id: children[:admin_contacts])
- - registrant = Contact.where(id: children[:registrant])
+ - nameservers = Nameserver.all_versions_for(children[:nameservers], @version.created_at)
+ - tech_contacts = Contact.all_versions_for(children[:tech_contacts], @version.created_at)
+ - admin_contacts = Contact.all_versions_for(children[:admin_contacts], @version.created_at)
+ - registrant = Contact.all_versions_for(children[:registrant], @version.created_at)
- event = @version.event
- creator = plain_username(@version.terminator)
@@ -21,36 +23,47 @@
.panel-body
%dl.dl-horizontal
%dt= t(:name)
- %dd= link_to(@version.reify.name, admin_domain_path(@version.item_id))
+ %dd= link_to(domain.name, admin_domain_path(@version.item_id))
+
%dt= t(:statuses)
- %dd
- - if @version.reify.statuses.present?
- - @version.reify.statuses.each do |s|
+ %dd{class: changing_css_class(@version,"statuses")}
+ - if domain.statuses.present?
+ - domain.statuses.each do |s|
= s
+
%dt= t(:registrant)
- %dd
+ %dd{class: changing_css_class(@version,"registrant_id")}
- registrant.each do |r|
- = r[:name]
- = r[:phone]
- = r[:email]
- = r[:code]
- %br
+ - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
+ = link_to link, target: "contact_#{r.id}" do
+ = r[:name]
+ = r[:phone]
+ = r[:email]
+ = r[:code]
+ %br
+
%dt= t(:admin_contacts)
%dd
- admin_contacts.each do |r|
- = r[:name]
- = r[:phone]
- = r[:email]
- = r[:code]
- %br
+ - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
+ = link_to link, target: "contact_#{r.id}" do
+ = r[:name]
+ = r[:phone]
+ = r[:email]
+ = r[:code]
+ %br
+
%dt= t(:tech_contacts)
%dd
- tech_contacts.each do |r|
- = r[:name]
- = r[:phone]
- = r[:email]
- = r[:code]
- %br
+ - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
+ = link_to link, target: "contact_#{r.id}" do
+ = r[:name]
+ = r[:phone]
+ = r[:email]
+ = r[:code]
+ %br
+
%dt= t(:nameservers)
%dd
- nameservers.each do |ns|
@@ -58,8 +71,12 @@
= ns[:ipv4]
= ns[:ipv6]
%br
+
%dt= t(:registrar)
- %dd= @version.reify.registrar.name
+ %dd{class: changing_css_class(@version,"registrar_id")}
+ = link_to admin_registrar_path(domain.registrar), target: "registrar_#{domain.registrar.id}" do
+ = domain.registrar.name
+
%span{:style => "padding-right:10px; padding-top:40px; float: right; bottom: 10px;"}
- if @version.previous
= link_to(t(:previous),
diff --git a/app/views/admin/domains/partials/_version.haml b/app/views/admin/domains/partials/_version.haml
index fd449b4b0..15768ea16 100644
--- a/app/views/admin/domains/partials/_version.haml
+++ b/app/views/admin/domains/partials/_version.haml
@@ -5,20 +5,20 @@
- if domain.present?
- if version # normal history
- - children = HashWithIndifferentAccess.new(version.children)
- - nameservers = Nameserver.where(id: children[:nameservers])
- - tech_contacts = Contact.where(id: children[:tech_contacts])
- - admin_contacts = Contact.where(id: children[:admin_contacts])
- - registrant = Contact.where(id: children[:registrant])
- - event = version.event
- - creator = plain_username(version.terminator)
+ - children = HashWithIndifferentAccess.new(version.children)
+ - nameservers = Nameserver.all_versions_for(children[:nameservers], version.created_at)
+ - tech_contacts = Contact.all_versions_for(children[:tech_contacts], version.created_at)
+ - admin_contacts = Contact.all_versions_for(children[:admin_contacts], version.created_at)
+ - registrant = Contact.all_versions_for(children[:registrant], version.created_at)
+ - event = version.event
+ - creator = plain_username(version.terminator)
- else # pending history
- nameservers = domain.nameservers
- tech_contacts = domain.tech_contacts
- admin_contacts = domain.admin_contacts
- - registrant = [domain.registrant]
- - creator = pending_user.try(:username)
- - event = 'pending'
+ - registrant = [domain.registrant]
+ - creator = pending_user.try(:username)
+ - event = 'pending'
%td
%p.nowrap
@@ -31,7 +31,7 @@
%br
= creator
- %td
+ %td{class: changing_css_class(version,"statuses")}
%p
- if domain.statuses.present?
- domain.statuses.each do |s|
@@ -46,7 +46,7 @@
%p
= link_to t(:pending_epp), '#', class: 'js-pending-toggle'
- %td
+ %td{class: changing_css_class(version, "period", "period_unit", "valid_from", "valid_to")}
%p
= "#{domain.period}#{domain.period_unit}"
%br
@@ -55,43 +55,52 @@
= "#{l(domain.valid_to, format: :date)}"
%td
- - registrant.each do |r|
- %p
- = r[:name]
- = r[:phone]
- = r[:email]
- %p
- = r[:code]
+ - Array(registrant).each do |r|
+ - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
+ = link_to link, target: "contact_#{r.id}" do
+ %p
+ = r[:name]
+ = r[:phone]
+ = r[:email]
+ %p
+ = r[:code]
%td
- - admin_contacts.each do |ac|
- %p
- = ac[:name]
- = ac[:phone]
- = ac[:email]
- %p
- = ac[:code]
+ - Array(admin_contacts).each do |ac|
+ - link = ac.version_loader ? admin_contact_version_path(ac.version_loader.try(:id)) : admin_contact_path(ac.id)
+ = link_to link, target: "contact_#{ac.id}" do
+ %p
+ = ac[:name]
+ = ac[:phone]
+ = ac[:email]
+ %p
+ = ac[:code]
%td
- - tech_contacts.each do |tc|
- %p
- = tc[:name]
- = tc[:phone]
- = tc[:email]
- %p
- = tc[:code]
+ - Array(tech_contacts).each do |tc|
+ - link = tc.version_loader ? admin_contact_version_path(tc.version_loader.try(:id)) : admin_contact_path(tc.id)
+ = link_to link, target: "contact_#{tc.id}" do
+ %p
+ = tc[:name]
+ = tc[:phone]
+ = tc[:email]
+ %p
+ = tc[:code]
%td
%p
- - nameservers.each do |ns|
+ - Array(nameservers).each do |ns|
= ns[:hostname]
%br
- = ns[:ipv4]
- = ns[:ipv6]
+ = ns[:ipv4].presence
+ = ns[:ipv6].presence
+ %br
- %td
- %p
- = domain.registrar.name
+ %td{class: changing_css_class(version,"registrar_id")}
+ - if domain.registrar
+ %p
+ = link_to admin_registrar_path(domain.registrar), target: "registrar_#{domain.registrar.id}" do
+ = domain.registrar.name
- if domain.pending_json.present?
%tr.js-pending{ style: 'display: none;' }
diff --git a/app/views/admin/domains/versions.haml b/app/views/admin/domains/versions.haml
index 5224aa34a..175b0be02 100644
--- a/app/views/admin/domains/versions.haml
+++ b/app/views/admin/domains/versions.haml
@@ -5,7 +5,7 @@
.row
.col-md-12
.table-responsive
- %table.table-hover.table-bordered.table-condensed
+ %table.table.table-bordered.table-condensed
%thead
%tr
%th{class: 'col-xs-1'}= t(:timestap)