From fee65a93458b0c4b0b68dfefade13fda9c6291cb Mon Sep 17 00:00:00 2001
From: Daniel <danthedeckie@users.noreply.github.com>
Date: Tue, 22 Jun 2021 13:33:31 +0100
Subject: [PATCH] Preserve `features` & `editor` kwargs on
 RichTextField.clone() (#7272)

---
 CHANGELOG.txt          |  1 +
 docs/releases/2.14.rst |  1 +
 wagtail/core/fields.py | 11 ++++++++++-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index eda5ecdc4e..f4e85bb849 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -28,6 +28,7 @@ Changelog
  * Fix: Respect cache_age parameters on embeds (Gordon Pendleton)
  * Fix: Page comparison view now reflects request-level customisations to edit handlers (Matt Westcott)
  * Fix: Add `block.super` to remaining `extra_js` & `extra_css` blocks (Andrew Stone)
+ * Fix: Ensure that `editor` and `features` arguments on RichTextField are preserved by `clone()` (Daniel)
 
 
 2.13.3 (05.07.2021)
diff --git a/docs/releases/2.14.rst b/docs/releases/2.14.rst
index 4352c20e64..47dbf965b4 100644
--- a/docs/releases/2.14.rst
+++ b/docs/releases/2.14.rst
@@ -39,6 +39,7 @@ Bug fixes
  * Respect cache_age parameters on embeds (Gordon Pendleton)
  * Page comparison view now reflects request-level customisations to edit handlers (Matt Westcott)
  * Add ``block.super`` to remaining ``extra_js`` & ``extra_css`` blocks (Andrew Stone)
+ * Ensure that ``editor`` and ``features`` arguments on RichTextField are preserved by ``clone()`` (Daniel)
 
 Upgrade considerations
 ======================
diff --git a/wagtail/core/fields.py b/wagtail/core/fields.py
index cc9477d55c..63ce609bbb 100644
--- a/wagtail/core/fields.py
+++ b/wagtail/core/fields.py
@@ -10,11 +10,20 @@ from wagtail.core.rich_text import get_text_for_indexing
 
 class RichTextField(models.TextField):
     def __init__(self, *args, **kwargs):
+        # 'editor' and 'features' are popped before super().__init__ has chance to capture them
+        # for use in deconstruct(). This is intentional - they would not be useful in migrations
+        # and retrospectively adding them would generate unwanted migration noise
         self.editor = kwargs.pop('editor', 'default')
         self.features = kwargs.pop('features', None)
-        # TODO: preserve 'editor' and 'features' when deconstructing for migrations
         super().__init__(*args, **kwargs)
 
+    def clone(self):
+        name, path, args, kwargs = self.deconstruct()
+        # add back the 'features' and 'editor' kwargs that were not preserved by deconstruct()
+        kwargs["features"] = self.features
+        kwargs["editor"] = self.editor
+        return self.__class__(*args, **kwargs)
+
     def formfield(self, **kwargs):
         from wagtail.admin.rich_text import get_rich_text_editor_widget
         defaults = {'widget': get_rich_text_editor_widget(self.editor, features=self.features)}