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