wagtail 6.3.2__py3-none-any.whl → 6.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- .c-sf-add-button{align-items:center;-webkit-appearance:none;appearance:none;background-color:var(--w-color-surface-page);color:var(--w-color-text-button-outline-default);cursor:pointer;display:grid;height:1.5rem;justify-content:center;margin-inline-start:calc(-1px + -.25rem);padding:0;width:1.5rem}.c-sf-add-button .icon{border:1px solid;border-radius:100%;height:1rem;padding:.125rem;transition:transform .3s ease;width:1rem}.c-sf-add-button[aria-expanded=true] .icon{transform:rotate(45deg)}.c-sf-add-button:focus-visible .icon,.c-sf-add-button:hover .icon{background-color:var(--w-color-text-button-outline-hover);color:var(--w-color-surface-page)}.c-sf-add-button[disabled]{opacity:.2}@media (forced-colors:active){.c-sf-add-button[disabled]{color:GrayText}}[aria-expanded=true]+.w-panel__heading .c-sf-block__title{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}[aria-expanded=false]+.w-panel__heading .c-sf-block__title:not(:empty)+.c-sf-block__type{display:none}.c-sf-help .help{margin-bottom:1.5rem;margin-top:0}
1
+ .c-sf-add-button{align-items:center;-webkit-appearance:none;appearance:none;background-color:var(--w-color-surface-page);color:var(--w-color-text-button-outline-default);cursor:pointer;display:grid;height:1.5rem;justify-content:center;margin-inline-start:calc(-1px + -.25rem);padding:0;width:1.5rem}.c-sf-add-button .icon{border:1px solid;border-radius:100%;height:1rem;padding:.125rem;transition:transform .3s ease;width:1rem}.c-sf-add-button[aria-expanded=true] .icon{transform:rotate(45deg)}.c-sf-add-button:focus-visible .icon,.c-sf-add-button:hover .icon{background-color:var(--w-color-text-button-outline-hover);color:var(--w-color-surface-page)}.c-sf-add-button[disabled]{opacity:.2}@media (forced-colors:active){.c-sf-add-button[disabled]{color:GrayText}}[aria-expanded=true]+.w-panel__heading .c-sf-block__title{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}[aria-expanded=false]+.w-panel__heading .c-sf-block__title:not(:empty)+.c-sf-block__type{display:none}.c-sf-help .help{margin-bottom:1rem;margin-top:0}
wagtail/admin/userbar.py CHANGED
@@ -55,6 +55,7 @@ class AccessibilityItem(BaseItem):
55
55
  "input-button-name",
56
56
  "link-name",
57
57
  "p-as-heading",
58
+ "alt-text-quality",
58
59
  ]
59
60
 
60
61
  #: A dictionary that maps axe-core rule IDs to a dictionary of rule options,
@@ -153,29 +153,29 @@ class StreamChildrenToListBlockOperation(BaseBlockOperation):
153
153
  super().__init__()
154
154
  self.block_name = block_name
155
155
  self.list_block_name = list_block_name
156
- self.temp_blocks = []
157
156
 
158
157
  def apply(self, block_value):
158
+ candidate_blocks = []
159
159
  mapped_block_value = []
160
160
  for child_block in block_value:
161
161
  if child_block["type"] == self.block_name:
162
- self.temp_blocks.append(child_block)
162
+ candidate_blocks.append(child_block)
163
163
  else:
164
164
  mapped_block_value.append(child_block)
165
165
 
166
- self.map_temp_blocks_to_list_items()
166
+ list_items = self.map_temp_blocks_to_list_items(candidate_blocks)
167
167
 
168
- if self.temp_blocks:
169
- new_list_block = {"type": self.list_block_name, "value": self.temp_blocks}
168
+ if list_items:
169
+ new_list_block = {"type": self.list_block_name, "value": list_items}
170
170
  mapped_block_value.append(new_list_block)
171
171
 
172
172
  return mapped_block_value
173
173
 
174
- def map_temp_blocks_to_list_items(self):
175
- new_temp_blocks = []
176
- for block in self.temp_blocks:
177
- new_temp_blocks.append({**block, "type": "item"})
178
- self.temp_blocks = new_temp_blocks
174
+ def map_temp_blocks_to_list_items(self, blocks):
175
+ list_items = []
176
+ for block in blocks:
177
+ list_items.append({**block, "type": "item"})
178
+ return list_items
179
179
 
180
180
  @property
181
181
  def operation_name_fragment(self):
@@ -710,7 +710,7 @@ class StreamValue(MutableSequence):
710
710
  raw_values = OrderedDict(
711
711
  (i, raw_item["value"])
712
712
  for i, raw_item in enumerate(self._raw_data)
713
- if raw_item["type"] == type_name and self._bound_blocks[i] is None
713
+ if self._bound_blocks[i] is None and raw_item["type"] == type_name
714
714
  )
715
715
  # pass the raw block values to bulk_to_python as a list
716
716
  converted_values = child_block.bulk_to_python(raw_values.values())
@@ -603,11 +603,13 @@ class TestFormPageWithCustomFormBuilder(WagtailTestUtils, TestCase):
603
603
  html=True,
604
604
  )
605
605
  # check ip address field has rendered
