From c5fb57a1c056f9196f0351c97c742ff4f16a132a Mon Sep 17 00:00:00 2001 From: Andrew Myers Date: Thu, 13 Jun 2024 10:11:11 -0400 Subject: [PATCH] Another refactor/simplification Uses AdminData.attributes_for_updates as a filter to the change set fields. Filters out blank sony ci ids so they don't get serialized. Adds validation routine to AdminData for guarding against fields that cannot be deleted once set: bulkrax_importer_id and batch_ingest_batch_id. These IDs are foreign keys and if they accidentally get unset, we loase relational integrity, so need to make sure they are not accidentally getting unset via ingest, or updating Assets via UI, or anywhere else. --- .../aapb/batch_ingest/csv_item_ingester.rb | 4 +-- .../ams/steps/create_aapb_admin_data.rb | 33 +++---------------- 2 files changed, 7 insertions(+), 30 deletions(-) diff --git a/app/services/aapb/batch_ingest/csv_item_ingester.rb b/app/services/aapb/batch_ingest/csv_item_ingester.rb index 0ba9b8c6..35ae6cab 100644 --- a/app/services/aapb/batch_ingest/csv_item_ingester.rb +++ b/app/services/aapb/batch_ingest/csv_item_ingester.rb @@ -213,8 +213,8 @@ def set_batch_ingest_id_on_related_asset(work_id, ability) def set_admin_data_attributes(admin_data, attributes) # add existing admin_data values so they're preserved in the AssetActor AdminData.attributes_for_update.each do |admin_attr| - next unless attributes.keys.include?(admin_attr.to_s) - admin_data.send("#{admin_attr}=", attributes[admin_attr.to_s]) + next unless attributes.keys.include?(admin_attr) + admin_data.send("#{admin_attr}=", attributes[admin_attr]) end end diff --git a/app/transactions/ams/steps/create_aapb_admin_data.rb b/app/transactions/ams/steps/create_aapb_admin_data.rb index 146526cf..b8106c7c 100644 --- a/app/transactions/ams/steps/create_aapb_admin_data.rb +++ b/app/transactions/ams/steps/create_aapb_admin_data.rb @@ -51,35 +51,12 @@ def save_aapb_admin_data(change_set) end def set_admin_data_attributes(admin_data, change_set) - AdminData.attributes_for_update.each do |field| - field = field.to_s - - # Conditionally set new value for admin data field - new_admin_data_value = if AdminData::SERIALIZED_FIELDS.include?(field.to_sym) - # Filter out blanks if the field is a serialized field, e.g. sonyci_id. - change_set.fields[field].reject {|v| v.blank? } - elsif change_set.fields[field].blank? - # If not serialized and blank, convert to nil - nil - else - # Otherwise keep value as is. - change_set.fields[field] - end - - # If the AdminData field can be emptied OR if we have a non-blank value, then update the AdminData field. - if can_empty_field?(field) || new_admin_data_value.present? - admin_data.write_attribute(field, new_admin_data_value) - else - Rails.logger.debug("Chose not to update AdminData #{admin_data.id}'s field #{field} with value(s): #{change_set.fields[field]}") - end + admin_data_values = change_set.fields.slice(*AdminData.attributes_for_update).compact + # If Sony Ci IDs are present, ensure there are no blank ones, such as empty strings. + if admin_data_values.key?('sonyci_id') + admin_data_values['sonyci_id'] = Array(admin_data_values['sonyci_id']).reject(&:blank?) end - end - - def can_empty_field?(field) - %w( - bulkrax_importer_id - hyrax_batch_ingest_batch_id - ).exclude?(field.to_s) + admin_data.update!(admin_data_values) end def delete_removed_annotations(admin_data, change_set)