From a0d4c9d54cdb35cfe8ddc827385c1b0b26160961 Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Tue, 25 May 2021 15:12:30 +0200 Subject: [PATCH] Fix published revisions --- ...0210525114448_fix_published_revisions.rake | 56 +++++++++++++++++++ spec/models/procedure_spec.rb | 26 +++++++++ 2 files changed, 82 insertions(+) create mode 100644 lib/tasks/deployment/20210525114448_fix_published_revisions.rake diff --git a/lib/tasks/deployment/20210525114448_fix_published_revisions.rake b/lib/tasks/deployment/20210525114448_fix_published_revisions.rake new file mode 100644 index 000000000..781c0d9f0 --- /dev/null +++ b/lib/tasks/deployment/20210525114448_fix_published_revisions.rake @@ -0,0 +1,56 @@ +namespace :after_party do + desc 'Deployment task: fix_published_revisions' + task fix_published_revisions: :environment do + puts "Running deploy task 'fix_published_revisions'" + + procedure_ids = Procedure + .with_discarded + .joins(:revisions) + .group('procedures.id') + .having('count(procedure_id) > 2') + .map(&:id) + + # Remove wrongfully created revisions. Every procedure should have only a draft revision + # and a published revision for published procedure + revisions = ProcedureRevision + .joins(:procedure) + .where(procedure_id: procedure_ids) + .where('procedure_revisions.id != procedures.draft_revision_id AND procedure_revisions.id != procedures.published_revision_id') + + dossiers = Dossier.with_discarded.joins(:procedure).where(revision_id: revisions) + progress = ProgressReport.new(dossiers.count) + dossiers.find_each do |dossier| + dossier.update_column(:revision_id, dossier.procedure.published_revision_id) + progress.inc + end + progress.finish + + types_de_champ = TypeDeChamp.joins(:procedure).where(revision_id: revisions) + progress = ProgressReport.new(types_de_champ.count) + types_de_champ.find_each do |type_de_champ| + type_de_champ.update_column(:revision_id, type_de_champ.procedure.published_revision_id) + progress.inc + end + progress.finish + + ProcedureRevisionTypeDeChamp.where(revision_id: revisions).delete_all + revisions.delete_all + + # Fill published_at column on all published revisions + published_revisions = ProcedureRevision + .joins(:procedure) + .where(published_at: nil) + .where('procedure_revisions.id = procedures.published_revision_id') + progress = ProgressReport.new(published_revisions.count) + published_revisions.find_each do |revision| + revision.update_column(:published_at, revision.procedure.published_at) + progress.inc + end + progress.finish + + # Update task as completed. If you remove the line below, the task will + # run with every deploy (or every time you call after_party:run). + AfterParty::TaskRecord + .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp + end +end diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index f4101ccc1..37045785a 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -625,6 +625,7 @@ describe Procedure do expect(procedure.draft_revision).not_to be_nil expect(procedure.revisions.count).to eq(2) expect(procedure.revisions).to eq([procedure.published_revision, procedure.draft_revision]) + expect(procedure.published_revision.published_at).to eq(now) end end @@ -649,12 +650,37 @@ describe Procedure do expect(procedure.canonical_procedure).to eq(canonical_procedure) expect(procedure.closed_at).to be_nil expect(procedure.published_at).to eq(now) + expect(procedure.published_revision.published_at).to eq(now) end it 'unpublishes parent procedure' do expect(parent_procedure.unpublished_at).to eq(now) end end + + context 'when republishing a previously closed procedure' do + let(:procedure) { create(:procedure, :published, administrateurs: [administrateur]) } + + before do + procedure.close! + Timecop.freeze(now) do + procedure.publish_or_reopen!(administrateur) + end + end + + it 'changes the procedure state to published' do + expect(procedure.closed_at).to be_nil + expect(procedure.published_at).to eq(now) + expect(procedure.published_revision.published_at).not_to eq(now) + end + + it "shouldn't create a new revision" do + expect(procedure.published_revision).not_to be_nil + expect(procedure.draft_revision).not_to be_nil + expect(procedure.revisions.count).to eq(2) + expect(procedure.revisions).to eq([procedure.published_revision, procedure.draft_revision]) + end + end end describe "#unpublish!" do