From daafa756aa292dbdcf979f613ae3c0bd101dbc0d Mon Sep 17 00:00:00 2001 From: Thiago Youssef Date: Thu, 31 Mar 2022 16:33:47 +0300 Subject: [PATCH 1/3] Refactor account activity csv generation --- app/models/account_activity.rb | 19 +++++++------------ app/services/csv_generator.rb | 8 +++----- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/app/models/account_activity.rb b/app/models/account_activity.rb index 05873a2a6..38fa70358 100644 --- a/app/models/account_activity.rb +++ b/app/models/account_activity.rb @@ -11,6 +11,7 @@ class AccountActivity < ApplicationRecord UPDATE_CREDIT = 'update_credit'.freeze after_create :update_balance + def update_balance account.balance += sum account.save @@ -19,23 +20,17 @@ class AccountActivity < ApplicationRecord save end + def as_csv_row + [account.registrar.try(:code), description, I18n.t(activity_type), I18n.l(created_at), sum] + end + class << self def types_for_select [CREATE, RENEW, ADD_CREDIT, UPDATE_CREDIT].map { |x| [I18n.t(x), x] } end - def to_csv - attributes = %w(description activity_type created_at sum) - - CSV.generate(headers: true) do |csv| - csv << %w(registrar description activity_type receipt_date sum) - - all.each do |x| - attrs = [x.account.registrar.try(:code)] - attrs += attributes.map { |attr| x.send(attr) } - csv << attrs - end - end + def csv_header + ['Registrar', 'Description', 'Activity Type', 'Receipt Date', 'Sum'] end end end diff --git a/app/services/csv_generator.rb b/app/services/csv_generator.rb index a2c1305a3..fd47fac45 100644 --- a/app/services/csv_generator.rb +++ b/app/services/csv_generator.rb @@ -1,7 +1,7 @@ class CsvGenerator def self.generate_csv(objects) class_name = objects.first.class - return objects.to_csv unless custom_csv(class_name) + return objects.to_csv unless custom_csv?(class_name) CSV.generate do |csv| csv << class_name.csv_header @@ -9,9 +9,7 @@ class CsvGenerator end end - private - - def self.custom_csv(class_name) - [Version::DomainVersion, Version::ContactVersion, Domain, Contact, Invoice, Account].include?(class_name) + def self.custom_csv?(class_name) + [Version::DomainVersion, Version::ContactVersion, Domain, Contact, Invoice, Account, AccountActivity].include?(class_name) end end From e50501f13f0779253ea383d3d6702fd551a5a110 Mon Sep 17 00:00:00 2001 From: Thiago Youssef Date: Fri, 1 Apr 2022 10:59:04 +0300 Subject: [PATCH 2/3] Migrate `ToCsv` module to `CsvGenerator` service --- .../admin/account_activities_controller.rb | 2 +- .../account_activities_controller.rb | 2 +- .../registrar/contacts_controller.rb | 2 +- app/lib/to_csv.rb | 10 ----- app/models/account.rb | 1 - app/models/api_log/epp_log.rb | 4 +- app/models/api_log/repp_log.rb | 4 +- app/models/blocked_domain.rb | 1 - app/models/contact.rb | 9 ----- app/models/dispute.rb | 1 - app/models/domain.rb | 15 ------- app/models/invoice.rb | 1 - app/models/reserved_domain.rb | 1 - app/models/version/contact_version.rb | 1 - app/models/version/domain_version.rb | 1 - app/services/csv_generator.rb | 39 ++++++++++++++----- 16 files changed, 34 insertions(+), 60 deletions(-) delete mode 100644 app/lib/to_csv.rb diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index ebd44e28e..0d22a4298 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -35,7 +35,7 @@ module Admin respond_to do |format| format.html format.csv do - send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" + send_data CsvGenerator.generate_csv(@q.result), filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" end end diff --git a/app/controllers/registrar/account_activities_controller.rb b/app/controllers/registrar/account_activities_controller.rb index 55e53f8fc..7b5281275 100644 --- a/app/controllers/registrar/account_activities_controller.rb +++ b/app/controllers/registrar/account_activities_controller.rb @@ -20,7 +20,7 @@ class Registrar respond_to do |format| format.html { @account_activities = @q.result.page(params[:page]) } format.csv do - send_data @q.result.to_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" + send_data CsvGenerator.generate_csv(@q.result), filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" end end diff --git a/app/controllers/registrar/contacts_controller.rb b/app/controllers/registrar/contacts_controller.rb index ec4ce5129..812e278e5 100644 --- a/app/controllers/registrar/contacts_controller.rb +++ b/app/controllers/registrar/contacts_controller.rb @@ -40,7 +40,7 @@ class Registrar @contacts = @contacts.per(contacts_per_page) if contacts_per_page.positive? end format.csv do - raw_csv = contacts.to_csv + raw_csv = CsvGenerator.generate_csv(contacts) send_data raw_csv, filename: 'contacts.csv', type: "#{Mime[:csv]}; charset=utf-8" end format.pdf do diff --git a/app/lib/to_csv.rb b/app/lib/to_csv.rb deleted file mode 100644 index 32c288978..000000000 --- a/app/lib/to_csv.rb +++ /dev/null @@ -1,10 +0,0 @@ -module ToCsv - def to_csv - CSV.generate do |csv| - csv << column_names - all.find_each do |item| - csv << item.attributes.values_at(*column_names) - end - end - end -end diff --git a/app/models/account.rb b/app/models/account.rb index 334d292f2..7639c61dd 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -1,5 +1,4 @@ class Account < ApplicationRecord - extend ToCsv include Versions belongs_to :registrar, required: true diff --git a/app/models/api_log/epp_log.rb b/app/models/api_log/epp_log.rb index feed1ecad..c89569be5 100644 --- a/app/models/api_log/epp_log.rb +++ b/app/models/api_log/epp_log.rb @@ -1,5 +1,3 @@ module ApiLog - class EppLog < Db - extend ToCsv - end + class EppLog < Db; end end diff --git a/app/models/api_log/repp_log.rb b/app/models/api_log/repp_log.rb index 62dcee238..540a9043a 100644 --- a/app/models/api_log/repp_log.rb +++ b/app/models/api_log/repp_log.rb @@ -1,5 +1,3 @@ module ApiLog - class ReppLog < Db - extend ToCsv - end + class ReppLog < Db; end end diff --git a/app/models/blocked_domain.rb b/app/models/blocked_domain.rb index fb50a8b52..f82faa771 100644 --- a/app/models/blocked_domain.rb +++ b/app/models/blocked_domain.rb @@ -1,6 +1,5 @@ class BlockedDomain < ApplicationRecord include Versions - extend ToCsv before_save :generate_data after_destroy :remove_data diff --git a/app/models/contact.rb b/app/models/contact.rb index f44b28f35..dab2dd6d9 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -188,15 +188,6 @@ class Contact < ApplicationRecord ] end - def to_csv - CSV.generate do |csv| - csv << column_names - all.each do |contact| - csv << contact.attributes.values_at(*column_names) - end - end - end - def pdf(html) kit = PDFKit.new(html) kit.to_pdf diff --git a/app/models/dispute.rb b/app/models/dispute.rb index cbf93566a..f5a948355 100644 --- a/app/models/dispute.rb +++ b/app/models/dispute.rb @@ -1,5 +1,4 @@ class Dispute < ApplicationRecord - extend ToCsv include WhoisStatusPopulate validates :domain_name, :password, :starts_at, :expires_at, presence: true before_validation :fill_empty_passwords, :set_expiry_date diff --git a/app/models/domain.rb b/app/models/domain.rb index 3728b0de1..53e2ddf9b 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -289,21 +289,6 @@ class Domain < ApplicationRecord ) end - def to_csv - CSV.generate do |csv| - headers = column_names.dup - swap_elements(headers, [[0, 1], [1, 5]]) - headers[0] = 'Domain' - headers[1] = headers[1].humanize - csv << headers - all.find_each do |item| - row = item.attributes.values_at(*column_names) - swap_elements(row, [[0, 1], [1, 5]]) - csv << row - end - end - end - private def registrant_user_domains_by_registrant(registrant_user) diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 80dbc6417..c31ae15c4 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -3,7 +3,6 @@ class Invoice < ApplicationRecord include Invoice::Cancellable include Invoice::Payable include Invoice::BookKeeping - extend ToCsv belongs_to :buyer, class_name: 'Registrar' has_one :account_activity diff --git a/app/models/reserved_domain.rb b/app/models/reserved_domain.rb index 5d585e5d9..10d5edd11 100644 --- a/app/models/reserved_domain.rb +++ b/app/models/reserved_domain.rb @@ -1,5 +1,4 @@ class ReservedDomain < ApplicationRecord - extend ToCsv include Versions # version/reserved_domain_version.rb include WhoisStatusPopulate before_save :fill_empty_passwords diff --git a/app/models/version/contact_version.rb b/app/models/version/contact_version.rb index 669c422fe..d3ff1130c 100644 --- a/app/models/version/contact_version.rb +++ b/app/models/version/contact_version.rb @@ -1,5 +1,4 @@ class Version::ContactVersion < PaperTrail::Version - extend ToCsv include VersionSession self.table_name = :log_contacts diff --git a/app/models/version/domain_version.rb b/app/models/version/domain_version.rb index bef5208f3..e84fc9da2 100644 --- a/app/models/version/domain_version.rb +++ b/app/models/version/domain_version.rb @@ -1,5 +1,4 @@ class Version::DomainVersion < PaperTrail::Version - extend ToCsv include VersionSession self.table_name = :log_domains diff --git a/app/services/csv_generator.rb b/app/services/csv_generator.rb index fd47fac45..16901dcff 100644 --- a/app/services/csv_generator.rb +++ b/app/services/csv_generator.rb @@ -1,15 +1,34 @@ class CsvGenerator - def self.generate_csv(objects) - class_name = objects.first.class - return objects.to_csv unless custom_csv?(class_name) + class << self + def generate_csv(objects) + @class_name = objects.first.class + return default_generation(objects) unless custom_csv? - CSV.generate do |csv| - csv << class_name.csv_header - objects.each { |object| csv << object.as_csv_row } + CSV.generate do |csv| + csv << @class_name.csv_header + objects.each { |object| csv << object.as_csv_row } + end + end + + private + + def default_generation(objects) + CSV.generate do |csv| + csv << @class_name.column_names + objects.each { |object| csv << object.attributes.values_at(*@class_name.column_names) } + end + end + + def custom_csv? + [ + Version::DomainVersion, + Version::ContactVersion, + Domain, + Contact, + Invoice, + Account, + AccountActivity + ].include?(@class_name) end end - - def self.custom_csv?(class_name) - [Version::DomainVersion, Version::ContactVersion, Domain, Contact, Invoice, Account, AccountActivity].include?(class_name) - end end From aef30eeb4d76612c41be627c2fc0a6da8e65f40e Mon Sep 17 00:00:00 2001 From: Thiago Youssef Date: Fri, 1 Apr 2022 11:50:35 +0300 Subject: [PATCH 3/3] Improve default csv generation --- .../admin/account_activities_controller.rb | 3 ++- .../account_activities_controller.rb | 3 ++- app/models/domain.rb | 7 ++++-- app/models/invoice.rb | 2 +- app/services/csv_generator.rb | 23 ++++++++----------- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/controllers/admin/account_activities_controller.rb b/app/controllers/admin/account_activities_controller.rb index 0d22a4298..452acaee1 100644 --- a/app/controllers/admin/account_activities_controller.rb +++ b/app/controllers/admin/account_activities_controller.rb @@ -35,7 +35,8 @@ module Admin respond_to do |format| format.html format.csv do - send_data CsvGenerator.generate_csv(@q.result), filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" + raw_csv = CsvGenerator.generate_csv(@q.result) + send_data raw_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" end end diff --git a/app/controllers/registrar/account_activities_controller.rb b/app/controllers/registrar/account_activities_controller.rb index 7b5281275..0ad8c3d5a 100644 --- a/app/controllers/registrar/account_activities_controller.rb +++ b/app/controllers/registrar/account_activities_controller.rb @@ -20,7 +20,8 @@ class Registrar respond_to do |format| format.html { @account_activities = @q.result.page(params[:page]) } format.csv do - send_data CsvGenerator.generate_csv(@q.result), filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" + raw_csv = CsvGenerator.generate_csv(@q.result) + send_data raw_csv, filename: "account_activities_#{Time.zone.now.to_formatted_s(:number)}.csv" end end diff --git a/app/models/domain.rb b/app/models/domain.rb index 53e2ddf9b..2c6069cd1 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -748,7 +748,7 @@ class Domain < ApplicationRecord statuses, contacts.pluck(:code), force_delete_date, - force_delete_data + force_delete_data, ] end @@ -764,7 +764,10 @@ class Domain < ApplicationRecord end def self.csv_header - ['Domain', 'Registrant', 'Valid to', 'Registrar', 'Created at', 'Statuses', 'Contacts code', 'Force delete date', 'Force delete data'] + [ + 'Domain', 'Registrant', 'Valid to', 'Registrar', 'Created at', + 'Statuses', 'Contacts code', 'Force delete date', 'Force delete data', + ] end def self.pdf(html) diff --git a/app/models/invoice.rb b/app/models/invoice.rb index c31ae15c4..6ba3a158d 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -125,7 +125,7 @@ class Invoice < ApplicationRecord issue_date, total, currency, - seller_name + seller_name, ] end diff --git a/app/services/csv_generator.rb b/app/services/csv_generator.rb index 16901dcff..d92beeddc 100644 --- a/app/services/csv_generator.rb +++ b/app/services/csv_generator.rb @@ -1,11 +1,11 @@ class CsvGenerator class << self def generate_csv(objects) - @class_name = objects.first.class - return default_generation(objects) unless custom_csv? + class_name = objects.first.class + return default_generation(objects) unless custom_csv?(class_name) CSV.generate do |csv| - csv << @class_name.csv_header + csv << class_name.csv_header objects.each { |object| csv << object.as_csv_row } end end @@ -14,21 +14,16 @@ class CsvGenerator def default_generation(objects) CSV.generate do |csv| - csv << @class_name.column_names - objects.each { |object| csv << object.attributes.values_at(*@class_name.column_names) } + csv << objects.column_names + objects.all.find_each { |object| csv << object.attributes.values_at(*objects.column_names) } end end - def custom_csv? + def custom_csv?(class_name) [ - Version::DomainVersion, - Version::ContactVersion, - Domain, - Contact, - Invoice, - Account, - AccountActivity - ].include?(@class_name) + Version::DomainVersion, Version::ContactVersion, Domain, + Contact, Invoice, Account, AccountActivity + ].include?(class_name) end end end