From f4ba0ba54be6bac8ade8a1f9297da1f3330b3f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Wed, 9 Sep 2026 10:58:22 +0200 Subject: [PATCH 1/3] reset migration_identifier when duplicating + a bit of refactoring --- app/models/communication/block.rb | 15 ++++++--------- app/models/concerns/as_localization.rb | 2 ++ app/models/concerns/duplicable.rb | 11 +++-------- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb index 5a3d64f09..c519a2c0f 100644 --- a/app/models/communication/block.rb +++ b/app/models/communication/block.rb @@ -100,24 +100,21 @@ def language @language ||= about.language end - def duplicate + def duplicate(to: about, reset_position: true) block = self.dup + block.about = to + block.migration_identifier = nil + block.position = nil if reset_position block.save block end def paste(about) - block = self.dup - block.about = about - block.position = nil # Will be computed on save - block.save - block + duplicate(to: about) end def localize_for!(new_localization) - localized_block = self.dup - localized_block.about = new_localization - localized_block.save + duplicate(to: new_localization, reset_position: false) end def empty? diff --git a/app/models/concerns/as_localization.rb b/app/models/concerns/as_localization.rb index 44f0af926..cf57ee26c 100644 --- a/app/models/concerns/as_localization.rb +++ b/app/models/concerns/as_localization.rb @@ -47,6 +47,8 @@ def localize_in!(language) # Localized should not be published immediately l10n.published = false if respond_to?(:published) + l10n.migration_identifier = nil if respond_to?(:migration_identifier) + localize_other_attachments(l10n) # Blocks need an about, so we save before localizing blocks diff --git a/app/models/concerns/duplicable.rb b/app/models/concerns/duplicable.rb index 8363cc605..1f9252750 100644 --- a/app/models/concerns/duplicable.rb +++ b/app/models/concerns/duplicable.rb @@ -15,7 +15,7 @@ def duplicate def duplicate_blocks(from, to) return unless from.respond_to?(:blocks) from.blocks.ordered.each do |block| - duplicate_block(to, block) + block.duplicate(to: to) end end @@ -23,6 +23,7 @@ def duplicate_blocks(from, to) def duplicate_instance instance = self.dup + instance.migration_identifier = nil if instance.respond_to?(:migration_identifier) instance.position = nil if instance.respond_to?(:position) instance.save instance @@ -39,17 +40,11 @@ def duplicate_localizations_for(instance) instance_l10n.about = instance # note: fragile. It only works because every duplicate objects currently has a "title" property. instance_l10n.title = I18n.t('copy_of', title: l10n.title) + instance_l10n.migration_identifier = nil if instance_l10n.respond_to?(:migration_identifier) instance_l10n.published = false if instance_l10n.respond_to?(:published) instance_l10n.published_at = nil if instance_l10n.respond_to?(:published_at) instance_l10n.save duplicate_blocks(l10n, instance_l10n) end end - - def duplicate_block(instance, block) - duplicated_block = block.dup - duplicated_block.about = instance - duplicated_block.position = block.position - duplicated_block.save - end end From 55a3aa3b4e2c36154e70cf8f8ca8456d7f029e61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Fri, 11 Sep 2026 14:55:46 +0200 Subject: [PATCH 2/3] rename param --- app/controllers/admin/communication/blocks_controller.rb | 2 +- app/models/communication/block.rb | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/admin/communication/blocks_controller.rb b/app/controllers/admin/communication/blocks_controller.rb index a398ccd7d..0a0bb4c47 100644 --- a/app/controllers/admin/communication/blocks_controller.rb +++ b/app/controllers/admin/communication/blocks_controller.rb @@ -63,7 +63,7 @@ def update end def duplicate - @block = @block.duplicate + @block = @block.duplicate(keep_position: true) head :ok end diff --git a/app/models/communication/block.rb b/app/models/communication/block.rb index c519a2c0f..f56e46405 100644 --- a/app/models/communication/block.rb +++ b/app/models/communication/block.rb @@ -100,11 +100,11 @@ def language @language ||= about.language end - def duplicate(to: about, reset_position: true) + def duplicate(to: about, keep_position: false) block = self.dup block.about = to block.migration_identifier = nil - block.position = nil if reset_position + block.position = nil unless keep_position block.save block end @@ -114,7 +114,7 @@ def paste(about) end def localize_for!(new_localization) - duplicate(to: new_localization, reset_position: false) + duplicate(to: new_localization, keep_position: true) end def empty? From 640d38c40be52d5470b702fc953086a94910e2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= Date: Fri, 11 Sep 2026 15:02:37 +0200 Subject: [PATCH 3/3] keep position when duplicate instance with blocks --- app/models/concerns/duplicable.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/concerns/duplicable.rb b/app/models/concerns/duplicable.rb index 1f9252750..bd5549037 100644 --- a/app/models/concerns/duplicable.rb +++ b/app/models/concerns/duplicable.rb @@ -15,7 +15,7 @@ def duplicate def duplicate_blocks(from, to) return unless from.respond_to?(:blocks) from.blocks.ordered.each do |block| - block.duplicate(to: to) + block.duplicate(to: to, keep_position: true) end end