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 +1 -1
- wagtail/admin/tests/pages/test_preview.py +81 -0
- wagtail/admin/views/generic/preview.py +8 -1
- wagtail/admin/views/pages/preview.py +10 -1
- wagtail/blocks/list_block.py +1 -0
- wagtail/contrib/forms/tests/test_views.py +28 -4
- wagtail/contrib/forms/views.py +1 -1
- wagtail/search/migrations/0009_remove_ngram_autocomplete.py +45 -0
- wagtail/snippets/tests/test_preview.py +53 -0
- wagtail/test/settings.py +6 -2
- wagtail/tests/test_streamfield.py +48 -0
- {wagtail-6.3.4.dist-info → wagtail-6.3.6.dist-info}/METADATA +11 -23
- {wagtail-6.3.4.dist-info → wagtail-6.3.6.dist-info}/RECORD +17 -16
- {wagtail-6.3.4.dist-info → wagtail-6.3.6.dist-info}/WHEEL +1 -1
- {wagtail-6.3.4.dist-info/licenses → wagtail-6.3.6.dist-info}/LICENSE +0 -0
- {wagtail-6.3.4.dist-info → wagtail-6.3.6.dist-info}/entry_points.txt +0 -0
- {wagtail-6.3.4.dist-info → wagtail-6.3.6.dist-info}/top_level.txt +0 -0
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
wagtail/blocks/list_block.py
CHANGED
|
@@ -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
|
-
|
|
556
|
-
|
|
557
|
-
|
|
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()
|
wagtail/contrib/forms/views.py
CHANGED
|
@@ -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"]["
|
|
53
|
-
|
|
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.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: wagtail
|
|
3
|
-
Version: 6.3.
|
|
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:
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
4006
|
-
wagtail-6.3.
|
|
4007
|
-
wagtail-6.3.
|
|
4008
|
-
wagtail-6.3.
|
|
4009
|
-
wagtail-6.3.
|
|
4010
|
-
wagtail-6.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|