606
- self.assertContains(
607
- response,
608
- '<input type="text" name="device_ip_address" required id="id_device_ip_address" />',
609
- html=True,
610
- )
606
+ # (not comparing HTML directly because https://docs.djangoproject.com/en/5.1/releases/5.1.5/
607
+ # added a maxlength attribute)
608
+ soup = self.get_soup(response.content)
609
+ input = soup.find("input", {"name": "device_ip_address"})
610
+ self.assertEqual(input["type"], "text")
611
+ self.assertEqual(input["required"], "")
612
+ self.assertEqual(input["id"], "id_device_ip_address")
611
613
 
612
614
  def test_post_invalid_form(self):
613
615
  response = self.client.post(
@@ -1,3 +1,4 @@
1
+ import re
1
2
  import warnings
2
3
  from collections import OrderedDict
3
4
 
@@ -336,9 +337,12 @@ class MySQLSearchQueryCompiler(BaseSearchQueryCompiler):
336
337
 
337
338
  def build_search_query_content(self, query, invert=False):
338
339
  if isinstance(query, PlainText):
339
- terms = query.query_string.split()
340
+ # For Boolean full text search queries in MySQL,
341
+ # non-alphanumeric characters act as separators
342
+ terms = [term for term in re.split(r"\W+", query.query_string) if term]
343
+
340
344
  if not terms:
341
- return None
345
+ return SearchQuery("")
342
346
 
343
347
  last_term = terms.pop()
344
348
 
@@ -68,6 +68,81 @@ class TestMySQLSearchBackend(BackendTests, TransactionTestCase):
68
68
  all_other_titles | {"JavaScript: The Definitive Guide"},
69
69
  )
70
70
 
71
+ def test_empty_search(self):
72
+ results = self.backend.search("", models.Book.objects.all())
73
+ self.assertSetEqual(
74
+ {r.title for r in results},
75
+ set(),
76
+ )
77
+
78
+ results = self.backend.search(" ", models.Book.objects.all())
79
+ self.assertSetEqual(
80
+ {r.title for r in results},
81
+ set(),
82
+ )
83
+
84
+ results = self.backend.search("*", models.Book.objects.all())
85
+ self.assertSetEqual(
86
+ {r.title for r in results},
87
+ set(),
88
+ )
89
+
90
+ def test_empty_autocomplete(self):
91
+ results = self.backend.autocomplete("", models.Book.objects.all())
92
+ self.assertSetEqual(
93
+ {r.title for r in results},
94
+ set(),
95
+ )
96
+
97
+ results = self.backend.autocomplete(" ", models.Book.objects.all())
98
+ self.assertSetEqual(
99
+ {r.title for r in results},
100
+ set(),
101
+ )
102
+
103
+ results = self.backend.autocomplete("*", models.Book.objects.all())
104
+ self.assertSetEqual(
105
+ {r.title for r in results},
106
+ set(),
107
+ )
108
+
109
+ def test_symbols_in_search_term(self):
110
+ # symbols as their own tokens should be ignored
111
+ results = self.backend.search("javascript @ parts", models.Book.objects.all())
112
+ self.assertSetEqual(
113
+ {r.title for r in results},
114
+ {"JavaScript: The good parts"},
115
+ )
116
+
117
+ results = self.backend.search("javascript parts @", models.Book.objects.all())
118
+ self.assertSetEqual(
119
+ {r.title for r in results},
120
+ {"JavaScript: The good parts"},
121
+ )
122
+
123
+ results = self.backend.search("@ javascript parts", models.Book.objects.all())
124
+ self.assertSetEqual(
125
+ {r.title for r in results},
126
+ {"JavaScript: The good parts"},
127
+ )
128
+
129
+ # tokens containing both symbols and alphanumerics should not be discarded
130
+ # or treated as equivalent to the same token without symbols
131
+ results = self.backend.search("java@script parts", models.Book.objects.all())
132
+ self.assertSetEqual(
133
+ {r.title for r in results},
134
+ set(),
135
+ )
136
+
137
+ def test_autocomplete_with_symbols(self):
138
+ # the * is not part of the autocomplete mechanism, but if someone includes it
139
+ # we want it to be gracefully ignored
140
+ results = self.backend.autocomplete("parts javasc*", models.Book.objects.all())
141
+ self.assertSetEqual(
142
+ {r.title for r in results},
143
+ {"JavaScript: The good parts"},
144
+ )
145
+
71
146
  @skip(
72
147
  "The MySQL backend doesn't support choosing individual fields for the search, only (body, title) or (autocomplete) fields may be searched."
73
148
  )
@@ -7,3 +7,13 @@ class WagtailSnippetsTestsAppConfig(AppConfig):
7
7
  name = "wagtail.test.snippets"
8
8
  label = "snippetstests"
9
9
  verbose_name = _("Wagtail snippets tests")
10
+
11
+ def ready(self):
12
+ # Test registration of permission order within the group permissions view,
13
+ # as per https://docs.wagtail.org/en/stable/extending/customizing_group_views.html#customizing-the-group-editor-permissions-ordering
14
+ # Invoking `register` from `ready` confirms that it does not perform any database queries -
15
+ # if it did, it would fail (on a standard test run without --keepdb at least) because the
16
+ # test database hasn't been migrated yet.
17
+ from wagtail.users.permission_order import register
18
+
19
+ register("snippetstests.fancysnippet", order=999)
@@ -10,7 +10,7 @@ class MigrationTestMixin:
10
10
  default_operation_and_block_path = []
