wagtail 6.3.4__py3-none-any.whl → 6.3.6__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.
wagtail/__init__.py CHANGED
@@ -6,7 +6,7 @@ from wagtail.utils.version import get_semver_version, get_version
6
6
 
7
7
  # major.minor.patch.release.number
8
8
  # release must be one of alpha, beta, rc, or final
9
- VERSION = (6, 3, 4, "final", 1)
9
+ VERSION = (6, 3, 6, "final", 1)
10
10
 
11
11
  __version__ = get_version(VERSION)
12
12
 
@@ -1,6 +1,7 @@
1
1
  import datetime
2
2
  from functools import wraps
3
3
 
4
+ from django.contrib.auth.models import Permission
4
5
  from django.test import TestCase, override_settings
5
6
  from django.urls import reverse
6
7
  from django.utils import timezone
@@ -228,6 +229,47 @@ class TestPreview(WagtailTestUtils, TestCase):
228
229
  self.assertContains(response, "<li>Parties</li>")
229
230
  self.assertContains(response, "<li>Holidays</li>")
230
231
 
232
+ def test_preview_on_create_without_permissions(self):
233
+ # Remove privileges from user
234
+ self.user.is_superuser = False
235
+ self.user.user_permissions.add(
236
+ Permission.objects.get(
237
+ content_type__app_label="wagtailadmin", codename="access_admin"
238
+ )
239
+ )
240
+ self.user.save()
241
+
242
+ preview_url = reverse(
243
+ "wagtailadmin_pages:preview_on_add",
244
+ args=("tests", "eventpage", self.home_page.id),
245
+ )
246
+
247
+ response = self.client.post(
248
+ preview_url,
249
+ self.post_data,
250
+ )
251
+ self.assertEqual(response.status_code, 302)
252
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
253
+
254
+ def test_preview_on_create_get_without_permissions(self):
255
+ # Remove privileges from user
256
+ self.user.is_superuser = False
257
+ self.user.user_permissions.add(
258
+ Permission.objects.get(
259
+ content_type__app_label="wagtailadmin", codename="access_admin"
260
+ )
261
+ )
262
+ self.user.save()
263
+
264
+ preview_url = reverse(
265
+ "wagtailadmin_pages:preview_on_add",
266
+ args=("tests", "eventpage", self.home_page.id),
267
+ )
268
+
269
+ response = self.client.get(preview_url)
270
+ self.assertEqual(response.status_code, 302)
271
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
272
+
231
273
  def test_preview_on_edit_with_m2m_field(self):
