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)