Merge branch 'story/115762063--show-historical-nested' into staging

# Conflicts:
#	app/models/domain.rb
#	app/views/admin/domains/partials/_version.haml
#	config/locales/en.yml
This commit is contained in:
Vladimir Krylov 2016-03-23 18:30:34 +02:00
commit f69c4ef919
7 changed files with 155 additions and 86 deletions

View file

@ -72,4 +72,15 @@ module ApplicationHelper
link_to(title, url_for(sort: {param_name => order}), class: "sort_link #{order}") link_to(title, url_for(sort: {param_name => order}), class: "sort_link #{order}")
end 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 end

View file

@ -3,6 +3,7 @@ module Versions
extend ActiveSupport::Concern extend ActiveSupport::Concern
included do included do
attr_accessor :version_loader
has_paper_trail class_name: "#{model_name}Version" has_paper_trail class_name: "#{model_name}Version"
# add creator and updator # add creator and updator
@ -55,4 +56,23 @@ module Versions
domains.each(&:touch_with_version) domains.each(&:touch_with_version)
end end
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 end

View file

@ -746,6 +746,7 @@ class Domain < ActiveRecord::Base
log[:dnskeys] = dnskey_ids log[:dnskeys] = dnskey_ids
log[:legal_documents]= [legal_document_id] log[:legal_documents]= [legal_document_id]
log[:registrant] = [registrant_id] log[:registrant] = [registrant_id]
log[:dnskeys] = dnskeys_ids
log log
end end

View file

@ -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 .row
.col-md-8 .col-md-8
@ -11,55 +13,64 @@
.panel-body .panel-body
%dl.dl-horizontal %dl.dl-horizontal
%dt= t(:id) %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) %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) %dt= t(:email)
%dd= @version.reify.email %dd{class: changing_css_class(@version,"email")}
= contact.email
%dt= t(:phone) %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) %dt= t(:fax)
%dd= @version.reify.fax %dd{class: changing_css_class(@version,"fax")}
= contact.fax
%br %br
%dt= t(:created) %dt= t(:created)
%dd %dd{class: changing_css_class(@version,"created_at")}
= l(@version.reify.created_at, format: :short) = l(contact.created_at, format: :short)
%dt= t(:updated) %dt= t(:updated)
%dd %dd{class: changing_css_class(@version,"updated_at")}
= l(@version.reify.updated_at, format: :short) = l(contact.updated_at, format: :short)
%dt= t(:registrar) %dt= t(:registrar)
%dd %dd{class: changing_css_class(@version,"registrar_id")}
- if @version.reify.registrar.present? - if contact.registrar.present?
= link_to(@version.reify.registrar, admin_registrar_path(@version.reify.registrar)) = link_to(contact.registrar, admin_registrar_path(contact.registrar))
%dl.dl-horizontal %dl.dl-horizontal
- if @version.reify.org_name.present? - if contact.org_name.present?
%dt= t(:org_name) %dt= t(:org_name)
%dd= @version.reify.org_name %dd{class: changing_css_class(@version,"org_name")}= contact.org_name
%dt= t(:street) %dt= t(:street)
%dd= @version.reify.street.to_s.gsub("\n", '<br>').html_safe %dd{class: changing_css_class(@version,"street")}= contact.street.to_s.gsub("\n", '<br>').html_safe
%dt= t(:city) %dt= t(:city)
%dd= @version.reify.city %dd{class: changing_css_class(@version,"city")}= contact.city
%dt= t(:zip) %dt= t(:zip)
%dd= @version.reify.zip %dd{class: changing_css_class(@version,"zip")}= contact.zip
%dt= t(:state) %dt= t(:state)
%dd= @version.reify.state %dd{class: changing_css_class(@version,"state")}= contact.state
%dt= t(:country) %dt= t(:country)
%dd= @version.reify.country %dd{class: changing_css_class(@version,"country_code")}= contact.country
%span{:style => "padding-right:10px; float: right;"} %span{:style => "padding-right:10px; float: right;"}