232
274
  preview_url = reverse(
233
275
  "wagtailadmin_pages:preview_on_edit", args=(self.event_page.id,)
@@ -318,6 +360,45 @@ class TestPreview(WagtailTestUtils, TestCase):
318
360
  response = self.client.get(preview_url)
319
361
  self.assertEqual(response.status_code, 200)
320
362
 
363
+ def test_preview_on_edit_without_permissions(self):
364
+ # Remove privileges from user
365
+ self.user.is_superuser = False
366
+ self.user.user_permissions.add(
367
+ Permission.objects.get(
368
+ content_type__app_label="wagtailadmin", codename="access_admin"
369
+ )
370
+ )
371
+ self.user.save()
372
+
373
+ preview_url = reverse(
374
+ "wagtailadmin_pages:preview_on_edit", args=(self.event_page.id,)
375
+ )
376
+
377
+ response = self.client.post(
378
+ preview_url,
379
+ self.post_data,
380
+ )
381
+ self.assertEqual(response.status_code, 302)
382
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
383
+
384
+ def test_preview_on_edit_get_without_permissions(self):
385
+ # Remove privileges from user
386
+ self.user.is_superuser = False
387
+ self.user.user_permissions.add(
388
+ Permission.objects.get(
389
+ content_type__app_label="wagtailadmin", codename="access_admin"
390
+ )
391
+ )
392
+ self.user.save()
393
+
394
+ preview_url = reverse(
395
+ "wagtailadmin_pages:preview_on_edit", args=(self.event_page.id,)
396
+ )
397
+
398
+ response = self.client.get(preview_url)
399
+ self.assertEqual(response.status_code, 302)
400
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
401
+
321
402
  def test_preview_on_create_clear_preview_data(self):
322
403
  preview_session_key = "wagtail-preview-tests-eventpage-{}".format(
323
404
  self.home_page.id
@@ -13,13 +13,16 @@ from wagtail.admin.panels import get_edit_handler
13
13
  from wagtail.models import PreviewableMixin, RevisionMixin
14
14
  from wagtail.utils.decorators import xframe_options_sameorigin_override
15
15
 
16
+ from .permissions import PermissionCheckedMixin
16
17
 
17
- class PreviewOnEdit(View):
18
+
19
+ class PreviewOnEdit(PermissionCheckedMixin, View):
18
20
  model = None
19
21
  form_class = None
20
22
  http_method_names = ("post", "get", "delete")
21
23
  preview_expiration_timeout = 60 * 60 * 24 # seconds
22
24
  session_key_prefix = "wagtail-preview-"
25
+ permission_required = "change"
23
26
 
24
27
  def setup(self, request, *args, **kwargs):
25
28
  super().setup(request, *args, **kwargs)
@@ -50,6 +53,8 @@ class PreviewOnEdit(View):
50
53
 
51
54
  def get_object(self):
52
55
  obj = get_object_or_404(self.model, pk=unquote(str(self.kwargs["pk"])))
56
+ if not self.user_has_permission_for_instance(self.permission_required, obj):
57
+ raise PermissionDenied
53
58
  if isinstance(obj, RevisionMixin):
54
59
  obj = obj.get_latest_revision_as_object()
55
60
  return obj
@@ -124,6 +129,8 @@ class PreviewOnEdit(View):
124
129
 
125
130
 
126
131
  class PreviewOnCreate(PreviewOnEdit):
132
+ permission_required = "add"
133
+
127
134
  @property
128
135
  def session_key(self):
129
136
  app_label = self.model._meta.app_label
@@ -27,9 +27,13 @@ class PreviewOnEdit(GenericPreviewOnEdit):
27
27
  return "{}{}".format(self.session_key_prefix, self.kwargs["page_id"])
28
28
 
29
29
  def get_object(self):
30
- return get_object_or_404(
30
+ page = get_object_or_404(
31
31
  Page, id=self.kwargs["page_id"]
32
32
  ).get_latest_revision_as_object()
33
+ page_perms = page.permissions_for_user(self.request.user)
34
+ if not page_perms.can_edit():
35
+ raise PermissionDenied
36
+ return page
33
37
 
34
38
  def get_form(self, query_dict):
35
39
  form_class = self.object.get_edit_handler().get_form_class()
@@ -74,6 +78,11 @@ class PreviewOnCreate(PreviewOnEdit):
74
78
 
75
79
  page = content_type.model_class()()
76
80
  parent_page = get_object_or_404(Page, id=parent_page_id).specific
81
+
82
+ parent_page_perms = parent_page.permissions_for_user(self.request.user)
83
+ if not parent_page_perms.can_add_subpage():
84
+ raise PermissionDenied
85
+
77
86
  # We need to populate treebeard's path / depth fields in order to
78
87
  # pass validation. We can't make these 100% consistent with the rest
79
88
  # of the tree without making actual database changes (such as
@@ -426,6 +426,7 @@ class ListBlock(Block):
426
426
  child_block = kwargs.get("child_block")
427
427
  if isinstance(child_block, Block):
428
428
  block_id = lookup.add_block(child_block)
429
+ kwargs = kwargs.copy() # avoid mutating the original kwargs stored in self._constructor_args
429
430
  kwargs["child_block"] = block_id
430
431
 
431
432
  return path, args, kwargs
@@ -552,15 +552,39 @@ class TestFormsSubmissionsList(WagtailTestUtils, TestCase):
552
552
  self.assertEqual(len(response.context["data_rows"]), 1)
553
553
 
554
554
  def test_list_submissions_filtering_range(self):
555
- response = self.client.get(
556
- reverse("wagtailforms:list_submissions", args=(self.form_page.id,)),
557
- {"date_from": "12/31/2013", "date_to": "01/02/2014"},
558
- )
555
+ url = reverse("wagtailforms:list_submissions", args=(self.form_page.id,))
556
+ params = {"date_from": "12/31/2013", "date_to": "01/02/2014"}
557
+ response = self.client.get(url, params)
559
558
 
560
559
  # Check response
561
560
  self.assertEqual(response.status_code, 200)
562
561
  self.assertTemplateUsed(response, "wagtailforms/submissions_index.html")
563
562
  self.assertEqual(len(response.context["data_rows"]), 1)
563
+ soup = self.get_soup(response.content)
564
+ next_input = soup.select_one('input[name="next"]')
565
+ self.assertIsNotNone(next_input)
566
+ self.assertEqual(next_input["value"], f"{url}?{urlencode(params)}")
567
+
568
+ def test_list_submissions_filtering_results(self):
569
+ index_url = reverse("wagtailforms:list_submissions", args=(self.form_page.id,))
570
+ results_url = reverse(
571
+ "wagtailforms:list_submissions_results",
572
+ args=(self.form_page.id,),
573
+ )
574
+ params = {"date_from": "12/31/2013", "date_to": "01/02/2014"}
575
+ response = self.client.get(results_url, params)
576
+
577
+ # Check response
578
+ self.assertEqual(response.status_code, 200)
579
+ self.assertTemplateNotUsed(response, "wagtailforms/submissions_index.html")
580
+ self.assertTemplateUsed(response, "wagtailforms/list_submissions.html")
581
+ self.assertEqual(len(response.context["data_rows"]), 1)
582
+ soup = self.get_soup(response.content)
583
+ next_input = soup.select_one('input[name="next"]')
584
+ self.assertIsNotNone(next_input)
585
+ # The next URL should point to the index page (instead of results page)
586
+ # with the same query params to preserve the filter
587
+ self.assertEqual(next_input["value"], f"{index_url}?{urlencode(params)}")
564
588
 
565
589
  def test_list_submissions_pagination(self):
566
590
  self.make_list_submissions()
@@ -363,5 +363,5 @@ class SubmissionsListView(SpreadsheetExportMixin, BaseListingView):
363
363
  }
364
364
  )
365
365
 
366
- context["next_url"] = self.request.get_full_path()
366
+ context["next_url"] = f"{self.get_index_url()}?{self.request.GET.urlencode()}"
367
367
  return context
@@ -0,0 +1,45 @@
1
+ from django.db import connection, migrations
2
+
3
+ # This migration takes on the base model defined in 0005_create_indexentry and adds certain fields that are specific to each database system
4
+ class Migration(migrations.Migration):
5
+
6
+ dependencies = [
7
+ ("wagtailsearch", "0008_remove_query_and_querydailyhits_models"),
8
+ ]
9
+
10
+ # Reverse the usage of ngram parser with MySQL introduced in
11
+ # ``0006_customise_indexentry.py``.
12
+ #
13
+ # Ngram parser is designed primarily for languages which to not use spaces to
14
+ # delimit words (most commonly CJK languages). When using ngram with English or
15
+ # other non-CJK languages, it has the adverse affect of parsing words into
16
+ # non-sensical queries that return no results. MySQL default ngram token size is 2
17
+ # characters, so for example the word "wagtail" would be parsed into 6 separate
18
+ # words as follows":
19
+ #
20
+ # "wa" "ag" "gt" "ta" "ai" "il"
21
+ #
22
+ # In English, these tokens would provide useless search results, and in most cases,
23
+ # no results are returned at all when using autocomplete from the Wagtail admin.
24
+ #
25
+ # See: https://dev.mysql.com/doc/refman/8.0/en/fulltext-search-ngram.html
26
+ if connection.vendor == "mysql" and not connection.mysql_is_mariadb:
27
+ operations = [
28
+ migrations.RunSQL(
29
+ sql="""
30
+ ALTER TABLE wagtailsearch_indexentry
31
+ DROP INDEX `fulltext_autocomplete`;
32
+
33
+ ALTER TABLE wagtailsearch_indexentry
34
+ ADD FULLTEXT INDEX `fulltext_autocomplete` (`autocomplete`);
35
+ """,
36
+ reverse_sql="""
37
+ ALTER TABLE wagtailsearch_indexentry
38
+ DROP INDEX `fulltext_autocomplete`;
39
+
40
+ ALTER TABLE wagtailsearch_indexentry
41
+ ADD FULLTEXT INDEX `fulltext_autocomplete` (`autocomplete`)
42
+ WITH PARSER ngram;
43
+ """,
44
+ )
45
+ ]
@@ -1,5 +1,6 @@
1
1
  import datetime
2
2
 
3
+ from django.contrib.auth.models import Permission
3
4
  from django.test import TestCase, override_settings
4
5
  from django.urls import reverse
5
6
  from django.utils import timezone
@@ -113,6 +114,32 @@ class TestPreview(WagtailTestUtils, TestCase):
113
114
  self.assertContains(response, "<li>Parties</li>")
114
115
  self.assertContains(response, "<li>Holidays</li>")
115
116
 
117
+ def test_preview_on_create_without_permissions(self):
118
+ # Remove privileges from user
119
+ self.user.is_superuser = False
120
+ self.user.user_permissions.add(
121
+ Permission.objects.get(
122
+ content_type__app_label="wagtailadmin", codename="access_admin"
123
+ )
124
+ )
125
+ self.user.save()
126
+ response = self.client.post(self.preview_on_add_url, self.post_data)
127
+ self.assertEqual(response.status_code, 302)
128
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
129
+
130
+ def test_preview_on_create_get_without_permissions(self):
131
+ # Remove privileges from user
132
+ self.user.is_superuser = False
133
+ self.user.user_permissions.add(
134
+ Permission.objects.get(
135
+ content_type__app_label="wagtailadmin", codename="access_admin"
136
+ )
137
+ )
138
+ self.user.save()
139
+ response = self.client.get(self.preview_on_add_url)
140
+ self.assertEqual(response.status_code, 302)
141
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
142
+
116
143
  def test_preview_on_edit_with_m2m_field(self):
117
144
  response = self.client.post(self.preview_on_edit_url, self.post_data)
118
145
 
@@ -200,6 +227,32 @@ class TestPreview(WagtailTestUtils, TestCase):
200
227
  self.client.session,
201
228
  )
