From f5f507ad3c5f7e6577bdee71844013d52f3e6d3f Mon Sep 17 00:00:00 2001 From: fherreazcue Date: Fri, 6 Oct 2023 10:53:14 +0100 Subject: [PATCH 1/6] Projects not delegated to originating df, instead copied during extraction --- app/models/sample.rb | 8 -------- lib/seek/samples/extractor.rb | 5 +++++ test/unit/jobs/sample_data_persist_job_test.rb | 5 ++++- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/models/sample.rb b/app/models/sample.rb index cb965a3a41..38c8bb6dd6 100644 --- a/app/models/sample.rb +++ b/app/models/sample.rb @@ -93,14 +93,6 @@ def extracted? !!originating_data_file end - def projects - extracted? ? originating_data_file.projects : super - end - - def project_ids - extracted? ? originating_data_file.project_ids : super - end - def creators extracted? ? originating_data_file.creators : super end diff --git a/lib/seek/samples/extractor.rb b/lib/seek/samples/extractor.rb index 7c4835d8df..e709ac7799 100644 --- a/lib/seek/samples/extractor.rb +++ b/lib/seek/samples/extractor.rb @@ -30,6 +30,7 @@ def persist last_id = Sample.last.try(:id) || 0 sample_type = samples.first.sample_type + project_ids = samples.first.project_ids disable_authorization_checks { Sample.import(samples, validate: false, batch_size: 2000) } SampleTypeUpdateJob.new(sample_type, false).queue_job @@ -38,6 +39,10 @@ def persist samples = Sample.where(sample_type: sample_type, title: samples.collect(&:title), contributor: contributor).where( 'id > ?', last_id ) + samples.each do |sample| + sample.project_ids = project_ids + disable_authorization_checks { sample.save } + end ReindexingQueue.enqueue(samples) AuthLookupUpdateQueue.enqueue(samples) end diff --git a/test/unit/jobs/sample_data_persist_job_test.rb b/test/unit/jobs/sample_data_persist_job_test.rb index d22ede3254..c75730fa37 100644 --- a/test/unit/jobs/sample_data_persist_job_test.rb +++ b/test/unit/jobs/sample_data_persist_job_test.rb @@ -6,13 +6,15 @@ def setup @person = FactoryBot.create(:project_administrator) User.current_user = @person.user + @project_id = @person.projects.first.id + @data_file = FactoryBot.create :data_file, content_blob: FactoryBot.create(:sample_type_populated_template_content_blob), policy: FactoryBot.create(:private_policy), contributor: @person refute @data_file.sample_template? assert_empty @data_file.possible_sample_types @sample_type = SampleType.new title: 'from template', uploaded_template: true, - project_ids: [@person.projects.first.id], contributor: @person + project_ids: [@project_id], contributor: @person @sample_type.content_blob = FactoryBot.create(:sample_type_template_content_blob) @sample_type.build_attributes_from_template # this is to force the full name to be 2 words, so that one row fails @@ -47,6 +49,7 @@ def setup assert_equal 3, @data_file.extracted_samples.count assert_equal @sample_type, @data_file.extracted_samples.first.sample_type assert_equal @person, @data_file.extracted_samples.first.contributor + assert_equal [@project_id], @data_file.extracted_samples.first.project_ids end test 'persists samples and associate with assay' do From 7588d1ef248a37f66faa69bebdb9a3b96b1920f2 Mon Sep 17 00:00:00 2001 From: fherreazcue Date: Fri, 6 Oct 2023 12:11:51 +0100 Subject: [PATCH 2/6] Update test - sample project are no longer expected to mirror source df --- test/unit/sample_test.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/sample_test.rb b/test/unit/sample_test.rb index 310bc1bcb3..3bd94595d3 100644 --- a/test/unit/sample_test.rb +++ b/test/unit/sample_test.rb @@ -746,7 +746,7 @@ class SampleTest < ActiveSupport::TestCase refute sample2.can_view?(nil) end - test 'extracted samples inherit projects from data file' do + test 'extracted samples copy projects from data file' do person = FactoryBot.create(:person) create_sample_attribute_type data_file = FactoryBot.create :data_file, content_blob: FactoryBot.create(:sample_type_populated_template_content_blob), @@ -769,9 +769,9 @@ class SampleTest < ActiveSupport::TestCase data_file.save! end - assert_equal new_projects.sort, sample.projects.sort - assert_equal sample.projects.sort, data_file.projects.sort - assert_equal sample.project_ids.sort, data_file.project_ids.sort + assert_not_equal new_projects.sort, sample.projects.sort + assert_not_equal sample.projects.sort, data_file.projects.sort + assert_not_equal sample.project_ids.sort, data_file.project_ids.sort end test 'extracted samples inherit creators from data file' do From 59d00d9886be76267b33cf0fb6f9f4529e061d27 Mon Sep 17 00:00:00 2001 From: fherreazcue Date: Fri, 6 Oct 2023 14:41:07 +0100 Subject: [PATCH 3/6] Delete unnecessary save --- lib/seek/samples/extractor.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/seek/samples/extractor.rb b/lib/seek/samples/extractor.rb index e709ac7799..98136d8739 100644 --- a/lib/seek/samples/extractor.rb +++ b/lib/seek/samples/extractor.rb @@ -41,7 +41,6 @@ def persist ) samples.each do |sample| sample.project_ids = project_ids - disable_authorization_checks { sample.save } end ReindexingQueue.enqueue(samples) AuthLookupUpdateQueue.enqueue(samples) From ba062e350a5efca28a4a55c212e1f738e389207b Mon Sep 17 00:00:00 2001 From: fherreazcue Date: Fri, 6 Oct 2023 14:48:51 +0100 Subject: [PATCH 4/6] Adds upgrade task --- lib/tasks/seek_upgrades.rake | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/tasks/seek_upgrades.rake b/lib/tasks/seek_upgrades.rake index c5ba4e07a7..c5b7aac9e9 100644 --- a/lib/tasks/seek_upgrades.rake +++ b/lib/tasks/seek_upgrades.rake @@ -9,6 +9,7 @@ namespace :seek do task upgrade_version_tasks: %i[ environment decouple_extracted_samples_policies + decouple_extracted_samples_projects ] # these are the tasks that are executes for each upgrade as standard, and rarely change @@ -61,6 +62,21 @@ namespace :seek do puts " ... finished creating independent policies of #{decoupled.to_s} extracted samples" end + task(decouple_extracted_samples_projects: [:environment]) do + puts '... copying project ids for extracted samples...' + decoupled = 0 + disable_authorization_checks do + Sample.find_each do |sample| + # check if the sample was extracted from a datafile and their projects are linked + if sample.extracted? && sample.project_ids.empty? + sample.project_ids = sample.originating_data_file.project_ids + decoupled += 1 + end + end + end + puts " ... finished copying project ids of #{decoupled.to_s} extracted samples" + end + private ## From 9116c0277745b5902d417f0161fe30ee424c379a Mon Sep 17 00:00:00 2001 From: fherreazcue Date: Fri, 6 Oct 2023 16:45:01 +0100 Subject: [PATCH 5/6] Upgrade task updates projects_samples table with insert_all --- lib/tasks/seek_upgrades.rake | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/tasks/seek_upgrades.rake b/lib/tasks/seek_upgrades.rake index c5b7aac9e9..7b46e394eb 100644 --- a/lib/tasks/seek_upgrades.rake +++ b/lib/tasks/seek_upgrades.rake @@ -65,14 +65,21 @@ namespace :seek do task(decouple_extracted_samples_projects: [:environment]) do puts '... copying project ids for extracted samples...' decoupled = 0 + hash_array = [] disable_authorization_checks do Sample.find_each do |sample| # check if the sample was extracted from a datafile and their projects are linked if sample.extracted? && sample.project_ids.empty? - sample.project_ids = sample.originating_data_file.project_ids + sample.originating_data_file.project_ids.each do |project_id| + hash_array << { project_id: project_id, sample_id: sample.id } + end decoupled += 1 end end + unless hash_array.empty? do + class ProjectsSample < ActiveRecord::Base; end; + ProjectsSample.insert_all(hash_array) + end end puts " ... finished copying project ids of #{decoupled.to_s} extracted samples" end From a10ebe5447c73c9903e6d78616cde44957722fae Mon Sep 17 00:00:00 2001 From: fherreazcue Date: Fri, 6 Oct 2023 19:58:20 +0100 Subject: [PATCH 6/6] Fix extra do --- lib/tasks/seek_upgrades.rake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tasks/seek_upgrades.rake b/lib/tasks/seek_upgrades.rake index 7b46e394eb..a376bf1274 100644 --- a/lib/tasks/seek_upgrades.rake +++ b/lib/tasks/seek_upgrades.rake @@ -76,7 +76,7 @@ namespace :seek do decoupled += 1 end end - unless hash_array.empty? do + unless hash_array.empty? class ProjectsSample < ActiveRecord::Base; end; ProjectsSample.insert_all(hash_array) end