View file

@ -1,11 +1,13 @@
= render 'shared/title', name: @version.reify.name = 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 - if @version
- children = HashWithIndifferentAccess.new(@version.children) - children = HashWithIndifferentAccess.new(@version.children)
- nameservers = Nameserver.where(id: children[:nameservers]) - nameservers = Nameserver.all_versions_for(children[:nameservers], @version.created_at)
- tech_contacts = Contact.where(id: children[:tech_contacts]) - tech_contacts = Contact.all_versions_for(children[:tech_contacts], @version.created_at)
- admin_contacts = Contact.where(id: children[:admin_contacts]) - admin_contacts = Contact.all_versions_for(children[:admin_contacts], @version.created_at)
- registrant = Contact.where(id: children[:registrant]) - registrant = Contact.all_versions_for(children[:registrant], @version.created_at)
- event = @version.event - event = @version.event
- creator = plain_username(@version.terminator) - creator = plain_username(@version.terminator)
@ -21,36 +23,47 @@
.panel-body .panel-body
%dl.dl-horizontal %dl.dl-horizontal
%dt= t(:name) %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) %dt= t(:statuses)
%dd %dd{class: changing_css_class(@version,"statuses")}
- if @version.reify.statuses.present? - if domain.statuses.present?
- @version.reify.statuses.each do |s| - domain.statuses.each do |s|
= s = s
%dt= t(:registrant) %dt= t(:registrant)
%dd %dd{class: changing_css_class(@version,"registrant_id")}
- registrant.each do |r| - registrant.each do |r|
= r[:name] - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
= r[:phone] = link_to link, target: "contact_#{r.id}" do
= r[:email] = r[:name]
= r[:code] = r[:phone]
%br = r[:email]
= r[:code]
%br
%dt= t(:admin_contacts) %dt= t(:admin_contacts)
%dd %dd
- admin_contacts.each do |r| - admin_contacts.each do |r|
= r[:name] - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
= r[:phone] = link_to link, target: "contact_#{r.id}" do
= r[:email] = r[:name]
= r[:code] = r[:phone]
%br = r[:email]
= r[:code]
%br
%dt= t(:tech_contacts) %dt= t(:tech_contacts)
%dd %dd
- tech_contacts.each do |r| - tech_contacts.each do |r|
= r[:name] - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
= r[:phone] = link_to link, target: "contact_#{r.id}" do
= r[:email] = r[:name]
= r[:code] = r[:phone]
%br = r[:email]
= r[:code]
%br
%dt= t(:nameservers) %dt= t(:nameservers)
%dd %dd
- nameservers.each do |ns| - nameservers.each do |ns|
@ -58,8 +71,12 @@
= ns[:ipv4] = ns[:ipv4]
= ns[:ipv6] = ns[:ipv6]
%br %br
%dt= t(:registrar) %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;"} %span{:style => "padding-right:10px; padding-top:40px; float: right; bottom: 10px;"}
- if @version.previous - if @version.previous
= link_to(t(:previous), = link_to(t(:previous),

View file

@ -5,20 +5,20 @@
- if domain.present? - if domain.present?
- if version # normal history - if version # normal history
- children = HashWithIndifferentAccess.new(version.children) - children = HashWithIndifferentAccess.new(version.children)
- nameservers = Nameserver.where(id: children[:nameservers]) - nameservers = Nameserver.all_versions_for(children[:nameservers], version.created_at)
- tech_contacts = Contact.where(id: children[:tech_contacts]) - tech_contacts = Contact.all_versions_for(children[:tech_contacts], version.created_at)
- admin_contacts = Contact.where(id: children[:admin_contacts]) - admin_contacts = Contact.all_versions_for(children[:admin_contacts], version.created_at)
- registrant = Contact.where(id: children[:registrant]) - registrant = Contact.all_versions_for(children[:registrant], version.created_at)
- event = version.event - event = version.event
- creator = plain_username(version.terminator) - creator = plain_username(version.terminator)
- else # pending history - else # pending history
- nameservers = domain.nameservers - nameservers = domain.nameservers
- tech_contacts = domain.tech_contacts - tech_contacts = domain.tech_contacts
- admin_contacts = domain.admin_contacts - admin_contacts = domain.admin_contacts
- registrant = [domain.registrant] - registrant = [domain.registrant]
- creator = pending_user.try(:username) - creator = pending_user.try(:username)
- event = 'pending' - event = 'pending'
%td %td
%p.nowrap %p.nowrap
@ -31,7 +31,7 @@
%br %br
= creator = creator
%td %td{class: changing_css_class(version,"statuses")}
%p %p
- if domain.statuses.present? - if domain.statuses.present?
- domain.statuses.each do |s| - domain.statuses.each do |s|
@ -46,7 +46,7 @@
%p %p
= link_to t(:pending_epp), '#', class: 'js-pending-toggle' = link_to t(:pending_epp), '#', class: 'js-pending-toggle'
%td %td{class: changing_css_class(version, "period", "period_unit", "valid_from", "valid_to")}
%p %p
= "#{domain.period}#{domain.period_unit}" = "#{domain.period}#{domain.period_unit}"
%br %br
@ -55,43 +55,52 @@
= "#{l(domain.valid_to, format: :date)}" = "#{l(domain.valid_to, format: :date)}"
%td %td
- registrant.each do |r| - Array(registrant).each do |r|
%p - link = r.version_loader ? admin_contact_version_path(r.version_loader.try(:id)) : admin_contact_path(r.id)
= r[:name] = link_to link, target: "contact_#{r.id}" do
= r[:phone] %p
= r[:email] = r[:name]
%p = r[:phone]
= r[:code] = r[:email]
%p
= r[:code]
%td %td
- admin_contacts.each do |ac| - Array(admin_contacts).each do |ac|
%p - link = ac.version_loader ? admin_contact_version_path(ac.version_loader.try(:id)) : admin_contact_path(ac.id)
= ac[:name] = link_to link, target: "contact_#{ac.id}" do
= ac[:phone] %p
= ac[:email] = ac[:name]
%p = ac[:phone]
= ac[:code] = ac[:email]
%p
= ac[:code]
%td %td
- tech_contacts.each do |tc| - Array(tech_contacts).each do |tc|
%p - link = tc.version_loader ? admin_contact_version_path(tc.version_loader.try(:id)) : admin_contact_path(tc.id)
= tc[:name] = link_to link, target: "contact_#{tc.id}" do
= tc[:phone] %p
= tc[:email] = tc[:name]
%p = tc[:phone]
= tc[:code] = tc[:email]
%p
= tc[:code]
%td %td
%p %p
- nameservers.each do |ns| - Array(nameservers).each do |ns|
= ns[:hostname] = ns[:hostname]
%br %br
= ns[:ipv4] = ns[:ipv4].presence
= ns[:ipv6] = ns[:ipv6].presence
%br
%td %td{class: changing_css_class(version,"registrar_id")}
%p - if domain.registrar
= domain.registrar.name %p
= link_to admin_registrar_path(domain.registrar), target: "registrar_#{domain.registrar.id}" do
= domain.registrar.name
- if domain.pending_json.present? - if domain.pending_json.present?
%tr.js-pending{ style: 'display: none;' } %tr.js-pending{ style: 'display: none;' }

View file

@ -5,7 +5,7 @@
.row .row
.col-md-12 .col-md-12
.table-responsive .table-responsive
%table.table-hover.table-bordered.table-condensed %table.table.table-bordered.table-condensed
%thead %thead
%tr %tr
%th{class: 'col-xs-1'}= t(:timestap) %th{class: 'col-xs-1'}= t(:timestap)