From a9b942dac02247de27ff82152753f4ca0b8ed5a3 Mon Sep 17 00:00:00 2001 From: dinsmol Date: Mon, 24 Jan 2022 23:29:18 +0300 Subject: [PATCH] Fix domain history csv --- .../admin/domain_versions_controller.rb | 12 ++++++ app/helpers/object_versions_helper.rb | 38 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/app/controllers/admin/domain_versions_controller.rb b/app/controllers/admin/domain_versions_controller.rb index c6bba6d51..8cc69d619 100644 --- a/app/controllers/admin/domain_versions_controller.rb +++ b/app/controllers/admin/domain_versions_controller.rb @@ -88,5 +88,17 @@ module Admin params_copy end + + def render_by_format(page, filename) + respond_to do |format| + format.html { render page } + format.csv do + raw_csv = csv_generate + send_data raw_csv, + filename: "#{filename}_#{Time.zone.now.to_formatted_s(:number)}.csv", + type: "#{Mime[:csv]}; charset=utf-8" + end + end + end end end diff --git a/app/helpers/object_versions_helper.rb b/app/helpers/object_versions_helper.rb index dae357cf6..d4baadd45 100644 --- a/app/helpers/object_versions_helper.rb +++ b/app/helpers/object_versions_helper.rb @@ -1,4 +1,6 @@ module ObjectVersionsHelper + CSV_HEADER = ['Name', 'Registrant', 'Registrar', 'Action', 'Created at'].freeze + def attach_existing_fields(version, new_object) version.object_changes.to_h.each do |key, value| method_name = "#{key}=".to_sym @@ -11,9 +13,45 @@ module ObjectVersionsHelper version.object.to_h.select { |key, _value| field_names.include?(key) } end + def csv_generate + CSV.generate do |csv| + csv << CSV_HEADER + @versions.each do |version| + attributes = only_present_fields(version, Domain) + domain = Domain.new(attributes) + attach_existing_fields(version, domain) unless version.event == 'destroy' + + csv << create_row(domain, version) + end + end + end + private def event_value(version, val) version.event == 'destroy' ? val.first : val.last end + + def registrant_name(domain, version) + if domain.registrant + domain.registrant.name + else + contact = Contact.all_versions_for([domain.registrant_id], version.created_at).first + if contact.nil? && ver = Version::ContactVersion.where(item_id: domain.registrant_id).last + merged_obj = ver.object_changes.to_h.each_with_object({}) {|(k,v), o| o[k] = v.last } + result = ver.object.to_h.merge(merged_obj)&.slice(*Contact&.column_names) + contact = Contact.new(result) + end + contact.try(:name) || 'Deleted' + end + end + + def create_row(domain, version) + name = domain.name + registrant = registrant_name(domain, version) + registrar = domain.registrar + event = version.event + created_at = version.created_at.to_formatted_s(:db) + [name, registrant, registrar, event, created_at] + end end