202
229
 
230
+ def test_preview_on_edit_without_permissions(self):
231
+ # Remove privileges from user
232
+ self.user.is_superuser = False
233
+ self.user.user_permissions.add(
234
+ Permission.objects.get(
235
+ content_type__app_label="wagtailadmin", codename="access_admin"
236
+ )
237
+ )
238
+ self.user.save()
239
+ response = self.client.post(self.preview_on_edit_url, self.post_data)
240
+ self.assertEqual(response.status_code, 302)
241
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
242
+
243
+ def test_preview_on_edit_get_without_permissions(self):
244
+ # Remove privileges from user
245
+ self.user.is_superuser = False
246
+ self.user.user_permissions.add(
247
+ Permission.objects.get(
248
+ content_type__app_label="wagtailadmin", codename="access_admin"
249
+ )
250
+ )
251
+ self.user.save()
252
+ response = self.client.get(self.preview_on_edit_url)
253
+ self.assertEqual(response.status_code, 302)
254
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
255
+
203
256
  def test_preview_on_create_clear_preview_data(self):
204
257
  # Set a fake preview session data for the page
205
258
  self.client.session[self.session_key_prefix] = "test data"
wagtail/test/settings.py CHANGED
@@ -49,8 +49,12 @@ if DATABASES["default"]["ENGINE"] == "sql_server.pyodbc":
49
49
 
