Write task to migrate budget admins and valuators

If we didn't run this task, investments for existing budgets wouldn't
show their administrator/valuators as an option when we're editing them,
leading to data loss.
This commit is contained in:
Javi Martín
2019-11-01 01:01:00 +01:00
parent 62c4d41af4
commit 9b511edd5b
3 changed files with 74 additions and 14 deletions

View File

@@ -5,6 +5,7 @@ namespace :consul do
desc "Runs tasks needed to upgrade from 1.0.0 to 1.1.0" desc "Runs tasks needed to upgrade from 1.0.0 to 1.1.0"
task "execute_release_1.1.0_tasks": [ task "execute_release_1.1.0_tasks": [
"budgets:set_original_heading_id", "budgets:set_original_heading_id",
"migrations:valuation_taggings" "migrations:valuation_taggings",
"migrations:budget_admins_and_valuators"
] ]
end end

View File

@@ -4,4 +4,17 @@ namespace :migrations do
ApplicationLogger.new.info "Updating valuation taggings context" ApplicationLogger.new.info "Updating valuation taggings context"
Tagging.where(context: "valuation").update_all(context: "valuation_tags") Tagging.where(context: "valuation").update_all(context: "valuation_tags")
end end
desc "Migrates budget staff"
task budget_admins_and_valuators: :environment do
ApplicationLogger.new.info "Updating budget administrators and valuators"
Budget.find_each do |budget|
investments = budget.investments.with_hidden
budget.update!(
administrator_ids: investments.where.not(administrator: nil).distinct.pluck(:administrator_id),
valuator_ids: Budget::ValuatorAssignment.where(investment: investments).distinct.pluck(:valuator_id)
)
end
end
end end

View File

@@ -1,6 +1,7 @@
require "rails_helper" require "rails_helper"
describe "Migration tasks" do describe "Migration tasks" do
describe "valuation_taggins" do
let(:run_rake_task) do let(:run_rake_task) do
Rake::Task["migrations:valuation_taggings"].reenable Rake::Task["migrations:valuation_taggings"].reenable
Rake.application.invoke_task("migrations:valuation_taggings") Rake.application.invoke_task("migrations:valuation_taggings")
@@ -19,4 +20,49 @@ describe "Migration tasks" do
expect(valuation_tags_tagging.reload.context).to eq "valuation_tags" expect(valuation_tags_tagging.reload.context).to eq "valuation_tags"
expect(tags_tagging.reload.context).to eq "tags" expect(tags_tagging.reload.context).to eq "tags"
end end
end
describe "budget_admins_and_valuators" do
let(:run_rake_task) do
Rake::Task["migrations:budget_admins_and_valuators"].reenable
Rake.application.invoke_task("migrations:budget_admins_and_valuators")
end
let(:old_budget) { create(:budget) }
let(:current_budget) { create(:budget) }
it "assigns administrators from existing investments" do
harold = create(:administrator)
john = create(:administrator)
root = create(:administrator)
create(:budget_investment, budget: old_budget, administrator: john)
create(:budget_investment, budget: old_budget, administrator: harold)
create(:budget_investment, budget: old_budget, administrator: nil)
create(:budget_investment, budget: current_budget, administrator: root)
run_rake_task
expect(old_budget.administrators).to match_array [john, harold]
expect(current_budget.administrators).to match_array [root]
end
it "assigns valuators from existing investments" do
tyrion = create(:valuator)
cersei = create(:valuator)
jaime = create(:valuator)
create(:budget_investment, budget: old_budget, valuators: [cersei])
create(:budget_investment, budget: old_budget, valuators: [jaime, cersei])
create(:budget_investment, budget: old_budget, valuators: [])
create(:budget_investment, budget: current_budget, valuators: [tyrion, jaime])
run_rake_task
expect(old_budget.valuators).to match_array [cersei, jaime]
expect(current_budget.valuators).to match_array [tyrion, jaime]
end
end
end end