diff --git a/app/api/io/study.rb b/app/api/io/study.rb index ff3165c4f4..3ec028f69e 100644 --- a/app/api/io/study.rb +++ b/app/api/io/study.rb @@ -26,7 +26,7 @@ class Io::Study < Core::Io::Base study_metadata.commercially_available => commercially_available study_metadata.data_release_study_type.name => data_release_sort_of_study study_metadata.data_release_strategy => data_release_strategy -study_metadata.contaminated_human_data_access_group => contaminated_human_data_access_group +study_metadata.contaminated_human_data_access_group => contaminated_human_data_access_group ' ) end diff --git a/app/models/api/study_io.rb b/app/models/api/study_io.rb index 5101ca1d33..fa289a5bae 100644 --- a/app/models/api/study_io.rb +++ b/app/models/api/study_io.rb @@ -101,5 +101,8 @@ def render_class map_attribute_to_json_attribute(:data_deletion_period) map_attribute_to_json_attribute(:contaminated_human_data_access_group) with_association(:program, lookup_by: :id) { map_attribute_to_json_attribute(:name, 'programme') } + map_attribute_to_json_attribute(:ebi_library_strategy) + map_attribute_to_json_attribute(:ebi_library_source) + map_attribute_to_json_attribute(:ebi_library_selection) end end diff --git a/app/models/study.rb b/app/models/study.rb index 21e3f48bf6..34ea31b8f5 100644 --- a/app/models/study.rb +++ b/app/models/study.rb @@ -107,6 +107,10 @@ class Study < ApplicationRecord # rubocop:todo Metrics/ClassLength DATA_RELEASE_DELAY_PERIODS = ['3 months', '6 months', '9 months', '12 months', '18 months'].freeze + EBI_LIBRARY_STRATEGY_OPTIONS = Rails.configuration.ena_requirement_fields['EBI_Library_strategy'] + EBI_LIBRARY_SOURCE_OPTIONS = Rails.configuration.ena_requirement_fields['EBI_Library_source'] + EBI_LIBRARY_SELECTION_OPTIONS = Rails.configuration.ena_requirement_fields['EBI_Library_selection'] + # Class variables self.per_page = 500 @@ -214,6 +218,11 @@ class Study < ApplicationRecord # rubocop:todo Metrics/ClassLength custom_attribute(:commercially_available, required: true, in: YES_OR_NO) custom_attribute(:study_name_abbreviation) + # add ebi library strategy + custom_attribute(:ebi_library_strategy, required: true, in: EBI_LIBRARY_STRATEGY_OPTIONS) + custom_attribute(:ebi_library_source, required: true, in: EBI_LIBRARY_SOURCE_OPTIONS) + custom_attribute(:ebi_library_selection, required: true, in: EBI_LIBRARY_SELECTION_OPTIONS) + custom_attribute( :data_release_strategy, required: true, @@ -309,6 +318,10 @@ class Study < ApplicationRecord # rubocop:todo Metrics/ClassLength allow_blank: true } + validates :ebi_library_strategy, inclusion: { in: EBI_LIBRARY_STRATEGY_OPTIONS } + validates :ebi_library_source, inclusion: { in: EBI_LIBRARY_SOURCE_OPTIONS } + validates :ebi_library_selection, inclusion: { in: EBI_LIBRARY_SELECTION_OPTIONS } + before_validation do |record| record.reference_genome_id = 1 if record.reference_genome_id.blank? diff --git a/app/uat_actions/uat_actions/generate_sample_manifest.rb b/app/uat_actions/uat_actions/generate_sample_manifest.rb index 6f296bf438..4314e05702 100644 --- a/app/uat_actions/uat_actions/generate_sample_manifest.rb +++ b/app/uat_actions/uat_actions/generate_sample_manifest.rb @@ -114,7 +114,10 @@ def study contaminated_human_dna: 'No', contains_human_dna: 'No', commercially_available: 'No', - program: UatActions::StaticRecords.program + program: UatActions::StaticRecords.program, + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } ).find_or_create_by!(name: study_name) end diff --git a/app/uat_actions/uat_actions/generate_study.rb b/app/uat_actions/uat_actions/generate_study.rb index 7ca534603f..ff4edfe317 100644 --- a/app/uat_actions/uat_actions/generate_study.rb +++ b/app/uat_actions/uat_actions/generate_study.rb @@ -31,7 +31,10 @@ def create_study contaminated_human_dna: 'No', contains_human_dna: 'No', commercially_available: 'No', - program: UatActions::StaticRecords.program + program: UatActions::StaticRecords.program, + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } ).find_or_create_by!(name: study_name) end diff --git a/app/uat_actions/uat_actions/static_records.rb b/app/uat_actions/uat_actions/static_records.rb index a5a4f63e62..9e44ff9770 100644 --- a/app/uat_actions/uat_actions/static_records.rb +++ b/app/uat_actions/uat_actions/static_records.rb @@ -33,7 +33,10 @@ def self.study contaminated_human_dna: 'No', contains_human_dna: 'No', commercially_available: 'No', - program: program + program: program, + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } ).find_or_create_by!(name: 'UAT Study') end diff --git a/app/views/shared/metadata/edit/_study.html.erb b/app/views/shared/metadata/edit/_study.html.erb index 905dedfb3c..e07c9b2777 100644 --- a/app/views/shared/metadata/edit/_study.html.erb +++ b/app/views/shared/metadata/edit/_study.html.erb @@ -9,14 +9,17 @@ <%= metadata_fields.text_field(:prelim_id) %> <%= metadata_fields.select_by_association(:reference_genome, {}, { class: 'select2' }) %> + <%= metadata_fields.select_by_association(:study_type)%> <% metadata_fields.with_options(grouping: 'ENA requirement') do |group| %> <%= group.text_field(:study_study_title) %> - <%= group.select_by_association(:study_type)%> <%= group.text_area(:study_description) %> <%= group.text_area(:study_abstract) %> <%= group.radio_select(:study_sra_hold, Study::STUDY_SRA_HOLDS) %> - <% end %> + <%= metadata_fields.select(:ebi_library_strategy, Study::EBI_LIBRARY_STRATEGY_OPTIONS) %> + <%= metadata_fields.select(:ebi_library_source, Study::EBI_LIBRARY_SOURCE_OPTIONS) %> + <%= metadata_fields.select(:ebi_library_selection, Study::EBI_LIBRARY_SELECTION_OPTIONS) %> + <% end %> <%= metadata_fields.radio_select(:contains_human_dna, Study::YES_OR_NO) %> <%= metadata_fields.radio_select(:contaminated_human_dna, Study::YES_OR_NO) %> diff --git a/app/views/shared/metadata/show/_study.html.erb b/app/views/shared/metadata/show/_study.html.erb index 1030ceeb5d..2f656b6bec 100644 --- a/app/views/shared/metadata/show/_study.html.erb +++ b/app/views/shared/metadata/show/_study.html.erb @@ -14,6 +14,10 @@ <%= group.plain_value(:study_sra_hold) %> <% end %> + <%= metadata_fields.plain_value(:ebi_library_strategy) %> + <%= metadata_fields.plain_value(:ebi_library_source) %> + <%= metadata_fields.plain_value(:ebi_library_selection) %> + <%= metadata_fields.plain_value(:contains_human_dna) %> <%= metadata_fields.plain_value(:contaminated_human_dna) %> <%= metadata_fields.plain_value(:commercially_available) %> diff --git a/config/application.rb b/config/application.rb index 2158cb9183..0537ec2f0d 100644 --- a/config/application.rb +++ b/config/application.rb @@ -91,6 +91,9 @@ class Application < Rails::Application config.phi_x = config_for(:phi_x).with_indifferent_access + # add ena requirement fields here + config.ena_requirement_fields = config_for(:ena_requirement_fields) + config.generators do |g| g.test_framework :rspec, fixtures: true, diff --git a/config/ena_requirement_fields.yml b/config/ena_requirement_fields.yml new file mode 100644 index 0000000000..e487597d3d --- /dev/null +++ b/config/ena_requirement_fields.yml @@ -0,0 +1,64 @@ +default: &DEFAULT + EBI_Library_strategy: + - "RNA-Seq" + - "ChIP-Seq" + - "WGS" + - "WXS" + - "AMPLICON" + - "CLONE" + - "POOLCLONE" + - "CLONEEND" + - "Bisulfite-Seq" + - "MNase-Seq" + - "DNase-Hypersensitivity" + - "FAIRE-seq" + - "SELEX" + - "RIP-Seq" + - "ChIA-PET" + - "OTHER" + EBI_Library_source: + - "GENOMIC" + - "TRANSCRIPTOMIC" + - "METAGENOMIC" + - "METATRANSCRIPTOMIC" + - "SYNTHETIC" + - "VIRAL RNA" + - "OTHER" + EBI_Library_selection: + - "RANDOM" + - "PCR" + - "RANDOM PCR" + - "RT-PCR" + - "HMPR" + - "MF" + - "CF-S" + - "CF-M" + - "CF-T" + - "MDA" + - "MSLL" + - "cDNA" + - "ChIP" + - "MNase" + - "DNAse" + - "Hybrid Selection" + - "Reduced Representation" + - "Restriction Digest" + - "5-methylcytidine antibody" + - "MBD2 protein methyl-CpG binding domain" + +development: + <<: *DEFAULT +next_release: + <<: *DEFAULT +test: + <<: *DEFAULT +cucumber: + <<: *DEFAULT +production: + <<: *DEFAULT +staging: + <<: *DEFAULT +staging_2: + <<: *DEFAULT +training: + <<: *DEFAULT diff --git a/config/locales/metadata/en.yml b/config/locales/metadata/en.yml index 94242d2d54..729722ad95 100644 --- a/config/locales/metadata/en.yml +++ b/config/locales/metadata/en.yml @@ -384,7 +384,6 @@ en: study_type_id: label: Study Type - edit_info: "ENA requirement" study_ebi_accession_number: label: ENA Study Accession Number @@ -522,6 +521,19 @@ en: contaminated_human_data_access_group: label: Contaminated Human Data Access Group help: "Allows specified Unix groups and users access to data segregated from the main data product, which is potentially contaminated with human data. This access is typically rarely used and is primarily for validating the separation process, as we may not have the ethical or legal clearance." + + ebi_library_strategy: + label: EBI Library Strategy + edit_info: "ENA requirement" + + ebi_library_source: + label: EBI Library Source + edit_info: "ENA requirement" + + ebi_library_selection: + label: EBI Library Selection + edit_info: "ENA requirement" + project: metadata: project_manager_id: diff --git a/db/migrate/20250108172249_add_ebi_requirement_fields_to_study_metadata.rb b/db/migrate/20250108172249_add_ebi_requirement_fields_to_study_metadata.rb new file mode 100644 index 0000000000..d68f279835 --- /dev/null +++ b/db/migrate/20250108172249_add_ebi_requirement_fields_to_study_metadata.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true +class AddEbiRequirementFieldsToStudyMetadata < ActiveRecord::Migration[6.1] + def change + add_column :study_metadata, :ebi_library_strategy, :string, default: nil + add_column :study_metadata, :ebi_library_source, :string, default: nil + add_column :study_metadata, :ebi_library_selection, :string, default: nil + end +end diff --git a/db/schema.rb b/db/schema.rb index 732f99214d..6712e6da51 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1548,6 +1548,9 @@ t.string "s3_email_list" t.string "data_deletion_period" t.string "contaminated_human_data_access_group" + t.string "ebi_library_strategy" + t.string "ebi_library_source" + t.string "ebi_library_selection" t.string "data_release_prevention_other_comment" t.index ["faculty_sponsor_id"], name: "index_study_metadata_on_faculty_sponsor_id" t.index ["study_id"], name: "index_study_metadata_on_study_id" diff --git a/features/studies/4295391_study_xml_needs_to_be_reverted_to_old_version.feature b/features/studies/4295391_study_xml_needs_to_be_reverted_to_old_version.feature index 83ce342e94..60aa0215cf 100644 --- a/features/studies/4295391_study_xml_needs_to_be_reverted_to_old_version.feature +++ b/features/studies/4295391_study_xml_needs_to_be_reverted_to_old_version.feature @@ -205,6 +205,18 @@ Feature: The XML for the sequencescape API Policy Url Policy title ArrayExpress Accession Number + + EBI Library Strategy + WGS + + + EBI Library Source + GENOMIC + + + EBI Library Selection + PCR + """ diff --git a/features/support/step_definitions/study_steps.rb b/features/support/step_definitions/study_steps.rb index 05798b7dfb..7279b559e9 100644 --- a/features/support/step_definitions/study_steps.rb +++ b/features/support/step_definitions/study_steps.rb @@ -332,7 +332,10 @@ def assign_asset_to_study(asset, study_name) data_release_study_type: DataReleaseStudyType.first, contaminated_human_dna: 'No', contains_human_dna: 'Yes', - commercially_available: 'No' + commercially_available: 'No', + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } ) end diff --git a/lib/working_setup/standard_seeder.rb b/lib/working_setup/standard_seeder.rb index 9966b65906..5d85697013 100644 --- a/lib/working_setup/standard_seeder.rb +++ b/lib/working_setup/standard_seeder.rb @@ -140,7 +140,10 @@ def create_study(name) contaminated_human_dna: 'No', contains_human_dna: 'No', commercially_available: 'No', - program_id: program.id + program_id: program.id, + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } ) do |study| study.activate! diff --git a/spec/controllers/studies_controller_spec.rb b/spec/controllers/studies_controller_spec.rb index cb6bf5ae17..27ab3b5f0b 100644 --- a/spec/controllers/studies_controller_spec.rb +++ b/spec/controllers/studies_controller_spec.rb @@ -23,7 +23,10 @@ 'commercially_available' => 'No', 'data_release_study_type_id' => data_release_study_type, 'data_release_strategy' => 'open', - 'study_type_id' => StudyType.find_or_create_by(name: 'Not specified').id + 'study_type_id' => StudyType.find_or_create_by(name: 'Not specified').id, + 'ebi_library_strategy' => 'WGS', + 'ebi_library_source' => 'GENOMIC', + 'ebi_library_selection' => 'PCR' } } } diff --git a/spec/factories/study_metadata_factories.rb b/spec/factories/study_metadata_factories.rb index 9994cb4272..22b81dd446 100644 --- a/spec/factories/study_metadata_factories.rb +++ b/spec/factories/study_metadata_factories.rb @@ -22,6 +22,10 @@ s3_email_list { 'aa1@sanger.ac.uk;aa2@sanger.ac.uk' } data_deletion_period { '3 months' } + ebi_library_strategy { 'WGS' } + ebi_library_source { 'GENOMIC' } + ebi_library_selection { 'PCR' } + transient { contaminated_human_data_access_group { nil } } after(:build) do |study_metadata, evaluator| diff --git a/spec/models/api/study_io_spec.rb b/spec/models/api/study_io_spec.rb index 7695205f3b..c4572013f4 100644 --- a/spec/models/api/study_io_spec.rb +++ b/spec/models/api/study_io_spec.rb @@ -16,7 +16,10 @@ ega_policy_accession_number: 'EGA222', ega_dac_accession_number: 'DAC333', program: create(:program, name: 'General'), - contaminated_human_data_access_group: 'contaminated human data access group test' + contaminated_human_data_access_group: 'contaminated human data access group test', + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } ) end @@ -57,6 +60,9 @@ 'data_deletion_period' => '3 months', 'contaminated_human_data_access_group' => 'contaminated human data access group test', 'programme' => 'General', + 'ebi_library_strategy' => 'WGS', + 'ebi_library_source' => 'GENOMIC', + 'ebi_library_selection' => 'PCR', 'manager' => [ { login: manager.login, email: manager.email, name: manager.name }, { login: manager2.login, email: manager2.email, name: manager2.name } diff --git a/spec/models/study_spec.rb b/spec/models/study_spec.rb index 0b26b961e3..4a2a3fcbd9 100644 --- a/spec/models/study_spec.rb +++ b/spec/models/study_spec.rb @@ -518,7 +518,10 @@ number_of_gigabases_per_sample: 6, hmdmc_approval_number: 'HDMC123456', s3_email_list: 'aa1@sanger.ac.uk;aa2@sanger.ac.uk', - data_deletion_period: '3 months' + data_deletion_period: '3 months', + ebi_library_strategy: 'WGS', + ebi_library_source: 'GENOMIC', + ebi_library_selection: 'PCR' } end @@ -645,6 +648,18 @@ expect(study.study_metadata.faculty_sponsor).not_to be_nil end + it 'must have a ebi library strategy' do + expect(study.study_metadata.ebi_library_strategy).not_to be_nil + end + + it 'must have a ebi library source' do + expect(study.study_metadata.ebi_library_source).not_to be_nil + end + + it 'must have a ebi library selection' do + expect(study.study_metadata.ebi_library_selection).not_to be_nil + end + context 'contaminated human data access group' do it 'defaults to null when not specified' do expect(study.study_metadata.contaminated_human_data_access_group).to be_nil