diff --git a/app/controllers/migration/failures_controller.rb b/app/controllers/migration/failures_controller.rb
new file mode 100644
index 00000000..dfdccce0
--- /dev/null
+++ b/app/controllers/migration/failures_controller.rb
@@ -0,0 +1,8 @@
+class Migration::FailuresController < ::AdminController
+ layout "migration"
+
+ def index
+ @migration_failures = MigrationFailure.where(data_migration_id: DataMigration.where(model: params[:model]).select(:id))
+ @model = params[:model]
+ end
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 8ea70828..58e7afe1 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1,5 +1,5 @@
module ApplicationHelper
- def page_data(title:, header: nil, header_size: "l", error: false)
+ def page_data(title:, header: nil, header_size: "l", error: false, backlink_href: nil)
page_title = if error
"Error: #{title}"
else
@@ -10,10 +10,14 @@ def page_data(title:, header: nil, header_size: "l", error: false)
return { page_title: } if header == false
+ backlink = govuk_back_link(href: backlink_href) unless backlink_href.nil?
+
+ content_for(:backlink) { backlink }
+
page_header = tag.h1(header || title, class: "govuk-heading-#{header_size}")
content_for(:page_header) { page_header }
- { page_title:, page_header: }
+ { page_title:, backlink:, page_header: }
end
end
diff --git a/app/helpers/migration_helper.rb b/app/helpers/migration_helper.rb
index 8dbd4014..f8f37a7e 100644
--- a/app/helpers/migration_helper.rb
+++ b/app/helpers/migration_helper.rb
@@ -53,6 +53,15 @@ def data_migration_percentage_migrated_successfully_tag(data_migrations)
govuk_tag(text: "#{avg_percentage.floor}%", colour:)
end
+ def data_migration_failures_link(data_migrations)
+ failure_count = data_migrations.sum(&:failure_count)
+
+ return unless failure_count.positive?
+
+ model = data_migrations.sample.model
+ govuk_link_to("Failures for #{model}", failures_migrations_path(model))
+ end
+
def data_migration_download_failures_report_link(data_migrations)
failure_count = data_migrations.sum(&:failure_count)
@@ -60,4 +69,19 @@ def data_migration_download_failures_report_link(data_migrations)
govuk_link_to("Failures report", download_report_migrations_path(data_migrations.sample.model))
end
+
+ def failure_item_json_code(item)
+ "#{JSON.pretty_unparse(item).gsub(/\n/, '
".html_safe
+ end
+
+ def failure_item_summary_list(item)
+ govuk_summary_list(html_attributes: { class: "govuk-!-font-size-16" }) do |summary_list|
+ item.each do |k, v|
+ summary_list.with_row do |row|
+ row.with_key { k }
+ row.with_value { v }
+ end
+ end
+ end
+ end
end
diff --git a/app/migration/migrators/teacher.rb b/app/migration/migrators/teacher.rb
index 56c5ec66..82de225f 100644
--- a/app/migration/migrators/teacher.rb
+++ b/app/migration/migrators/teacher.rb
@@ -9,7 +9,7 @@ def self.model
end
def self.teachers
- ::Migration::TeacherProfile.where(id: ::Migration::ParticipantProfile.ect_or_mentor.select(:teacher_profile_id).limit(100)).distinct
+ ::Migration::TeacherProfile.where(id: ::Migration::ParticipantProfile.ect_or_mentor.select(:teacher_profile_id).distinct)
end
def self.reset!
diff --git a/app/views/layouts/migration.html.erb b/app/views/layouts/migration.html.erb
new file mode 100644
index 00000000..95315123
--- /dev/null
+++ b/app/views/layouts/migration.html.erb
@@ -0,0 +1,32 @@
+
+
+ <%= render partial: "layouts/shared/head" %>
+
+
').gsub(/\s/, ' ')}
<%= @migration_failures.count %> failed records
+ +<%= govuk_table do |table| + table.with_head do |head| + head.with_row do |row| + row.with_cell(text: "No.") + row.with_cell(text: "Source record") + row.with_cell(text: "Validation failure") + end + end + + table.with_body do |body| + @migration_failures.each_with_index do |failure, index| + body.with_row(html_attributes: { class: "govuk-!-font-size-16" }) do |row| + row.with_cell(text: index + 1) + row.with_cell(text: failure_item_json_code(failure.item)) + row.with_cell(text: failure.failure_message) + end + end + end +end %> diff --git a/app/views/migration/migrations/_completed_migration.html.erb b/app/views/migration/migrations/_completed_migration.html.erb index a0b3a85b..c90ea959 100644 --- a/app/views/migration/migrations/_completed_migration.html.erb +++ b/app/views/migration/migrations/_completed_migration.html.erb @@ -24,7 +24,7 @@ row.with_cell(html_attributes: { class: "total-count" }, text: data_migration_total_count_tag(data_migrations)) row.with_cell(html_attributes: { class: "failure-count" }, text: data_migration_failure_count_tag(data_migrations)) row.with_cell(html_attributes: { class: "percentage-successfully-migrated" }, text: data_migration_percentage_migrated_successfully_tag(data_migrations)) - row.with_cell(text: data_migration_download_failures_report_link(data_migrations)) + row.with_cell(text: data_migration_failures_link(data_migrations)) end end end diff --git a/config/routes.rb b/config/routes.rb index a06a91bf..086c35b1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -44,6 +44,7 @@ scope module: "migration" do resources :migrations, only: %i[index create] do + get ":model/failures", on: :collection, to: "failures#index", as: :failures get "download_report/:model", on: :collection, action: :download_report, as: :download_report post "reset", on: :collection, action: :reset, as: :reset end diff --git a/config/solid_queue.yml b/config/solid_queue.yml index 2d8d922f..1adee37f 100644 --- a/config/solid_queue.yml +++ b/config/solid_queue.yml @@ -1,18 +1,18 @@ -# default: &default -# dispatchers: -# - polling_interval: 1 -# batch_size: 500 -# workers: -# - queues: "*" -# threads: 3 -# processes: 1 -# polling_interval: 0.1 -# -# development: -# <<: *default -# -# test: -# <<: *default -# -# production: -# <<: *default + default: &default + dispatchers: + - polling_interval: 1 + batch_size: 500 + workers: + - queues: "*" + threads: 3 + processes: 3 + polling_interval: 0.1 + + development: + <<: *default + + test: + <<: *default + + production: + <<: *default