From 6adb3f7a3a44e96321f8c66b6a9276cfa6ca59ec Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 12 May 2022 09:26:43 +0200 Subject: [PATCH 1/2] fix(revision): fix migrate_parent! --- app/models/procedure.rb | 7 +++++++ app/models/procedure_revision.rb | 5 ++--- app/models/type_de_champ.rb | 15 +++++++++------ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 00854daca..a4a4d7a50 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -732,6 +732,13 @@ class Procedure < ApplicationRecord new_draft.revision_types_de_champ.reload + # Some revisions do not have links to children types de champ + new_draft + .types_de_champ + .filter(&:repetition?) + .flat_map(&:types_de_champ) + .each(&:migrate_parent!) + new_draft end diff --git a/app/models/procedure_revision.rb b/app/models/procedure_revision.rb index 46b85b1f5..37887fe17 100644 --- a/app/models/procedure_revision.rb +++ b/app/models/procedure_revision.rb @@ -381,13 +381,12 @@ class ProcedureRevision < ApplicationRecord end def revise_type_de_champ(type_de_champ) - types_de_champ_association = type_de_champ.private? ? :revision_types_de_champ_private : :revision_types_de_champ_public - association = send(types_de_champ_association).find_by!(type_de_champ: type_de_champ) + revision_type_de_champ = revision_types_de_champ.find_by!(type_de_champ: type_de_champ) cloned_type_de_champ = type_de_champ.deep_clone(include: [:types_de_champ]) do |original, kopy| PiecesJustificativesService.clone_attachments(original, kopy) end cloned_type_de_champ.revision = self - association.update!(type_de_champ: cloned_type_de_champ) + revision_type_de_champ.update!(type_de_champ: cloned_type_de_champ) cloned_type_de_champ.types_de_champ.each(&:migrate_parent!) cloned_type_de_champ end diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 5ec75a695..ec0cbeab5 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -18,6 +18,8 @@ # stable_id :bigint # class TypeDeChamp < ApplicationRecord + self.ignored_columns = [:migrated_parent] + enum type_champs: { text: 'text', textarea: 'textarea', @@ -394,12 +396,13 @@ class TypeDeChamp < ApplicationRecord end def migrate_parent! - if parent_id.present? && migrated_parent.nil? - ProcedureRevisionTypeDeChamp.create(parent: parent.revision_type_de_champ, - type_de_champ: self, - revision_id: parent.revision_type_de_champ.revision_id, - position: order_place) - update_column(:migrated_parent, true) + if parent_id.present? && revision_types_de_champ.empty? + parent.revision_types_de_champ.each do |revision_type_de_champ| + ProcedureRevisionTypeDeChamp.create(parent: revision_type_de_champ, + type_de_champ: self, + revision_id: revision_type_de_champ.revision_id, + position: order_place) + end end self end From f5a2747af721d911dd6a8d32d73f2fef172c5aea Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 12 May 2022 10:24:36 +0200 Subject: [PATCH 2/2] fix(revision): add fix_child_types_de_champ task to create join tables on repetition children --- ...220512072704_fix_child_types_de_champ.rake | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 lib/tasks/deployment/20220512072704_fix_child_types_de_champ.rake diff --git a/lib/tasks/deployment/20220512072704_fix_child_types_de_champ.rake b/lib/tasks/deployment/20220512072704_fix_child_types_de_champ.rake new file mode 100644 index 000000000..54fdd7755 --- /dev/null +++ b/lib/tasks/deployment/20220512072704_fix_child_types_de_champ.rake @@ -0,0 +1,46 @@ +namespace :after_party do + desc 'Deployment task: fix_child_types_de_champ' + task fix_child_types_de_champ: :environment do + puts "Running deploy task 'fix_child_types_de_champ'" + + children = TypeDeChamp.where.not(parent_id: nil).where.missing(:revision_types_de_champ).includes(parent: :revision_types_de_champ) + progress = ProgressReport.new(children.count) + + children.find_each do |type_de_champ| + type_de_champ.parent.revision_types_de_champ.each do |revision_type_de_champ| + ProcedureRevisionTypeDeChamp.create(parent: revision_type_de_champ, + type_de_champ: type_de_champ, + revision_id: revision_type_de_champ.revision_id, + position: type_de_champ.order_place) + end + progress.inc + end + progress.finish + + children = TypeDeChamp.where.not(parent_id: nil).includes(:revision_types_de_champ, parent: :revision_types_de_champ) + progress = ProgressReport.new(children.count) + + children.find_each do |type_de_champ| + prtdcs = type_de_champ.parent.revision_types_de_champ + rtdcs = type_de_champ.revision_types_de_champ + + if prtdcs.size > rtdcs.size + missing_rtdcs = prtdcs.filter { |prtdc| !prtdc.revision_id.in?(rtdcs.map(&:revision_id)) } + + missing_rtdcs.each do |revision_type_de_champ| + ProcedureRevisionTypeDeChamp.create(parent: revision_type_de_champ, + type_de_champ: type_de_champ, + revision_id: revision_type_de_champ.revision_id, + position: type_de_champ.order_place) + end + end + 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