From 3ea241370d2be7c8277b9d5fac9150ba678f48f2 Mon Sep 17 00:00:00 2001
From: Sage Abdullah <sage.abdullah@torchbox.com>
Date: Mon, 16 Dec 2024 16:38:37 +0000
Subject: [PATCH] Store block definitions in Block.definition_registry

---
 wagtail/blocks/base.py       |  2 ++
 wagtail/tests/test_blocks.py | 12 ++++++++++++
 2 files changed, 14 insertions(+)

diff --git a/wagtail/blocks/base.py b/wagtail/blocks/base.py
index a4df2d3a19..bbf184f9d8 100644
--- a/wagtail/blocks/base.py
+++ b/wagtail/blocks/base.py
@@ -55,6 +55,7 @@ class BaseBlock(type):
 class Block(metaclass=BaseBlock):
     name = ""
     creation_counter = 0
+    definition_registry = {}
 
     TEMPLATE_VAR = "value"
 
@@ -94,6 +95,7 @@ class Block(metaclass=BaseBlock):
         self.creation_counter = Block.creation_counter
         Block.creation_counter += 1
         self.definition_prefix = "blockdef-%d" % self.creation_counter
+        Block.definition_registry[self.definition_prefix] = self
 
         self.label = self.meta.label or ""
 
diff --git a/wagtail/tests/test_blocks.py b/wagtail/tests/test_blocks.py
index c6dfe0f0e2..c8032c9c9d 100644
--- a/wagtail/tests/test_blocks.py
+++ b/wagtail/tests/test_blocks.py
@@ -57,6 +57,11 @@ class TestBlock(SimpleTestCase):
         obj = object()
         self.assertIs(blocks.Block().normalize(obj), obj)
 
+    def test_block_definition_registry(self):
+        """Instantiating a Block should register it in the definition registry"""
+        block = blocks.Block()
+        self.assertIs(blocks.Block.definition_registry[block.definition_prefix], block)
+
 
 class TestFieldBlock(WagtailTestUtils, SimpleTestCase):
     def test_charfield_render(self):
@@ -65,6 +70,13 @@ class TestFieldBlock(WagtailTestUtils, SimpleTestCase):
 
         self.assertEqual(html, "Hello world!")
 
+    def test_block_definition_registry(self):
+        block = blocks.CharBlock(label="Test block")
+        registered_block = blocks.Block.definition_registry[block.definition_prefix]
+        self.assertIsInstance(registered_block, blocks.CharBlock)
+        self.assertEqual(registered_block.meta.label, "Test block")
+        self.assertIs(registered_block, block)
+
     def test_charfield_render_with_template(self):
         block = blocks.CharBlock(template="tests/blocks/heading_block.html")
         html = block.render("Hello world!")