50
50
  # explicitly set charset / collation to utf8 on mysql
51
51
  if DATABASES["default"]["ENGINE"] == "django.db.backends.mysql":
52
- DATABASES["default"]["TEST"]["CHARSET"] = "utf8"
53
- DATABASES["default"]["TEST"]["COLLATION"] = "utf8_general_ci"
52
+ DATABASES["default"]["OPTIONS"] = {
53
+ "charset": "utf8mb4",
54
+ "collation": "utf8mb4_general_ci",
55
+ }
56
+ DATABASES["default"]["TEST"]["CHARSET"] = "utf8mb4"
57
+ DATABASES["default"]["TEST"]["COLLATION"] = "utf8mb4_general_ci"
54
58
 
55
59
 
56
60
  SECRET_KEY = "not needed"
@@ -967,6 +967,54 @@ class TestDeconstructStreamFieldWithLookup(TestCase):
967
967
  },
968
968
  )
969
969
 
970
+ def test_deconstruct_with_listblock_with_child_block_kwarg_idempotence(self):
971
+ # See https://github.com/wagtail/wagtail/issues/13137. When a ListBlock is defined with
972
+ # a child_block keyword argument, its deconstruct_with_lookup method inserts that child
973
+ # block into the lookup to obtain an ID, and returns that ID as the child_block kwarg
974
+ # in its result. However, an implementation bug meant that this was mutating the kwargs
975
+ # dict stored in the block's _constructor_args attribute. As a result, subsequent calls
976
+ # to deconstruct_with_lookup (which happen routinely during makemigrations) would
977
+ # encounter the ID in child_block, leave it alone (because it isn't a block object as
978
+ # expected), and return that ID in the result without adding it to the lookup, messing
979
+ # up the ID sequence in the process.
980
+ field = StreamField(
981
+ [
982
+ ("heading", blocks.CharBlock(required=True)),
983
+ (
984
+ "bullets",
985
+ blocks.ListBlock(child_block=blocks.CharBlock(required=False)),
986
+ ),
987
+ ],
988
+ blank=True,
989
+ )
990
+ field.set_attributes_from_name("body")
991
+
992
+ expected_args = [
993
+ [
994
+ ("heading", 0),
995
+ ("bullets", 2),
996
+ ]
997
+ ]
998
+ expected_kwargs = {
999
+ "blank": True,
1000
+ "block_lookup": {
1001
+ 0: ("wagtail.blocks.CharBlock", (), {"required": True}),
1002
+ 1: ("wagtail.blocks.CharBlock", (), {"required": False}),
1003
+ 2: ("wagtail.blocks.ListBlock", (), {"child_block": 1}),
1004
+ },
1005
+ }
1006
+ name, path, args, kwargs = field.deconstruct()
1007
+ self.assertEqual(name, "body")
1008
+ self.assertEqual(path, "wagtail.fields.StreamField")
1009
+ self.assertEqual(kwargs, expected_kwargs)
1010
+ self.assertEqual(args, expected_args)
1011
+
1012
+ name, path, args, kwargs = field.deconstruct()
1013
+ self.assertEqual(name, "body")
1014
+ self.assertEqual(path, "wagtail.fields.StreamField")
1015
+ self.assertEqual(kwargs, expected_kwargs)
1016
+ self.assertEqual(args, expected_args)
1017
+
970
1018
  def test_deconstruct_with_listblock_subclass(self):
971
1019
  # See https://github.com/wagtail/wagtail/issues/12164 - unlike StructBlock and StreamBlock,
972
1020
  # ListBlock's deconstruct method doesn't reduce subclasses to the base ListBlock class.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.1
2
2
  Name: wagtail
3
- Version: 6.3.4
3
+ Version: 6.3.6
4
4
  Summary: A Django content management system.
5
5
  Home-page: https://wagtail.org/
6
6
  Author: Wagtail core team + contributors
@@ -37,16 +37,23 @@ Requires-Dist: django-taggit<6.2,>=5.0
37
37
  Requires-Dist: django-treebeard<5.0,>=4.5.1
38
38
  Requires-Dist: djangorestframework<4.0,>=3.15.1
39
39
  Requires-Dist: django-filter>=23.3
