diff --git a/app/services/imports/user_import_service.rb b/app/services/imports/user_import_service.rb index e280dcfe1..4062f3739 100644 --- a/app/services/imports/user_import_service.rb +++ b/app/services/imports/user_import_service.rb @@ -4,6 +4,10 @@ module Imports import_from(folder, :create_user) end + def update_users_who_signed_dpcs(folder) + import_from(folder, :update_user_who_signed_dpc) + end + private PROVIDER_TYPE = { @@ -51,6 +55,35 @@ module Imports end end + def update_user_who_signed_dpc(xml_document) + organisation = Organisation.find_by(old_org_id: user_field_value(xml_document, "institution")) + old_user_id = user_field_value(xml_document, "id") + email = user_field_value(xml_document, "email").downcase.strip + name = user_field_value(xml_document, "full-name") || email + + dpo = organisation.data_protection_confirmation.data_protection_officer + dpo.email = email + dpo.name = name + dpo.password = Devise.friendly_token + dpo.phone = user_field_value(xml_document, "telephone-no") + dpo.organisation = organisation + dpo.role = role(user_field_value(xml_document, "user-type")) + dpo.is_dpo = is_dpo?(user_field_value(xml_document, "user-type")) + dpo.is_key_contact = is_key_contact?(user_field_value(xml_document, "contact-priority-id")) + dpo.active = user_field_value(xml_document, "active") + + dpo.skip_confirmation_notification! + + begin + dpo.save! + dpo.legacy_users.create!(old_user_id:) + dpo + rescue ActiveRecord::RecordInvalid => e + @logger.error(e.message) + @logger.error("Could not save user with email: #{email}") + end + end + def user_field_value(xml_document, field) field_value(xml_document, "user", field, { "user" => "dclg:user" }) end diff --git a/lib/tasks/full_import.rake b/lib/tasks/full_import.rake index 4c5fcf380..25b474512 100644 --- a/lib/tasks/full_import.rake +++ b/lib/tasks/full_import.rake @@ -44,6 +44,47 @@ namespace :import do logger.info("Finished initial imports") end + desc "Specific subset of object imports for washup batch 2" + task :washup_imports, %i[institutions_csv_name] => :environment do |_task, args| + institutions_csv_name = args[:institutions_csv_name] + raise "Usage: rake import:washup_imports['institutions_csv_name']" if institutions_csv_name.blank? + + s3_service = Storage::S3Service.new(PlatformHelper.is_paas? ? Configuration::PaasConfigurationService.new : Configuration::EnvConfigurationService.new, ENV["IMPORT_PAAS_INSTANCE"]) + csv = CSV.parse(s3_service.get_file_io(institutions_csv_name), headers: true) + logs_string = StringIO.new + logger = MultiLogger.new(Logger.new(logs_string)) + org_count = csv.length + + initial_import_list = [ + Import.new(Imports::OrganisationImportService, :create_organisations, "institution", logger), + Import.new(Imports::DataProtectionConfirmationImportService, :create_data_protection_confirmations, "dataprotect", logger), + Import.new(Imports::UserImportService, :update_users_who_signed_dpcs, "user", logger), + Import.new(Imports::OrganisationRentPeriodImportService, :create_organisation_rent_periods, "rent-period", logger), + ] + + logger.info("Beginning imports for #{org_count} organisations") + + csv.each do |row| + archive_path = row[1] + archive_io = s3_service.get_file_io(archive_path) + archive_service = Storage::ArchiveService.new(archive_io) + logger.info("Performing imports for organisation #{row[0]}") + + initial_import_list.each do |step| + if archive_service.folder_present?(step.folder) + step.import_class.new(archive_service, step.logger).send(step.import_method, step.folder) + end + end + + log_file = "#{File.basename(institutions_csv_name, File.extname(institutions_csv_name))}_#{File.basename(archive_path, File.extname(archive_path))}_initial.log" + s3_service.write_file(log_file, logs_string.string) if logs_string.string.present? + logs_string.rewind + logs_string.truncate(0) + end + + logger.info("Finished washup imports") + end + desc "Run logs import steps" task :logs, %i[institutions_csv_name] => :environment do |_task, args| institutions_csv_name = args[:institutions_csv_name]