From a43eacaa2269de63876e056da0b76d85acad0562 Mon Sep 17 00:00:00 2001 From: Alex Kriuchykhin Date: Tue, 16 Jan 2024 13:07:11 +0100 Subject: [PATCH] Fix inclusion of relationships column in repository exports [SCI-9716] (#6954) --- .../javascripts/sitewide/repository_helper.js | 3 ++ app/jobs/repositories_export_job.rb | 6 ++- app/jobs/repository_zip_export_job.rb | 2 +- app/jobs/team_zip_export_job.rb | 6 ++- app/services/repository_zip_export.rb | 38 +++++++++---------- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/sitewide/repository_helper.js b/app/assets/javascripts/sitewide/repository_helper.js index 286ea0ae2..996685b25 100644 --- a/app/assets/javascripts/sitewide/repository_helper.js +++ b/app/assets/javascripts/sitewide/repository_helper.js @@ -59,6 +59,9 @@ function prepareRepositoryHeaderForExport(th) { case 'archived-on': val = -8; break; + case 'relationship': + val = -9; + break; default: val = th.attr('id'); } diff --git a/app/jobs/repositories_export_job.rb b/app/jobs/repositories_export_job.rb index 4f13d8be1..0a824170a 100644 --- a/app/jobs/repositories_export_job.rb +++ b/app/jobs/repositories_export_job.rb @@ -48,7 +48,9 @@ class RepositoriesExportJob < ApplicationJob csv_file = FileUtils.touch("#{path}/#{repository_name}.csv").first # Define headers and columns IDs - col_ids = [-3, -4, -5, -6, -7, -8] + repository.repository_columns.map(&:id) + col_ids = [-3, -4, -5, -6, -7, -8] + col_ids << -9 if Repository.repository_row_connections_enabled? + col_ids += repository.repository_columns.map(&:id) # Define callback function for file name assets = {} @@ -66,7 +68,7 @@ class RepositoriesExportJob < ApplicationJob # Generate CSV csv_data = RepositoryZipExport.to_csv(repository.repository_rows, col_ids, @user, repository, handle_name_func) - File.binwrite(csv_file, csv_data) + File.binwrite(csv_file, csv_data.encode('UTF-8', invalid: :replace, undef: :replace)) # Save all attachments (it doesn't work directly in callback function assets.each do |asset, asset_path| diff --git a/app/jobs/repository_zip_export_job.rb b/app/jobs/repository_zip_export_job.rb index a63c8bd4d..a3f30ca85 100644 --- a/app/jobs/repository_zip_export_job.rb +++ b/app/jobs/repository_zip_export_job.rb @@ -30,7 +30,7 @@ class RepositoryZipExportJob < ZipExportJob rows = ordered_row_ids.collect { |id| id_row_map[id.to_i] } end data = RepositoryZipExport.to_csv(rows, - params[:header_ids], + params[:header_ids].map(&:to_i), @user, repository, nil, diff --git a/app/jobs/team_zip_export_job.rb b/app/jobs/team_zip_export_job.rb index af9fa6ce0..bb3c02af4 100644 --- a/app/jobs/team_zip_export_job.rb +++ b/app/jobs/team_zip_export_job.rb @@ -251,7 +251,9 @@ class TeamZipExportJob < ZipExportJob csv_file_path = "#{path}/#{repo_name}.csv" # Define headers and columns IDs - col_ids = [-3, -4, -5, -6, 'relationship'] + repo.repository_columns.map(&:id) + col_ids = [-3, -4, -5, -6] + col_ids << -9 if Repository.repository_row_connections_enabled? + col_ids += repo.repository_columns.map(&:id) # Define callback function for file name assets = {} @@ -269,7 +271,7 @@ class TeamZipExportJob < ZipExportJob # Generate CSV csv_data = RepositoryZipExport.to_csv(repo.repository_rows, col_ids, @user, repo, handle_name_func) - File.binwrite(csv_file_path, csv_data) + File.binwrite(csv_file_path, csv_data.encode('UTF-8', invalid: :replace, undef: :replace)) # Save all attachments (it doesn't work directly in callback function assets.each do |asset, asset_path| diff --git a/app/services/repository_zip_export.rb b/app/services/repository_zip_export.rb index c1c28985d..e213b9454 100644 --- a/app/services/repository_zip_export.rb +++ b/app/services/repository_zip_export.rb @@ -9,21 +9,21 @@ module RepositoryZipExport add_consumption = in_module && !repository.is_a?(RepositorySnapshot) && repository.has_stock_management? column_ids.each do |c_id| case c_id - when '-1', '-2' + when -1, -2 next - when '-3' + when -3 csv_header << I18n.t('repositories.table.id') - when '-4' + when -4 csv_header << I18n.t('repositories.table.row_name') - when '-5' + when -5 csv_header << I18n.t('repositories.table.added_by') - when '-6' + when -6 csv_header << I18n.t('repositories.table.added_on') - when '-7' + when -7 csv_header << I18n.t('repositories.table.archived_by') - when '-8' + when -8 csv_header << I18n.t('repositories.table.archived_on') - when 'relationship' + when -9 csv_header << I18n.t('repositories.table.parents') csv_header << I18n.t('repositories.table.children') else @@ -32,29 +32,29 @@ module RepositoryZipExport end csv_header << I18n.t('repositories.table.row_consumption') if add_consumption - CSV.generate(force_quotes: true) do |csv| + CSV.generate do |csv| csv << csv_header rows.each do |row| csv_row = [] column_ids.each do |c_id| case c_id - when '-1', '-2' + when -1, -2 next - when '-3' + when -3 csv_row << (repository.is_a?(RepositorySnapshot) ? row.parent_id : row.id) - when '-4' + when -4 csv_row << row.name - when '-5' + when -5 csv_row << row.created_by.full_name - when '-6' + when -6 csv_row << I18n.l(row.created_at, format: :full) - when '-7' + when -7 csv_row << (row.archived? && row.archived_by.present? ? row.archived_by.full_name : '') - when '-8' + when -8 csv_row << (row.archived? && row.archived_on.present? ? I18n.l(row.archived_on, format: :full) : '') - when 'relationship' - csv_row << row.parent_repository_rows.map(&:code).join('; ') - csv_row << row.child_repository_rows.map(&:code).join('; ') + when -9 + csv_row << row.parent_repository_rows.map(&:code).join(' | ') + csv_row << row.child_repository_rows.map(&:code).join(' | ') else cell = row.repository_cells.find_by(repository_column_id: c_id)