40
- Requires-Dist: draftjs_exporter<6.0,>=2.1.5
40
+ Requires-Dist: draftjs-exporter<6.0,>=2.1.5
41
41
  Requires-Dist: Pillow<12.0.0,>=9.1.0
42
42
  Requires-Dist: beautifulsoup4<4.13,>=4.8
43
- Requires-Dist: Willow[heif]<2,>=1.8.0
43
+ Requires-Dist: Willow[heif]<2,>=1.10.0
44
44
  Requires-Dist: requests<3.0,>=2.11.1
45
45
  Requires-Dist: l18n>=2018.5
46
46
  Requires-Dist: openpyxl<4.0,>=3.0.10
47
47
  Requires-Dist: anyascii>=0.1.5
48
48
  Requires-Dist: telepath<1,>=0.3.1
49
49
  Requires-Dist: laces<0.2,>=0.1
50
+ Provides-Extra: docs
51
+ Requires-Dist: pyenchant<4,>=3.1.1; extra == "docs"
52
+ Requires-Dist: sphinxcontrib-spelling<8,>=7; extra == "docs"
53
+ Requires-Dist: Sphinx>=7.3; extra == "docs"
54
+ Requires-Dist: sphinx-autobuild>=0.6.0; extra == "docs"
55
+ Requires-Dist: sphinx-wagtail-theme==6.4.0; extra == "docs"
56
+ Requires-Dist: myst-parser==2.0.0; extra == "docs"
50
57
  Provides-Extra: testing
51
58
  Requires-Dist: python-dateutil>=2.7; extra == "testing"
52
59
  Requires-Dist: Jinja2<3.2,>=3.0; extra == "testing"
@@ -64,25 +71,6 @@ Requires-Dist: djhtml==3.0.6; extra == "testing"
64
71
  Requires-Dist: polib<2.0,>=1.1; extra == "testing"
65
72
  Requires-Dist: factory-boy>=3.2; extra == "testing"
66
73
  Requires-Dist: tblib<3.0,>=2.0; extra == "testing"
67
- Provides-Extra: docs
68
- Requires-Dist: pyenchant<4,>=3.1.1; extra == "docs"
69
- Requires-Dist: sphinxcontrib-spelling<8,>=7; extra == "docs"
70
- Requires-Dist: Sphinx>=7.3; extra == "docs"
71
- Requires-Dist: sphinx-autobuild>=0.6.0; extra == "docs"
72
- Requires-Dist: sphinx-wagtail-theme==6.4.0; extra == "docs"
73
- Requires-Dist: myst_parser==2.0.0; extra == "docs"
74
- Dynamic: author
75
- Dynamic: author-email
76
- Dynamic: classifier
77
- Dynamic: description
78
- Dynamic: home-page
79
- Dynamic: license
80
- Dynamic: license-file
81
- Dynamic: project-url
82
- Dynamic: provides-extra
83
- Dynamic: requires-dist
84
- Dynamic: requires-python
85
- Dynamic: summary
86
74
 
87
75
  Wagtail is an open source content management system built on Django, with a strong community and commercial support. It’s focused on user experience, and offers precise control for designers and developers.
88
76
 
@@ -1,4 +1,4 @@
1
- wagtail/__init__.py,sha256=7GoiIS8TwLg8dvpp7EAt-wem_gR5D4aEttlmmohImn8,724
1
+ wagtail/__init__.py,sha256=ApN6kHvYZSoJPHcuzflbUiT5ByYjWpN9gJiDhbAN-cU,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
@@ -908,7 +908,7 @@ wagtail/admin/tests/pages/test_page_locking.py,sha256=7CMYaBVzbvSdsLMtXNOoVYnG0i
908
908
  wagtail/admin/tests/pages/test_page_search.py,sha256=1g-b_Q2vUOGKYKziPh5dwysp94lhMiXJDJ62ykpewH0,12656
909
909
  wagtail/admin/tests/pages/test_page_usage.py,sha256=jhZo6j7SQogYreRinMESdDSpZ65YiPrkjTiOaI0OXis,4726
910
910
  wagtail/admin/tests/pages/test_parent_page_chooser_view.py,sha256=W_cFg5qmbxdaXvR6hkhvPnbQmmnSWjmu3_I5HoIIHt4,6055
911
- wagtail/admin/tests/pages/test_preview.py,sha256=BMu4Y6BA3synZPRecoLnEWiTNxOZ1m5TvIvtmFafDp4,32392
911
+ wagtail/admin/tests/pages/test_preview.py,sha256=w0FhGqTzBWIyRyUWUi6vtc0qOVN_vDLYeAP4oEL_5Ms,35134
912
912
  wagtail/admin/tests/pages/test_reorder_page.py,sha256=FTw5XLai3dcdb5LAbGDpJc5LGZzAyGXaRVNaC94-MCw,8755
913
913
  wagtail/admin/tests/pages/test_revisions.py,sha256=R9jiE3MpNrabX6ffKf6wqoDc4KKoo9yTuk4ciF5hIHM,25018