11
11
  app_name = None
12
12
 
13
- def init_migration(self, revisions_from=None, operations_and_block_path=None):
13
+ def init_migration(self, revisions_from=None, operations_and_block_paths=None):
14
14
  migration = Migration(
15
15
  "test_migration", "wagtail_streamfield_migration_toolkit_test"
16
16
  )
@@ -18,7 +18,7 @@ class MigrationTestMixin:
18
18
  app_name=self.app_name,
19
19
  model_name=self.model.__name__,
20
20
  field_name="content",
21
- operations_and_block_paths=operations_and_block_path
21
+ operations_and_block_paths=operations_and_block_paths
22
22
  or self.default_operation_and_block_path,
23
23
  revisions_from=revisions_from,
24
24
  )
@@ -29,11 +29,11 @@ class MigrationTestMixin:
29
29
  def apply_migration(
30
30
  self,
31
31
  revisions_from=None,
32
- operations_and_block_path=None,
32
+ operations_and_block_paths=None,
33
33
  ):
34
34
  migration = self.init_migration(
35
35
  revisions_from=revisions_from,
36
- operations_and_block_path=operations_and_block_path,
36
+ operations_and_block_paths=operations_and_block_paths,
37
37
  )
38
38
 
39
39
  loader = MigrationLoader(connection=connection)
@@ -13,35 +13,35 @@ class MigrationNameTest(TestCase, MigrationTestMixin):
13
13
  app_name = "wagtail_streamfield_migration_toolkit_test"
14
14
 
15
15
  def test_rename(self):
