From a41505e3193edee25f3005908c6dafb125696728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andres=20Keskk=C3=BCla?= Date: Mon, 29 Sep 2014 13:24:54 +0300 Subject: [PATCH] Domain versioning --- .../admin/contact_versions_controller.rb | 2 +- .../admin/domain_versions_controller.rb | 17 ++++++ app/models/domain.rb | 3 + app/models/domain_status.rb | 3 + app/models/domain_status_version.rb | 4 ++ app/models/domain_version.rb | 4 ++ app/models/nameserver.rb | 3 + app/models/nameserver_version.rb | 4 ++ .../admin/contact_versions/_history.haml | 23 ++++++++ app/views/admin/contact_versions/show.haml | 29 +--------- app/views/admin/domain_versions/_history.haml | 56 +++++++++++++++++++ app/views/admin/domain_versions/index.haml | 39 +++++++++++++ app/views/admin/domain_versions/show.haml | 32 +++++++++++ app/views/layouts/application.haml | 2 +- config/routes.rb | 3 +- .../20140926121409_domain_related_archives.rb | 18 ++++++ 16 files changed, 212 insertions(+), 30 deletions(-) create mode 100644 app/controllers/admin/domain_versions_controller.rb create mode 100644 app/models/domain_status_version.rb create mode 100644 app/models/domain_version.rb create mode 100644 app/models/nameserver_version.rb create mode 100644 app/views/admin/contact_versions/_history.haml create mode 100644 app/views/admin/domain_versions/_history.haml create mode 100644 app/views/admin/domain_versions/index.haml create mode 100644 app/views/admin/domain_versions/show.haml create mode 100644 db/migrate/20140926121409_domain_related_archives.rb diff --git a/app/controllers/admin/contact_versions_controller.rb b/app/controllers/admin/contact_versions_controller.rb index 4103e6abc..4748cff3a 100644 --- a/app/controllers/admin/contact_versions_controller.rb +++ b/app/controllers/admin/contact_versions_controller.rb @@ -1,5 +1,5 @@ class Admin::ContactVersionsController < AdminController - before_action :set_contact + before_action :set_contact, only: [:show] def index @q = Contact.search(params[:q]) diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb new file mode 100644 index 000000000..784b2553a --- /dev/null +++ b/app/controllers/admin/domain_versions_controller.rb @@ -0,0 +1,17 @@ +class Admin::DomainVersionsController < AdminController + before_action :set_domain, only: [:show] + + def index + @q = Domain.search(params[:q]) + @domains = @q.result.page(params[:page]) + end + + def show + @versions = @domain.versions + end + + private + def set_domain + @domain = Domain.find(params[:id]) + end +end diff --git a/app/models/domain.rb b/app/models/domain.rb index 4e0193e66..18f47e2ac 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -56,6 +56,9 @@ class Domain < ActiveRecord::Base attr_accessor :owner_contact_typeahead + # archiving + has_paper_trail class_name: 'DomainVersion' + def name=(value) value.strip! write_attribute(:name, SimpleIDN.to_unicode(value)) diff --git a/app/models/domain_status.rb b/app/models/domain_status.rb index 96b34e75a..56665bf8e 100644 --- a/app/models/domain_status.rb +++ b/app/models/domain_status.rb @@ -33,6 +33,9 @@ class DomainStatus < ActiveRecord::Base CLIENT_STATUSES = [CLIENT_DELETE_PROHIBITED, CLIENT_HOLD, CLIENT_RENEW_PROHIBITED, CLIENT_TRANSFER_PROHIBITED, CLIENT_UPDATE_PROHIBITED] SERVER_STATUSES = [SERVER_DELETE_PROHIBITED, SERVER_HOLD, SERVER_RENEW_PROHIBITED, SERVER_TRANSFER_PROHIBITED, SERVER_UPDATE_PROHIBITED, SERVER_MANUAL_INZONE, SERVER_REGISTRANT_CHANGE_PROHIBITED, SERVER_ADMIN_CHANGE_PROHIBITED, SERVER_TECH_CHANGE_PROHIBITED] + # archiving + has_paper_trail class_name: 'DomainStatusVersion' + def epp_code_map { '2302' => [ # Object exists diff --git a/app/models/domain_status_version.rb b/app/models/domain_status_version.rb new file mode 100644 index 000000000..62a2d9ac3 --- /dev/null +++ b/app/models/domain_status_version.rb @@ -0,0 +1,4 @@ +class DomainStatusVersion < PaperTrail::Version + self.table_name = :domain_status_versions + self.sequence_name = :domain_status_version_id_seq +end diff --git a/app/models/domain_version.rb b/app/models/domain_version.rb new file mode 100644 index 000000000..0f8deff90 --- /dev/null +++ b/app/models/domain_version.rb @@ -0,0 +1,4 @@ +class DomainVersion < PaperTrail::Version + self.table_name = :domain_versions + self.sequence_name = :domain_version_id_seq +end diff --git a/app/models/nameserver.rb b/app/models/nameserver.rb index 625271485..6ced6cbd2 100644 --- a/app/models/nameserver.rb +++ b/app/models/nameserver.rb @@ -8,6 +8,9 @@ class Nameserver < ActiveRecord::Base validates :ipv4, format: { with: /\A(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\z/, allow_blank: true } validates :ipv6, format: { with: /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/, allow_blank: true } + # archiving + has_paper_trail class_name: 'NameserverVersion' + def epp_code_map { '2302' => [ diff --git a/app/models/nameserver_version.rb b/app/models/nameserver_version.rb new file mode 100644 index 000000000..6ce67ed79 --- /dev/null +++ b/app/models/nameserver_version.rb @@ -0,0 +1,4 @@ +class NameserverVersion < PaperTrail::Version + self.table_name = :nameserver_versions + self.sequence_name = :nameserver_version_id_seq +end diff --git a/app/views/admin/contact_versions/_history.haml b/app/views/admin/contact_versions/_history.haml new file mode 100644 index 000000000..362206f03 --- /dev/null +++ b/app/views/admin/contact_versions/_history.haml @@ -0,0 +1,23 @@ +.row + .col-md-6 + %dl.dl-horizontal + %dt= t('shared.name') + %dd= contact.name + %dt= t('shared.ident') + %dd= contact.ident + %dt= t('shared.phone') + %dd= contact.phone + %dt= t('shared.email') + %dd= contact.email + %dt= t('shared.fax') + %dd= contact.fax + %dt= t('shared.org_name') + %dd= contact.org_name + .col-md-6 + %dl.dl-horizontal + - if contact.address + %dt= t('shared.city') + %dd= contact.address.city + %dt= t('shared.street') + %dd= contact.address.street + diff --git a/app/views/admin/contact_versions/show.haml b/app/views/admin/contact_versions/show.haml index 7cbd5e271..47d9264dd 100644 --- a/app/views/admin/contact_versions/show.haml +++ b/app/views/admin/contact_versions/show.haml @@ -19,9 +19,6 @@ %th created_at - - - %tbody - @versions.each_with_index do |version, index| - contact = version.reify(has_one: true) @@ -32,31 +29,9 @@ %td=version.created_at #contact.email if contact %tr - %td{colspan: "3"} + %td .collapse{ id: "accordion-#{index}" } - .row - .col-md-6 - %dl.dl-horizontal - %dt= t('shared.name') - %dd= contact.name - %dt= t('shared.ident') - %dd= contact.ident - %dt= t('shared.phone') - %dd= contact.phone - %dt= t('shared.email') - %dd= contact.email - %dt= t('shared.fax') - %dd= contact.fax - %dt= t('shared.org_name') - %dd= contact.org_name - .col-md-6 - %dl.dl-horizontal - - if contact.address - %dt= t('shared.city') - %dd= contact.address.city - %dt= t('shared.street') - %dd= contact.address.street - + = render 'admin/contact_versions/history', contact: contact - else %tr %td=version.whodunnit #contact.name if contact diff --git a/app/views/admin/domain_versions/_history.haml b/app/views/admin/domain_versions/_history.haml new file mode 100644 index 000000000..96bbe252b --- /dev/null +++ b/app/views/admin/domain_versions/_history.haml @@ -0,0 +1,56 @@ +%tr.clickable{"data-target" => "#accordion-#{index}", "data-toggle" => "collapse"} + %td=version.whodunnit #contact.name if contact + %td=version.event #contact.ident if contact + %td=version.created_at #contact.email if contact + +%tr + %td{colspan: "3"} + .collapse{ id: "accordion-#{index}" } + .row + .col-md-6 + %dl.dl-horizontal + %dt= t('shared.name') + %dd= domain.name + %dt= t('shared.status') + %dd= domain.status + %dt= t('shared.valid_from') + %dd= domain.valid_from + %dt= t('shared.valid_to') + %dd= domain.valid_to + %dt= t('shared.period') + %dd= domain.period + %dt= t('shared.period_unit') + %dd= domain.period_unit + %dt= t('shared.status') + %dd= domain.status + .col-md-6 + %dl.dl-horizontal + - if domain.nameservers + - domain.nameservers.each do |ns| + %dt= t('shared.hostname') + %dd= ns.hostname + %dt= t('shared.ipv4') + %dd= ns.ipv4 + - if domain.domain_statuses + - domain.domain_statuses.each do |ds| + %dt= t('shared.value') + %dd= ds.value + %dt= t('shared.description') + %dd= ds.description + + .row + .col-md-12 + - if domain.owner_contact + %h2= t('shared.contacts') + = render 'admin/contact_versions/history', contact: domain.owner_contact + + .row + .col-md-12 + - if domain.domain_contacts + .row + - if domain.tech_contacts + - domain.tech_contacts.each do |contact| + = render 'admin/contact_versions/history', contact: contact + - if domain.admin_contacts + - domain.admin_contacts.each do |contact| + = render 'admin/contact_versions/history', contact: contact diff --git a/app/views/admin/domain_versions/index.haml b/app/views/admin/domain_versions/index.haml new file mode 100644 index 000000000..2efb0ad78 --- /dev/null +++ b/app/views/admin/domain_versions/index.haml @@ -0,0 +1,39 @@ +.row + .col-sm-12 + %h2.text-center-xs= t('shared.domains') +%hr +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead + %tr + %th{class: 'col-xs-2'} + = sort_link(@q, 'name') + %th{class: 'col-xs-2'} + = sort_link(@q, 'registrar_name', t('shared.registrar')) + %th{class: 'col-xs-2'} + = sort_link(@q, 'owner_contact_name', t('shared.owner')) + %th{class: 'col-xs-1'} + whodunnit + %th{class: 'col-xs1'} + event + %th{class: 'col-xs1'} + created_at + %th{class: 'col-xs1'} + = t('shared.action') + + %tbody + - @domains.each do |domain| + %tr + %td= domain.name + %td= domain.registrar.name if domain.registrar + %td= domain.owner_contact.name if domain.owner_contact + %td= domain.versions.last.whodunnit if domain.versions.last + %td= domain.versions.last.event if domain.versions.last + %td= domain.versions.last.created_at if domain.versions.last + %td= link_to(t('shared.history'), admin_domain_version_path(domain), class: 'btn btn-primary btn-xs') + +.row + .col-md-12 + = paginate @domains diff --git a/app/views/admin/domain_versions/show.haml b/app/views/admin/domain_versions/show.haml new file mode 100644 index 000000000..8f28c5dba --- /dev/null +++ b/app/views/admin/domain_versions/show.haml @@ -0,0 +1,32 @@ +.row + .col-sm-6 + %h2.text-center-xs + = "#{t('shared.contact_details')}" + .col-sm-6 + %h2.text-right.text-center-xs + +%hr +.row + .col-md-12 + .table-responsive + %table.table.table-hover.table-bordered.table-condensed + %thead + %tr + %th + whodunnit + %th + event + %th + created_at + + %tbody + - @versions.each_with_index do |version, index| + - domain = version.reify(has_multiple: true) + - if domain + = render 'admin/domain_versions/history', version: version, index: index, domain: domain + - else + %tr + %td=version.whodunnit #contact.name if contact + %td=version.event #contact.ident if contact + %td=version.created_at #contact.email if contact + diff --git a/app/views/layouts/application.haml b/app/views/layouts/application.haml index 4ff437c55..e78f35cee 100644 --- a/app/views/layouts/application.haml +++ b/app/views/layouts/application.haml @@ -51,7 +51,7 @@ %ul.dropdown-menu{role: "menu"} %li.dropdown-header= t('shared.domain') %li - = link_to t('shared.domains'), '#' + = link_to t('shared.domains'), admin_domain_versions_path %li.dropdown-header= t('shared.contact') %li = link_to t('shared.contacts'), admin_contact_versions_path diff --git a/config/routes.rb b/config/routes.rb index 7ed278e19..ddaf9dc5f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -24,7 +24,8 @@ Rails.application.routes.draw do resources :users resources :epp_users resources :contact_versions - resources :address_versions + #resources :address_versions + resources :domain_versions root 'domains#index' diff --git a/db/migrate/20140926121409_domain_related_archives.rb b/db/migrate/20140926121409_domain_related_archives.rb new file mode 100644 index 000000000..27fa7466a --- /dev/null +++ b/db/migrate/20140926121409_domain_related_archives.rb @@ -0,0 +1,18 @@ +class DomainRelatedArchives < ActiveRecord::Migration + def change + tables = [:domain_versions, :nameserver_versions, :domain_status_versions ] + tables.each do |table| + create_table table do |t| + t.string :item_type, :null => false + t.integer :item_id, :null => false + t.string :event, :null => false + t.string :whodunnit + t.text :object + t.datetime :created_at + end + add_index table, [:item_type, :item_id] + end + + + end +end