Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ def create
end

def create_uploader
SampleManifest::Uploader.new(params[:upload], SampleManifestExcel.configuration, current_user, params[:override])
samples = params[:override_samples].present?

overrides = { samples:, exclude_fields: }
SampleManifest::Uploader.new(params[:upload], SampleManifestExcel.configuration, current_user, overrides)
end

def upload_manifest
Expand Down Expand Up @@ -82,4 +85,11 @@ def prepare_manifest_pagination # rubocop:todo Metrics/MethodLength
@display_manifests = pending_sample_manifests | completed_sample_manifests
@sample_manifests = SampleManifest.paginate(page: params[:page])
end

def exclude_fields
excluded_fields = []
excluded_fields << :volume if params[:overwrite_volume].blank?
excluded_fields << :concentration if params[:overwrite_concentration].blank?
excluded_fields.compact
end
end
2 changes: 1 addition & 1 deletion app/models/sample_manifest.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def self.included(base)
has_uploaded_document :uploaded, differentiator: 'uploaded'
has_uploaded_document :generated, differentiator: 'generated'

attr_accessor :override, :only_first_label, :barcode_type
attr_accessor :overrides, :only_first_label, :barcode_type
attr_writer :rows_per_well, :invalid_wells

class_attribute :spreadsheet_offset
Expand Down
12 changes: 7 additions & 5 deletions app/models/sample_manifest/uploader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
class SampleManifest::Uploader
include ActiveModel::Validations

attr_reader :file, :configuration, :tag_group, :upload, :user, :override
attr_reader :file, :configuration, :tag_group, :upload, :user

validates :tag_group, presence: { message: 'is not correctly configured for manifest generation' }
validates :file, :configuration, :user, presence: true
Expand All @@ -18,14 +18,12 @@ class SampleManifest::Uploader

delegate :processed?, :study, to: :upload

def initialize(file, configuration, user, override)
def initialize(file, configuration, user, overrides)
@file = file
@configuration = configuration || SequencescapeExcel::NullObjects::NullConfiguration.new
@user = user
@override = override
@tag_group = create_tag_group
@upload =
SampleManifestExcel::Upload::Base.new(file: file, column_list: self.configuration.columns.all, override: override)
@upload = SampleManifestExcel::Upload::Base.new(file:, column_list:, overrides:)
end

def run! # rubocop:disable Metrics/MethodLength
Expand Down Expand Up @@ -54,6 +52,10 @@ def run! # rubocop:disable Metrics/MethodLength

private

def column_list
configuration.columns.all
end

def process_upload_and_callbacks
return false unless upload.process(tag_group)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Base # rubocop:todo Metrics/ClassLength
include AccessionHelper
include ActiveModel::Model

attr_accessor :file, :column_list, :start_row, :override
attr_accessor :file, :column_list, :start_row, :overrides

# rubocop:todo Layout/LineLength
attr_reader :spreadsheet, :columns, :sanger_sample_id_column, :rows, :sample_manifest, :data, :processor, :cache # TODO: probably shouldn't add the cache here, do it another way
Expand Down Expand Up @@ -47,7 +47,7 @@ def initialize(attributes = {}) # rubocop:todo Metrics/AbcSize
@cache = Cache.new(self)
@rows = Upload::Rows.new(data, columns, @cache)
@sample_manifest = derive_sample_manifest
@override = override || false
@overrides = overrides || { samples: false, exclude_fields: [] }
@processor = create_processor
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def samples_valid?
all_valid = true

upload.rows.each do |row|
unless row.validate_sample
unless row.validate_sample(upload.overrides)
upload.errors.add(:base, row.errors.full_messages.join(', ').to_s)
all_valid = false
end
Expand All @@ -60,7 +60,7 @@ def samples_valid?

def update_samples_and_aliquots(tag_group)
upload.rows.each do |row|
row.update_sample(tag_group, upload.override)
row.update_sample(tag_group, upload.overrides)
substitutions.concat(row.aliquots.filter_map(&:substitution_hash)) if row.reuploaded?
end
update_downstream_aliquots unless no_substitutions?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def run(tag_group)