914
914
  wagtail/admin/tests/pages/test_unpublish_page.py,sha256=Vu2zq74xcwYPQeMFI9zN2mXh27Iee13LSwnmiALTQgo,9682
@@ -967,7 +967,7 @@ wagtail/admin/views/generic/mixins.py,sha256=FqHQOqwPPqQxGRqJEZx7hW2cIuUvZRrpFfu
967
967
  wagtail/admin/views/generic/models.py,sha256=KX1mS1-QeHoBUprjZh4rMXWbGMSN9lBsm_gcWkZXBms,51388
968
968
  wagtail/admin/views/generic/multiple_upload.py,sha256=KiE9T9Uv_EuMr2_MbHzSWJ2W3uaw3djwAnUXgxsjJ38,13383
969
969
  wagtail/admin/views/generic/permissions.py,sha256=LETkWYmN1DjGC8rNYXplkqSZj3TIHEdYf3iWFVZ2jbE,1788
970
- wagtail/admin/views/generic/preview.py,sha256=9tvUJoz55b0bKY4vvfqnDMNke3TTeSPaEamvrICYR9Q,5655
970
+ wagtail/admin/views/generic/preview.py,sha256=Aqu-JcoDTZncWEJkLVIiBc9ZakW3EPg97D-B9oZIycg,5916
971
971
  wagtail/admin/views/generic/usage.py,sha256=leJNFgfZ7tXugIFyuuQ-oMlBKmq0xlTCybH3WtozqnA,5085
972
972
  wagtail/admin/views/generic/workflow.py,sha256=u8mv-rdFeO0UmDaWVzzwtlXRaTZ_ZQzTEl1dwMtW-r8,9429
973
973
  wagtail/admin/views/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -982,7 +982,7 @@ wagtail/admin/views/pages/listing.py,sha256=w6q9zQh6ku0a2-PuSqCVtLB4VA9jJzGKopgb
982
982
  wagtail/admin/views/pages/lock.py,sha256=Z4FxvYyr0eDJj5kgoCJfk-WgwgXhip6_I2CabaG4J1c,1209
983
983
  wagtail/admin/views/pages/move.py,sha256=tk2AT98mb3RcjjvvCEIczhw4orAzakmXCbdV4LBWNk0,5348
984
984
  wagtail/admin/views/pages/ordering.py,sha256=cabaYVsfbHZoxNkGQUqP5klUSlnZDisSFbPko1mX8kM,1633
985
- wagtail/admin/views/pages/preview.py,sha256=rtt4gINN8eujyUgAEsePSlZuWd6q93mlZCEXTkRVvcY,3753
985
+ wagtail/admin/views/pages/preview.py,sha256=YOrDvATDgiLO6LWhMRvxQYZX4UGWQflkYyFEBseuWdQ,4081
986
986
  wagtail/admin/views/pages/revisions.py,sha256=1CkUrB6gtroB9FTiYv6rxhR9rE8CQuPhRCMwvDuFrIk,7060
987
987
  wagtail/admin/views/pages/search.py,sha256=n8Se6p2TNV06Y98-DTwm8yHIFuq1Rl90Z7QoZs5H-5c,4944
988
988
  wagtail/admin/views/pages/unpublish.py,sha256=p_lYd6x8k35UlFIhrZzEjQ6m68qbiHAWyvZrgCg4EoY,3716
@@ -1040,7 +1040,7 @@ wagtail/blocks/__init__.py,sha256=VjRA2jnSMItNEqkMGtYQxFHzoefy8QbqTysjlFHnxpU,31
1040
1040
  wagtail/blocks/base.py,sha256=H-dI5oEXN2paPEhW8gf45n42IdWF62vnw0ZUDELvdtw,27979
1041
1041
  wagtail/blocks/definition_lookup.py,sha256=JkSwFcqEkavq-M6kWNfeDZtvIXnQJ58QT2FeaKrFPEA,3274
1042
1042
  wagtail/blocks/field_block.py,sha256=rKXfquVsRbA80GnXQvgRI8mtYZ4t7eKRCqaSCpeOS94,32414
1043
- wagtail/blocks/list_block.py,sha256=TJgxmUvTnQrnwk-celA2T5zGSa-NedVvr7WzGsweDRo,18289
1043
+ wagtail/blocks/list_block.py,sha256=_3qNE0L7UMAmwMYCZ5CKasf574tKO7eDUth8HInmo88,18403
1044
1044
  wagtail/blocks/static_block.py,sha256=tKkU0hENu_fzHC9xiZ3p9c9drP7-TDogn9r8j0E-nLk,1748
1045
1045
  wagtail/blocks/stream_block.py,sha256=amEWzaq4oiOUVf0Y2VRIfXhsDnRzd9hHBYhx-4SW8nE,32291
1046
1046
  wagtail/blocks/struct_block.py,sha256=u-etS4B5ONd6_gYbL-F8XX3l_RY3zPMMsrxSTLXMOIs,15988