16
- operations_and_block_path = [
16
+ operations_and_block_paths = [
17
17
  (
18
18
  RenameStreamChildrenOperation(old_name="char1", new_name="renamed1"),
19
19
  "",
20
20
  )
21
21
  ]
22
22
  migration = self.init_migration(
23
- operations_and_block_path=operations_and_block_path
23
+ operations_and_block_paths=operations_and_block_paths
24
24
  )
25
25
 
26
26
  suggested_name = migration.suggest_name()
27
27
  self.assertEqual(suggested_name, "rename_char1_to_renamed1")
28
28
 
29
29
  def test_remove(self):
30
- operations_and_block_path = [
30
+ operations_and_block_paths = [
31
31
  (
32
32
  RemoveStreamChildrenOperation(name="char1"),
33
33
  "",
34
34
  )
35
35
  ]
36
36
  migration = self.init_migration(
37
- operations_and_block_path=operations_and_block_path
37
+ operations_and_block_paths=operations_and_block_paths
38
38
  )
39
39
 
40
40
  suggested_name = migration.suggest_name()
41
41
  self.assertEqual(suggested_name, "remove_char1")
42
42
 
43
43
  def test_multiple(self):
44
- operations_and_block_path = [
44
+ operations_and_block_paths = [
45
45
  (
46
46
  RenameStreamChildrenOperation(old_name="char1", new_name="renamed1"),
47
47
  "",
@@ -52,7 +52,7 @@ class MigrationNameTest(TestCase, MigrationTestMixin):
52
52
  ),
53
53
  ]
54
54
  migration = self.init_migration(
55
- operations_and_block_path=operations_and_block_path
55
+ operations_and_block_paths=operations_and_block_paths
56
56
  )
57
57
 
58
58
  suggested_name = migration.suggest_name()
@@ -7,7 +7,10 @@ from django.db.models.functions import Cast
7
7
  from django.test import TestCase
8
8
  from django.utils import timezone
9
9
 
10
- from wagtail.blocks.migrations.operations import RenameStreamChildrenOperation
10
+ from wagtail.blocks.migrations.operations import (
11
+ RenameStreamChildrenOperation,
12
+ StreamChildrenToListBlockOperation,
13
+ )
11
14
  from wagtail.test.streamfield_migrations import factories, models
12
15
  from wagtail.test.streamfield_migrations.testutils import MigrationTestMixin
13
16
 
@@ -250,3 +253,45 @@ class TestNullStreamField(BaseMigrationTest):
250
253
  self.assert_null_content()
251
254
  self.apply_migration()
252
255
  self.assert_null_content()
256
+
257
+
258
+ class StreamChildrenToListBlockOperationTestCase(BaseMigrationTest):
259
+ model = models.SamplePage
260
+ factory = factories.SamplePageFactory
261
+ has_revisions = True
262
+ app_name = "streamfield_migration_tests"
263
+
264
+ def _get_test_instances(self):
265
+ return self.factory.create_batch(
266
+ size=3,
267
+ # Each content stream field has a single char block instance.
268
+ content__0__char1__value="Char Block 1",
269
+ )
270
+
271
+ def test_state_not_shared_across_instances(self):
272
+ """
273
+ StreamChildrenToListBlockOperation doesn't share state across model instances.
274
+
275
+ As a single operation instance is used to transform the data of multiple model
276
+ instances, we should not store model instance state on the operation instance.
277
+ See https://github.com/wagtail/wagtail/issues/12391.
278
+ """
279
+
280
+ self.apply_migration(
281
+ operations_and_block_paths=[
282
+ (
283
+ StreamChildrenToListBlockOperation(
284
+ block_name="char1", list_block_name="list1"
285
+ ),
286
+ "",
287
+ )
288
+ ]
289
+ )
290
+ for instance in self.model.objects.all().annotate(
291
+ raw_content=Cast(F("content"), JSONField())
292
+ ):
293
+ new_block = instance.raw_content[0]
294
+ self.assertEqual(new_block["type"], "list1")
295
+ self.assertEqual(len(new_block["value"]), 1)
296
+ self.assertEqual(new_block["value"][0]["type"], "item")
297
+ self.assertEqual(new_block["value"][0]["value"], "Char Block 1")
@@ -237,6 +237,24 @@ class TestStreamValueAccess(TestCase):
237
237
  self.assertEqual(fetched_body[1].block_type, "text")
238
238
  self.assertEqual(fetched_body[1].value, "bar")
239
239
 
240
+ def test_can_append_on_queried_instance(self):
241
+ # The test is analog to test_can_append(), but instead of working with the
242
+ # in-memory version from JSONStreamModel.objects.create(), we query a fresh
243
+ # instance from the db.
244
+ # It tests adding data to child blocks that
245
+ # have not yet been lazy loaded. This would previously crash.
246
+ self.json_body = JSONStreamModel.objects.get(pk=self.json_body.pk)
247
+ self.json_body.body.append(("text", "bar"))
248
+ self.json_body.save()
249
+
250
+ fetched_body = JSONStreamModel.objects.get(id=self.json_body.id).body
251
+ self.assertIsInstance(fetched_body, StreamValue)
252
+ self.assertEqual(len(fetched_body), 2)
253
+ self.assertEqual(fetched_body[0].block_type, "text")
254
+ self.assertEqual(fetched_body[0].value, "foo")
255
+ self.assertEqual(fetched_body[1].block_type, "text")
256
+ self.assertEqual(fetched_body[1].value, "bar")
257
+
240
258
  def test_complex_assignment(self):
241
259
  page = StreamPage(title="Test page", body=[])
242
260
  page.body = [
@@ -2,6 +2,7 @@ from django.contrib.contenttypes.models import ContentType
2
2
 
3
3
  from wagtail.coreutils import resolve_model_string
4
4
 
5
+ content_types_to_register = []
5
6
  CONTENT_TYPE_ORDER = {}
6
7
 
7
8
 
@@ -13,5 +14,18 @@ def register(model, **kwargs):
13
14
  """
14
15
  order = kwargs.pop("order", None)
15
16
  if order is not None:
16
- content_type = ContentType.objects.get_for_model(resolve_model_string(model))
17
- CONTENT_TYPE_ORDER[content_type.id] = order
17
+ # We typically call this at application startup, when the database may not be ready,
18
+ # and so we can't look up the content type yet. Instead we will queue up the
19
+ # (model, order) pair to be processed when the lookup is requested.
20
+ content_types_to_register.append((model, order))
21
+
22
+
23
+ def get_content_type_order_lookup():
24
+ if content_types_to_register:
25
+ for model, order in content_types_to_register:
26
+ content_type = ContentType.objects.get_for_model(
27
+ resolve_model_string(model)
28
+ )
29
+ CONTENT_TYPE_ORDER[content_type.id] = order
30
+ content_types_to_register.clear()
31
+ return CONTENT_TYPE_ORDER
@@ -11,7 +11,7 @@ from django.utils.translation import gettext_noop
11
11
  from wagtail import hooks
12
12
  from wagtail.admin.models import Admin
13
13
  from wagtail.coreutils import accepts_kwarg
14
- from wagtail.users.permission_order import CONTENT_TYPE_ORDER
14
+ from wagtail.users.permission_order import get_content_type_order_lookup
15
15
  from wagtail.utils.deprecation import RemovedInWagtail70Warning
16
16
 
17
17
  register = template.Library()
@@ -96,9 +96,10 @@ def format_permissions(permission_bound_field):
96
96
  # get a distinct and ordered list of the content types that these permissions relate to.
97
97
  # relies on Permission model default ordering, dict.fromkeys() retaining that order
98
98
  # from the queryset, and the stability of sorted().
99
+ content_type_order = get_content_type_order_lookup()
99
100
  content_type_ids = sorted(
100
101
  dict.fromkeys(permissions.values_list("content_type_id", flat=True)),
101
- key=lambda ct: CONTENT_TYPE_ORDER.get(ct, float("inf")),
102
+ key=lambda ct: content_type_order.get(ct, float("inf")),
102
103
  )
103
104
 
104
105
  # iterate over permission_bound_field to build a lookup of individual renderable
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wagtail
3
- Version: 6.3.2
3
+ Version: 6.3.3
4
4
  Summary: A Django content management system.
5
5
  Home-page: https://wagtail.org/
6
6
  Author: Wagtail core team + contributors
@@ -1,4 +1,4 @@
1
- wagtail/__init__.py,sha256=0g5ZbG1T5OHrwqo0cvjWkQjCdWGxl4w1phQ-1f40H6A,724
1
+ wagtail/__init__.py,sha256=iPUJo4Z0gCm0DGzRtMq9i10svLFA31wPWOz60HwDGxI,724
2
2
  wagtail/apps.py,sha256=38kXTdHoQzFnpUqDNxFpsqn2dut4V0u9rLOkhqCoYkc,713
3
3
  wagtail/compat.py,sha256=L41FhlX4xy5KgTdJ63smtM78mtKf1mxkPeOs8kyOwS0,538
4
4
  wagtail/coreutils.py,sha256=8wQC7LCRJ3dCILhpAsODCDCxlU0x--6UXDVX4Tx3gnQ,20417
@@ -57,7 +57,7 @@ wagtail/admin/signal_handlers.py,sha256=6Imw1y8vZELbY2zBU3Qgh_cq_7jtVB6D2wKSQcby
57
57
  wagtail/admin/signals.py,sha256=djlHZoicrQn3eboStcY_0YXBGTNojfhlkccLiBWLdQ8,91
58
58
  wagtail/admin/site_summary.py,sha256=G059iQp4qWWONWYooqsU2Zz5_PQqvPEE64mro7S7fPU,2510
59
59
  wagtail/admin/staticfiles.py,sha256=S5wGUE4Sn8PxzJjxtwb2b0rHTugZufycASrOx1L5v3E,2755
60
- wagtail/admin/userbar.py,sha256=XwULMD4MIdW54IOyilpJuyQYrAF1n5kvgamUnbMF69Y,11466
60
+ wagtail/admin/userbar.py,sha256=hNI_pUaeqNvU1cj_S7A131hBkvI-BAODpXZ5GR0FZJ4,11494
61
61
  wagtail/admin/utils.py,sha256=MNOP2tTemplKk_yc5KqmGya_rKpZOXu85dXMfDOgEU0,2463
62
62
  wagtail/admin/wagtail_hooks.py,sha256=8CaPiPkCZ1IFqDc_eMhObvawSbjBALDpEsKPVNgfIXI,34865
63
63
  wagtail/admin/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -356,11 +356,11 @@ wagtail/admin/rich_text/converters/html_to_contentstate.py,sha256=W0l9O-ZpxJkzRF
356
356
  wagtail/admin/rich_text/editors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
357
357
  wagtail/admin/rich_text/editors/draftail/__init__.py,sha256=IsmQYvx0YQuhiW_KqXq07iXPZg63NV1VOwXBL6f8TUY,3594
358
358
  wagtail/admin/rich_text/editors/draftail/features.py,sha256=X3LZhvlSqQA9GTXAdKi0PthdiIxL-InuiuLl_1AdVns,2593
359
- wagtail/admin/static/wagtailadmin/css/core.css,sha256=MD7I20CypvDgkj4Ba5mzluYZDBXliBwhY0O7qPK6-fY,276097
359
+ wagtail/admin/static/wagtailadmin/css/core.css,sha256=YYwV7bElbqjbI0HnTNw_Qg9wyUZ3DvnuOK_flB6SHp0,275995
360
360
  wagtail/admin/static/wagtailadmin/css/core.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
361
361
  wagtail/admin/static/wagtailadmin/css/panels/draftail.css,sha256=y7FM00LtDC9CZ_9V4XySg04pXty5obRipdSw7YRT0YM,24614
362
362
  wagtail/admin/static/wagtailadmin/css/panels/draftail.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
363
- wagtail/admin/static/wagtailadmin/css/panels/streamfield.css,sha256=9mGfDkIshDvmQBLU38LyHsPPX1tb8FGjgfijvzpW1Xo,1105
363
+ wagtail/admin/static/wagtailadmin/css/panels/streamfield.css,sha256=1FUHo5_4jbPKWkX0IuIcAHcY4AcCOk7NU5uxsTo92ps,1103
364
364
  wagtail/admin/static/wagtailadmin/css/panels/streamfield.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
365
365
  wagtail/admin/static/wagtailadmin/images/bg-body.svg,sha256=ItjdKoDT8NuLpaDbK2Jp7jBPVr5eRUzDXn30XYcEN5A,705
366
366
  wagtail/admin/static/wagtailadmin/images/bg-dark-diag.svg,sha256=fF0yY-DqxACQIGjzQpFafxjZ78OwctSCJ9OxzcCXYHA,700
@@ -1042,11 +1042,11 @@ wagtail/blocks/definition_lookup.py,sha256=JkSwFcqEkavq-M6kWNfeDZtvIXnQJ58QT2Fea
1042
1042
  wagtail/blocks/field_block.py,sha256=rKXfquVsRbA80GnXQvgRI8mtYZ4t7eKRCqaSCpeOS94,32414
1043
1043
  wagtail/blocks/list_block.py,sha256=TJgxmUvTnQrnwk-celA2T5zGSa-NedVvr7WzGsweDRo,18289
1044
1044
  wagtail/blocks/static_block.py,sha256=tKkU0hENu_fzHC9xiZ3p9c9drP7-TDogn9r8j0E-nLk,1748
1045
- wagtail/blocks/stream_block.py,sha256=gL18S1svXTdeoO8esQos7WF-L0Ps8px405BgpsZcack,32291
1045
+ wagtail/blocks/stream_block.py,sha256=amEWzaq4oiOUVf0Y2VRIfXhsDnRzd9hHBYhx-4SW8nE,32291
1046
1046
  wagtail/blocks/struct_block.py,sha256=u-etS4B5ONd6_gYbL-F8XX3l_RY3zPMMsrxSTLXMOIs,15988
1047
1047
  wagtail/blocks/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1048
1048
  wagtail/blocks/migrations/migrate_operation.py,sha256=2yCTGHiQHoaaQEHpqpnHZ4ouPvstUgMlm8iixancOdg,14288
1049
- wagtail/blocks/migrations/operations.py,sha256=lAWOqtG81xNkGgMr0LYVLY6FC2zEBvN9EvJIu1wLhD4,10594
1049
+ wagtail/blocks/migrations/operations.py,sha256=rUmr3FNazwgDt7c5xEu9YvHLOLgstS5tedxLHmk3sNo,10582
1050
1050
  wagtail/blocks/migrations/utils.py,sha256=dk09vGBYRb-3sGPkFeWR5rxrboVgnlAlk6OGE4tqo2I,9544
1051
1051
  wagtail/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1052
1052
  wagtail/contrib/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1189,7 +1189,7 @@ wagtail/contrib/forms/templates/wagtailforms/submissions_index.html,sha256=Ai7nx
1189
1189
  wagtail/contrib/forms/templates/wagtailforms/panels/form_responses_panel.html,sha256=HDBxyln4yWD2DTsuCRwjUKHwLrzwsP1y13mRmvZF5R8,358
1190
1190
  wagtail/contrib/forms/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1191
1191
  wagtail/contrib/forms/tests/test_forms.py,sha256=7tRUwJA2j9xzr28NpRC9hDYeOEfR1VTmBCPlny7UPVw,13634
1192
- wagtail/contrib/forms/tests/test_models.py,sha256=OLm-1iNymROzG8QeYCzHSqCrhVBqBZIVgml5HaaZ2II,32235
1192
+ wagtail/contrib/forms/tests/test_models.py,sha256=lcifi_nJHHD9toYVtIY3P-zh-rdCTsLQTgxvAyFKbMM,32465
1193
1193
  wagtail/contrib/forms/tests/test_views.py,sha256=g213EeJKrWEF7_DPCnTxFvN8SYCCjcOQkGoM2d9iaWw,81552
1194
1194
  wagtail/contrib/forms/tests/utils.py,sha256=OESefxdqGRgL1lDItVPSFNw_FJNB4X0PvozdvAhrpkc,6043
1195
1195
  wagtail/contrib/frontend_cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -3109,7 +3109,7 @@ wagtail/search/backends/elasticsearch8.py,sha256=n3y05d_atzbnkaM4F1BXp3OhayE-J6u
3109
3109
  wagtail/search/backends/database/__init__.py,sha256=u8dKGRONweefcHoIlCIJgxpU5DgWAARDz1sefSUq-Rw,1727
3110
3110
  wagtail/search/backends/database/fallback.py,sha256=fBa63S05v_deEqwPMTOU3qRjJ7U7Db6D0_OIZuwwrIs,7774
3111
3111
  wagtail/search/backends/database/mysql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3112
- wagtail/search/backends/database/mysql/mysql.py,sha256=8KYQdjyA0j8IbJ7klwJqf74JlVu9YYAz2PoZuEwLRfY,23312
3112
+ wagtail/search/backends/database/mysql/mysql.py,sha256=XYxdGN15rQriaTZXRcKwzCVhiqveoGXGpKygGozqhGs,23492
3113
3113
  wagtail/search/backends/database/mysql/query.py,sha256=7MsnRParQkRhwa4LMehuYrXjvBJVAoV12TGyKnFHn0U,9692
3114
3114
  wagtail/search/backends/database/postgres/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3115
3115
  wagtail/search/backends/database/postgres/postgres.py,sha256=OI_0W1jpKlbXpf0e2OK3XQXTb4cGkwc7qF0vx6K0dWk,26436
@@ -3241,7 +3241,7 @@ wagtail/search/tests/test_elasticsearch7_backend.py,sha256=6gzS6tKjxF-MGnJdG0iT-
3241
3241
  wagtail/search/tests/test_elasticsearch8_backend.py,sha256=3EKGnVO8ldl8em5rE0xG4b_BXVFvh7QGk719FSXGbzE,482
3242
3242
  wagtail/search/tests/test_index_functions.py,sha256=jbkpVqO-jsbNLGl9E8vXvxebMa60Ea82qPWacPcv1Y0,7681
3243
3243
  wagtail/search/tests/test_indexed_class.py,sha256=WU_6y6iTxI02HX0xvoXfA21aml9W8i53HffepSgQGVY,5674
3244
- wagtail/search/tests/test_mysql_backend.py,sha256=BsAJk-0y0nKsSOo4qovY8yHIRLnL6SL6fHs57yKEfoQ,3749
3244
+ wagtail/search/tests/test_mysql_backend.py,sha256=WmID5KO2E7EQzjQUEARnyN5eDlt3-64QNqASUZHO0d4,6310
3245
3245
  wagtail/search/tests/test_page_search.py,sha256=1oPBcgyJQpJmAQaNAhDAWXdVe2xrZ6kf7clefPZ0JLY,2363
3246
3246
  wagtail/search/tests/test_postgres_backend.py,sha256=lGpd1bbXjbEXL-z-qdrt5eMCHkojuUEZ5HE_yq6IvPk,9144
3247
3247
  wagtail/search/tests/test_queries.py,sha256=WiDiwm1fhc-dANf91gXGAfu3v1q23KyvL1-Vuu0gMhM,12290
@@ -3609,7 +3609,7 @@ wagtail/test/search/migrations/0002_bookunindexed.py,sha256=vC2kHmuGZinDB7rWe2NN
3609
3609
  wagtail/test/search/migrations/0003_book_summary.py,sha256=FJF00EMr-0c6ogyo2U6MkAnoDk-VJD7NJYgca3N84Xc,380
3610
3610
  wagtail/test/search/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3611
3611
  wagtail/test/snippets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3612
- wagtail/test/snippets/apps.py,sha256=D9-IRRAwG0IUdU8mVAPHbUlehPmyMEGd3lOW2jvD1_E,303
3612
+ wagtail/test/snippets/apps.py,sha256=Oh5pcAGUgm8fKABmXLK8PrHieRvsuREXVJHQqWAsRMQ,916
3613
3613
  wagtail/test/snippets/forms.py,sha256=cWcsv-6rFsDemGUSjb-yRu77e9qrjDL14tMI6V_ZmRI,174
3614
3614
  wagtail/test/snippets/models.py,sha256=c0ranLPa4iHL_Lm-bO-0xIPxB914Us9eXMpiyHAbtg0,2836
3615
3615
  wagtail/test/snippets/migrations/0001_initial.py,sha256=AqtNn9DR9LwSP2t7TrkXWWZdxW7v_sMXY1AxaFJU6kg,2115
@@ -3628,7 +3628,7 @@ wagtail/test/snippets/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
3628
3628
  wagtail/test/streamfield_migrations/apps.py,sha256=4oPD49SeDtjk3E4--RSa5CSGhGAMlUTM2bHn7J_RLfw,286
3629
3629
  wagtail/test/streamfield_migrations/factories.py,sha256=8S2QrVBZ1-qf41YsStExePOflNa1EhqjvGK5i8Brzrc,2270
3630
3630
  wagtail/test/streamfield_migrations/models.py,sha256=vdVmB2bnGfUpuUNXn2o3TFrde8vYFXE1dpSeHnoj5ls,1228
3631
- wagtail/test/streamfield_migrations/testutils.py,sha256=Uhp30gcyqnD64WYAYNZ4b0BGdlqXkRQdgqu5r0S6Xao,1464
3631
+ wagtail/test/streamfield_migrations/testutils.py,sha256=joVrQFjmgyCi62gcRnCIIbcDe_UYMlD_ChZj3oVW7Zc,1469
3632
3632
  wagtail/test/streamfield_migrations/migrations/0001_initial.py,sha256=LDTry71fjBnzIzDvpPZnwHXvuYqJIYPg9OwFTpkk5z4,16308
3633
3633
  wagtail/test/streamfield_migrations/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3634
3634
  wagtail/test/testapp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -3792,7 +3792,7 @@ wagtail/tests/test_revision_model.py,sha256=dvW9fGG6-V2WeNWpsIm9fP3jtRmJ6wj6pgqM
3792
3792
  wagtail/tests/test_rich_text.py,sha256=bBTdI__z5QSq-Z3dPvGLUyHaodmi6mKMBl65dSrsJQw,17795
3793
3793
  wagtail/tests/test_signals.py,sha256=MTP1e3dEQLt-JbV41JRlIeCzx9-g6grAFtOJgpwsEFI,6122
3794
3794
  wagtail/tests/test_sites.py,sha256=syJCEPMHdKXfbxc_Vb7CH9ymuPVZiWDAae4JmJPmPx0,8488
3795
- wagtail/tests/test_streamfield.py,sha256=GnaB-OHIPVzayozZFswHCmh9jLpn_bgBxJF0Nts04Zc,38167
3795
+ wagtail/tests/test_streamfield.py,sha256=wHoWTWMHOhBqQqey91ZqLYVWb6PeOkG6J8gWAIKLX_w,39112
3796
3796
  wagtail/tests/test_telepath.py,sha256=muiOryoRmkISEHVu9GPSrKJEVB_EvpOufhvuJF-HrTk,10374
3797
3797
  wagtail/tests/test_tests.py,sha256=BAWYYlrFls1rHsqRVsh_b9eW43t6MaXiswI-CkUI6fs,18272
3798
3798
  wagtail/tests/test_translatablemixin.py,sha256=bCHX65L-3SMtgXU7XEdG0NYV4G5-V93TzzHX24ubcl8,10283
@@ -3804,8 +3804,8 @@ wagtail/tests/test_workflow_model.py,sha256=_hL2A27KbnnB437fjNdgnzYxhZk2KS1quFKQ
3804
3804
  wagtail/tests/tests.py,sha256=grGz83o3cv6S37x5VC08atwhPZMm-vYGfX-uZ6KvjLk,29150
3805
3805
  wagtail/tests/streamfield_migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3806
3806
  wagtail/tests/streamfield_migrations/test_bad_data.py,sha256=YyALp8PO-563tm7x-gRONb1_Lgl7rUp9xLUdyrlTiPI,9435
3807
- wagtail/tests/streamfield_migrations/test_migration_names.py,sha256=JCRPcW05b3cqvfZ1aCyOdH1wkFkoIuyBpbM9_AKLPHE,1872
3808
- wagtail/tests/streamfield_migrations/test_migrations.py,sha256=haPQ2AVdtIRwOEL4S_LOLwcKvOoruFMQa9WwTBDZLNo,9273
3807
+ wagtail/tests/streamfield_migrations/test_migration_names.py,sha256=BZQ5UnatWlxnFu8IK2Q-mEVW3cY041bixgtJ9CTuelk,1881
3808
+ wagtail/tests/streamfield_migrations/test_migrations.py,sha256=qunwTE0mquUUN0g_yD8OHWQ6WM_beuW59yIA5lyD56M,10908
3809
3809
  wagtail/tests/streamfield_migrations/test_nested_structures.py,sha256=cBD0ToxlYqNH_UfKzX43_tZb4CcKwglmz38S-Hh5sWM,32238
3810
3810
  wagtail/tests/streamfield_migrations/test_old_list.py,sha256=L_JMTvDn5qUHV_IhwidtWaw9X-636XD75fpBlWVeTgU,10196
3811
3811
  wagtail/tests/streamfield_migrations/test_simple_structures.py,sha256=-_dlN0BssdkUvLmL3sjtcmWMYzqcARJQfyDHzPiONOw,22123
@@ -3813,7 +3813,7 @@ wagtail/users/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3813
3813
  wagtail/users/apps.py,sha256=qBJKh5jWeHgrOnVBzSpYjZsPBF-fKFCfIQSquReY_es,398
3814
3814
  wagtail/users/forms.py,sha256=D7V-d-mY96xtxz7MG9003KtZKy0NG-D_XWvaPWoShQE,15178
3815
3815
  wagtail/users/models.py,sha256=nYeK53kdXC0oMQ84U-cmz14A_SBFrFzavTVD_2ZmRcc,3787
3816
- wagtail/users/permission_order.py,sha256=fG_zFoNCAaPo4itEGVXZVL67U-aFZRWVarO5uSXskww,550
3816
+ wagtail/users/permission_order.py,sha256=4HtB1k6qu9NPus8ni59PzYFOVvQCjrhLvWdqMqkNuLs,1130
3817
3817
  wagtail/users/utils.py,sha256=zBjp_tEKsRQ4qULkDukCmdu2qJZnPb5ivcwWWRwnulk,1631
3818
3818
  wagtail/users/wagtail_hooks.py,sha256=iAJpLkHSGqRycCPZWc3zJGIrb6GfmhMHOetQoZhV3Bk,1187
3819
3819
  wagtail/users/widgets.py,sha256=i-zHRdpmgAvsO_tWD0J2WvFsMxuG76uCm5uBXh0SAhQ,99
@@ -3970,7 +3970,7 @@ wagtail/users/templates/wagtailusers/users/index.html,sha256=skIuPCBX3xX0JScwUBX
3970
3970
  wagtail/users/templates/wagtailusers/users/index_results.html,sha256=aFu0Bh03dBUWE9JTZPc2cz41JCO7j853K11hFQ6mROY,498
3971
3971
  wagtail/users/templates/wagtailusers/users/user_cell.html,sha256=wI4ukIHyjtQqfBW-612UPLpe7Y33TYpBLSav1LIfwEs,270
3972
3972
  wagtail/users/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3973
- wagtail/users/templatetags/wagtailusers_tags.py,sha256=54oSLxLHe5uYChTeNchjFlgOVFdqT4VzxnSvavr02nU,8867
3973
+ wagtail/users/templatetags/wagtailusers_tags.py,sha256=gpruKDlmnS5f37xjHa5Rv_RDFXK_j6OwfRDSDS8IhLE,8935
3974
3974
  wagtail/users/tests/__init__.py,sha256=uLAmHoT63swqGNkrMIiavS4JmnmkaLch1yaAMQr-PgA,255
3975
3975
  wagtail/users/tests/test_admin_views.py,sha256=52-T4Y6zqcL-T6mYDbRTzSuDndjp4xSzZxmwlXx1t_Q,121008
3976
3976
  wagtail/users/tests/test_bulk_actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -4002,9 +4002,9 @@ wagtail/utils/urlpatterns.py,sha256=RDhVScxdm-RV4HSMjWElyrbEoTPsXu841_SKMgoFKtY,
4002
4002
  wagtail/utils/utils.py,sha256=nQhfy-fOiZfUFr67kTX4nF_2VVH7_MDtjTDOzZdpPTE,1407
4003
4003
  wagtail/utils/version.py,sha256=jYCDKIGJD3bZHTpgXMXu14oSBArQnf2WVU979D8V4b0,1552
4004
4004
  wagtail/utils/widgets.py,sha256=ibAvxHCjNw06bMlTD7wvrwmGEMNS3NzrnSKREGfPF44,1775
4005
- wagtail-6.3.2.dist-info/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
4006
- wagtail-6.3.2.dist-info/METADATA,sha256=pleKG2w_ZJciW17llBMxX7QCf1sTJEDANFVY1tnrALQ,3682
4007
- wagtail-6.3.2.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
4008
- wagtail-6.3.2.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
4009
- wagtail-6.3.2.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
4010
- wagtail-6.3.2.dist-info/RECORD,,
4005
+ wagtail-6.3.3.dist-info/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
4006
+ wagtail-6.3.3.dist-info/METADATA,sha256=9FJHuQYiZZAWlz2vdTYBzJhFjCwcF4HL1PJg_Btj2lo,3682
4007
+ wagtail-6.3.3.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
4008
+ wagtail-6.3.3.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
4009
+ wagtail-6.3.3.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
4010
+ wagtail-6.3.3.dist-info/RECORD,,