def update_samples_and_aliquots(tag_group)
upload.rows.each do |row|
row.update_sample(tag_group, upload.override)
row.update_sample(tag_group, upload.overrides)
row.transfer_aliquot # Requests are smart enough to only transfer once
substitutions.concat(row.aliquots.filter_map(&:substitution_hash)) if row.reuploaded?
end
Expand Down
49 changes: 32 additions & 17 deletions app/sample_manifest_excel/sample_manifest_excel/upload/row.rb
Original file line number Diff line number Diff line change
Expand Up @@ -88,30 +88,41 @@
# - Updating all of the specialised fields in the aliquot
# - Updating the sample metadata
# - Saving the asset, metadata and sample
def update_sample(tag_group, override)
def update_sample(tag_group, overrides)
return unless valid?

@reuploaded = sample.updated_by_manifest

if skip_sample_update?(override)
if skip_sample_update?(overrides)
@sample_skipped = true
return
end

@sample_updated = save_sample(tag_group)
exclude_fields = overrides[:exclude_fields]
@sample_updated = save_sample(tag_group, exclude_fields)
end

def changed?
(@sample_updated && sample.previous_changes.present?) || metadata.previous_changes.present? ||
aliquots.any? { |a| a.previous_changes.present? }
end

def update_specialised_fields(tag_group)
specialised_fields.each { |specialised_field| specialised_field.update(tag_group:) }
def update_specialised_fields(tag_group, exclude_fields)
specialised_fields.each do |specialised_field|
puts "Exclude specialised fields: #{exclude_fields.inspect}, Processing column: #{specialised_field.name.to_sym}"

Check failure on line 112 in app/sample_manifest_excel/sample_manifest_excel/upload/row.rb

View workflow job for this annotation

GitHub Actions / Rubocop