@@ -1056,7 +1056,7 @@ wagtail/contrib/forms/models.py,sha256=IqLRh9a9W0hDsO2HUgwfAOUzKWqeaTMvP-KT8VLWV
1056
1056
  wagtail/contrib/forms/panels.py,sha256=zI3bFM1X5iT_fnxQUe5BWWN5iQKm6tEFEiaFhNRZcwk,1556
1057
1057
  wagtail/contrib/forms/urls.py,sha256=VZ4LDq6SkdEi3iXL7zoxDRSNZeGS5ZSeiNUsfqZ-nOI,776
1058
1058
  wagtail/contrib/forms/utils.py,sha256=Gu3WS-X37KQeDuHZliEwkhHJaqDgUwF1ObuVp3ai2fM,1279
1059
- wagtail/contrib/forms/views.py,sha256=xOSyAMn0CpGpDWAMMlaVK4vBaJIzLBUpQlMikwaB1zU,13355
1059
+ wagtail/contrib/forms/views.py,sha256=-pBvZObLNKdwo7Hq5TiAXvrkstba0kKpm3-hjG3VZ18,13383
1060
1060
  wagtail/contrib/forms/wagtail_hooks.py,sha256=VbHWejKs7Pp-KXtrcIqWOS476hpK9UuWBn1XF8qLmug,876
1061
1061
  wagtail/contrib/forms/locale/af/LC_MESSAGES/django.mo,sha256=IT4kQ2iXzYtsLiFZcjhqZdbNqnigtbo1oWilPNx88L0,455
1062
1062
  wagtail/contrib/forms/locale/af/LC_MESSAGES/django.po,sha256=ETEtWd1pbUDvlhOZoeGO4LHzOooQm5PHD_7IXKzUnU8,667
@@ -1190,7 +1190,7 @@ wagtail/contrib/forms/templates/wagtailforms/panels/form_responses_panel.html,sh
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
1192
  wagtail/contrib/forms/tests/test_models.py,sha256=lcifi_nJHHD9toYVtIY3P-zh-rdCTsLQTgxvAyFKbMM,32465
1193
- wagtail/contrib/forms/tests/test_views.py,sha256=g213EeJKrWEF7_DPCnTxFvN8SYCCjcOQkGoM2d9iaWw,81552
1193
+ wagtail/contrib/forms/tests/test_views.py,sha256=UNcm3Y5pvDDUnjxEY-HNHaHBHj5YfgNJW2mL2zfCuGM,82860
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
1196
1196
  wagtail/contrib/frontend_cache/apps.py,sha256=y-TyHADOpdCrIQ7zfnVD6OOxjo28lnBhPJeBtjlPih4,407
@@ -3231,6 +3231,7 @@ wagtail/search/migrations/0005_create_indexentry.py,sha256=LvR4mCvqrfEx-tFnOQaUJ
3231
3231
  wagtail/search/migrations/0006_customise_indexentry.py,sha256=ByuG7ERoyCt5e5-4UyGCwdHDOg0NHXnJdkRI8ioJxXw,10677
3232
3232
  wagtail/search/migrations/0007_delete_editorspick.py,sha256=SUF8_SlrLmDLdncz3LngkR_5oMyR5UvPOzRjim5c93o,710
3233
3233
  wagtail/search/migrations/0008_remove_query_and_querydailyhits_models.py,sha256=NCBdecSK8K7Z4g1KpKpuOw4_4SlzaxZf9rVE_o6PPik,608
3234
+ wagtail/search/migrations/0009_remove_ngram_autocomplete.py,sha256=DMQ6vzRFUYN5BqHdkt3mle7NU0aOO07c5wFBKCS_k3I,1964
3234
3235
  wagtail/search/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3235
3236
  wagtail/search/templates/wagtailsearch/search_results.html,sha256=04u2bj7AJIE_H2jre3v6IiHxUbXuMUBxgfd9O4V8Q4c,710
3236
3237
  wagtail/search/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -3526,7 +3527,7 @@ wagtail/snippets/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
3526
3527
  wagtail/snippets/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3527
3528
  wagtail/snippets/tests/test_locking.py,sha256=QdaRVuX47tCbwoA62KYNJm9qxH33ekKs-nai5UeYDp4,25370
3528
3529
  wagtail/snippets/tests/test_management.py,sha256=GQw8HCZSJWny8giAUua_5-RstN7U_QGcsOkVuG72YHM,894
3529
- wagtail/snippets/tests/test_preview.py,sha256=egI0iOhdlkNzalfcfiRpv0VIunBzOBRjfCziqDLawKI,27036
3530
+ wagtail/snippets/tests/test_preview.py,sha256=sFPLIvRoDrewZ6_B-6uyQB6q1bFPXE_6Kwg3_oOvrOs,29214
3530
3531
  wagtail/snippets/tests/test_snippets.py,sha256=ROlW_-2RA6MZI1wmZi6IVnbduPoqyhrMOUPn0kbhCLE,226414
3531
3532
  wagtail/snippets/tests/test_usage.py,sha256=taycjCYwSB9g74A40TwFM_j7qPPTZL9fAChBatHyqr0,8260
3532
3533
  wagtail/snippets/tests/test_viewset.py,sha256=HkyHndyYdSRHETD71MyvjzLBWThVWg4uJjSBtCIIZjg,63548
