From 7ca71e3d5faf10e195dc07810ce959f20e878ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com> Date: Thu, 13 Jul 2023 12:38:29 +0200 Subject: [PATCH] fix duplication on contents --- app/models/communication/block/heading.rb | 6 ++++ app/models/concerns/with_duplication.rb | 38 ++++++++++++++++++----- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/app/models/communication/block/heading.rb b/app/models/communication/block/heading.rb index 186320adc..cbf44bb4f 100644 --- a/app/models/communication/block/heading.rb +++ b/app/models/communication/block/heading.rb @@ -54,6 +54,12 @@ class Communication::Block::Heading < ApplicationRecord [about] end + def duplicate + heading = self.dup + heading.save + heading + end + def translate!(about_translation, parent_id = nil) translation = self.dup translation.about = about_translation diff --git a/app/models/concerns/with_duplication.rb b/app/models/concerns/with_duplication.rb index 3285ff9a6..d83d03803 100644 --- a/app/models/concerns/with_duplication.rb +++ b/app/models/concerns/with_duplication.rb @@ -3,7 +3,7 @@ module WithDuplication def duplicate instance = duplicate_instance - duplicate_blocks_to(instance) + duplicate_contents_to(instance) duplicate_featured_image_to(instance) instance end @@ -18,13 +18,35 @@ module WithDuplication instance end - def duplicate_blocks_to(instance) - return unless respond_to?(:blocks) - blocks.ordered.each do |block| - b = block.duplicate - b.about = instance - b.position = block.position - b.save + def duplicate_contents_to(instance) + return unless respond_to?(:contents) + blocks.without_heading.ordered.each do |block| + duplicate_block(instance, block) + end + headings.root.ordered.each do |heading| + duplicate_heading(instance, heading) + end + end + + def duplicate_block(instance, block, heading_id = nil) + b = block.duplicate + b.about = instance + b.position = block.position + b.heading_id = heading_id + b.save + end + + def duplicate_heading(instance, heading, parent_id = nil) + h = heading.duplicate + h.about = instance + h.position = heading.position + h.save + + heading.blocks.ordered.each do |block| + duplicate_block(instance, block, h.id) + end + heading.children.ordered.each do |child| + duplicate_heading(instance, child, h.id) end end -- GitLab