Layout/LineLength: Line is too long. [123/120] (https://rubystyle.guide#max-line-length)

Check failure on line 112 in app/sample_manifest_excel/sample_manifest_excel/upload/row.rb

View workflow job for this annotation

GitHub Actions / Rubocop

Rails/Output: Do not write to stdout. Use Rails's logger if you want to log.
next if exclude_fields.include?(specialised_field.name.to_sym)

puts "Updating specialised field: #{specialised_field.name}"

Check failure on line 115 in app/sample_manifest_excel/sample_manifest_excel/upload/row.rb

View workflow job for this annotation

GitHub Actions / Rubocop

Rails/Output: Do not write to stdout. Use Rails's logger if you want to log.

specialised_field.update(tag_group:)
end
end

def update_metadata_fields
def update_metadata_fields(exclude_fields)
columns.with_metadata_fields.each do |column|
puts "Exclude metadata fields: #{exclude_fields.inspect}, Processing column: #{column.name}"

Check failure on line 123 in app/sample_manifest_excel/sample_manifest_excel/upload/row.rb

View workflow job for this annotation

GitHub Actions / Rubocop

Rails/Output: Do not write to stdout. Use Rails's logger if you want to log.
next if exclude_fields.include?(column.name.to_sym)

value = at(column.number)
column.update_metadata(metadata, value) if value.present?
end
Expand Down Expand Up @@ -172,9 +183,9 @@
sample.primary_receptacle.labware
end

def validate_sample
def validate_sample(overrides)
check_sample_present
sample_can_be_updated
sample_can_be_updated(overrides)
errors.empty?
end

Expand Down Expand Up @@ -247,12 +258,14 @@
#
# This confirms that the sample can be updated by attempting to apply the updates
# and raising errors if any of the updates are invalid. It does not (seem to!) save any changes to the database.
def sample_can_be_updated
def sample_can_be_updated(overrides)
return unless errors.empty?

exclude_fields = overrides[:exclude_fields]

check_primary_receptacle
check_specialised_fields
check_sample_metadata
check_specialised_fields(exclude_fields)
check_sample_metadata(exclude_fields)
end

def check_primary_receptacle
Expand All @@ -261,19 +274,21 @@
errors.add(:base, "#{row_title} Does not have a primary receptacle.")
end

def check_specialised_fields
def check_specialised_fields(exclude_fields)
return unless errors.empty?

specialised_fields.each do |specialised_field|
next if exclude_fields.include?(specialised_field.name.to_sym)

unless specialised_field.valid?
errors.add(:base, "#{row_title} #{specialised_field.errors.full_messages.join(', ')}")
end
end
end

def check_sample_metadata
def check_sample_metadata(exclude_fields)
# it has to be called here, otherwise metadata errors will not appear
update_metadata_fields
update_metadata_fields(exclude_fields)
return if metadata.valid?

errors.add(:base, "#{row_title} #{metadata.errors.full_messages.join(', ')}")
Expand Down Expand Up @@ -302,10 +317,10 @@
fields.each { |field| field.link(indexed_fields) }
end

def save_sample(tag_group)
update_specialised_fields(tag_group)
def save_sample(tag_group, exclude_fields)
update_specialised_fields(tag_group, exclude_fields)
asset.save!
update_metadata_fields
update_metadata_fields(exclude_fields)
metadata.save!
sample.updated_by_manifest = true
sample.empty_supplier_sample_name = false
Expand Down
34 changes: 33 additions & 1 deletion app/views/sdb/sample_manifests/_upload.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,43 @@
<%= file_field_tag :upload, required: true %>
</div>
<div class="form-group">
<%= check_box_tag :override %>&nbsp;<%= label_tag :override, 'Override previously uploaded samples' %>
<div class="form-check">
<%= check_box_tag :override_samples, class: 'form-check-input'%>
<%= label_tag :override_samples, 'Override previously uploaded samples', class: 'form-check-label' %>
</div>

<div class="ml-3"><%# Indent the volume and concentration checkboxes, since they depend on override_samples %>
<div class="form-check">
<%= check_box_tag :overwrite_volume, class: 'form-check-input', disabled: true %>
<%= label_tag :overwrite_volume, 'Overwrite volume', class: 'form-check-label' %>
</div>
<div class="form-check">
<%= check_box_tag :overwrite_concentration, class: 'form-check-input', disabled: true %>
<%= label_tag :overwrite_concentration, 'Overwrite concentration', class: 'form-check-label' %>
</div>
</div>
</div>
<div class="form-group mb-0">
<%= submit_tag 'Upload manifest', class: 'btn btn-success' %>
</div>
</fieldset>
<% end -%>
<% end %>

<script>
// Add JavaScript to enable/disable the volume and concentration checkboxes based on the state of the override-samples checkbox
document.addEventListener('DOMContentLoaded', function() {
const overrideSamples = document.getElementById('override_samples');
const overwriteVolume = document.getElementById('overwrite_volume');
const overwriteConcentration = document.getElementById('overwrite_concentration');

// Enable the vol and conc checkboxes when override-samples is checked, otherwise disable them
function updateCheckboxStates() {
overwriteVolume.disabled = !overrideSamples.checked;
overwriteConcentration.disabled = !overrideSamples.checked;
}

// Listen for changes
overrideSamples.addEventListener('change', updateCheckboxStates);
});
</script>
5 changes: 4 additions & 1 deletion app/views/shared/metadata/show/_sample.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,15 @@
<%= metadata_fields.plain_value(:geographical_region) %>
<%= metadata_fields.plain_value(:ethnicity) %>
<%= metadata_fields.plain_value(:dna_source) %>
<%= metadata_fields.plain_value(:volume) %>
<%= metadata_fields.plain_value(:mother) %>
<%= metadata_fields.plain_value(:father) %>
<%= metadata_fields.plain_value(:replicate) %>
<%= metadata_fields.plain_value(:collected_by) %>

<!-- Physical properties -->
<%= metadata_fields.plain_value(:volume) %>
<%= metadata_fields.plain_value(:concentration) %>

<%# Fields for 'Next-gen sequencing' %>
<%= metadata_fields.plain_value(:organism) %>
<%= metadata_fields.plain_value(:gc_content) %>
Expand Down
Loading
Loading