@@ -3554,7 +3555,7 @@ wagtail/test/manage.py,sha256=JaihE2eqQFMxzd83WWPE4DLnZbzq0bqEkozWAbe-xn8,255
3554
3555
  wagtail/test/middleware.py,sha256=Tvt43O8iGOFvK1tpZFKHQndiJPO5AcrvzqrTzBjuTuY,1395
3555
3556
  wagtail/test/non_root_urls.py,sha256=ZWPGHRmWHmx2Ext6S_TONDj4ZHdBt5BNZoULON1nDlA,556
3556
3557
  wagtail/test/numberformat.py,sha256=FBKsX_92H97xHnb4Er5mAH2i3oFSorCQnKdGcjHlcgE,3771
3557
- wagtail/test/settings.py,sha256=HZvednl7-RKbP7KJKDii_JCON998Jn2J37m3tIrMQjc,9586
3558
+ wagtail/test/settings.py,sha256=J6y_xiE5WWdWIaF7rxCfzJAMu9sfLpEYN3PqTNDuldU,9711
3558
3559
  wagtail/test/settings_ui.py,sha256=FtNeC3qofOBsdfNT2ES0CDtwPq8Kth1Ym_l0QM5ZspE,886
3559
3560
  wagtail/test/urls.py,sha256=OqO9tjttDsR04DFc5cPmVijFRnAJZiktLuUXSi8_Cok,2599
3560
3561
  wagtail/test/urls_multilang.py,sha256=Pfif5_J3mDcf-AJEADTsm2dfFTQQWOlLMZHdPg2P8eA,310
@@ -3792,7 +3793,7 @@ wagtail/tests/test_revision_model.py,sha256=dvW9fGG6-V2WeNWpsIm9fP3jtRmJ6wj6pgqM
3792
3793
  wagtail/tests/test_rich_text.py,sha256=bBTdI__z5QSq-Z3dPvGLUyHaodmi6mKMBl65dSrsJQw,17795
3793
3794
  wagtail/tests/test_signals.py,sha256=MTP1e3dEQLt-JbV41JRlIeCzx9-g6grAFtOJgpwsEFI,6122
3794
3795
  wagtail/tests/test_sites.py,sha256=syJCEPMHdKXfbxc_Vb7CH9ymuPVZiWDAae4JmJPmPx0,8488
3795
- wagtail/tests/test_streamfield.py,sha256=wHoWTWMHOhBqQqey91ZqLYVWb6PeOkG6J8gWAIKLX_w,39112
3796
+ wagtail/tests/test_streamfield.py,sha256=qIn-hGIWkm0PQvvbcm6ywiqjzizb4KkacRQqg0AOzAk,41312
3796
3797
  wagtail/tests/test_telepath.py,sha256=muiOryoRmkISEHVu9GPSrKJEVB_EvpOufhvuJF-HrTk,10374
3797
3798
  wagtail/tests/test_tests.py,sha256=BAWYYlrFls1rHsqRVsh_b9eW43t6MaXiswI-CkUI6fs,18272
3798
3799
  wagtail/tests/test_translatablemixin.py,sha256=bCHX65L-3SMtgXU7XEdG0NYV4G5-V93TzzHX24ubcl8,10283
@@ -4002,9 +4003,9 @@ wagtail/utils/urlpatterns.py,sha256=RDhVScxdm-RV4HSMjWElyrbEoTPsXu841_SKMgoFKtY,
4002
4003
  wagtail/utils/utils.py,sha256=nQhfy-fOiZfUFr67kTX4nF_2VVH7_MDtjTDOzZdpPTE,1407
4003
4004
  wagtail/utils/version.py,sha256=jYCDKIGJD3bZHTpgXMXu14oSBArQnf2WVU979D8V4b0,1552
4004
4005
  wagtail/utils/widgets.py,sha256=ibAvxHCjNw06bMlTD7wvrwmGEMNS3NzrnSKREGfPF44,1775
4005
- wagtail-6.3.4.dist-info/licenses/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
4006
- wagtail-6.3.4.dist-info/METADATA,sha256=OjgK7qg3wPuytDYORaxLjvgOqZ-_ol19cONRwMyNqUs,3786
4007
- wagtail-6.3.4.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
4008
- wagtail-6.3.4.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
4009
- wagtail-6.3.4.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
4010
- wagtail-6.3.4.dist-info/RECORD,,
4006
+ wagtail-6.3.6.dist-info/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
4007
+ wagtail-6.3.6.dist-info/METADATA,sha256=mN_fItZb-ll_hZOm14nFQa_mvOrxR8xe_N42fhLDv24,3540
4008
+ wagtail-6.3.6.dist-info/WHEEL,sha256=hPN0AlP2dZM_3ZJZWP4WooepkmU9wzjGgCLCeFjkHLA,92
4009
+ wagtail-6.3.6.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
4010
+ wagtail-6.3.6.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
4011
+ wagtail-6.3.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: bdist_wheel (0.46.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5