wagtail 5.2.2__py3-none-any.whl → 5.2.4__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/panels/title_field_panel.py +5 -1
- wagtail/admin/tests/api/test_pages.py +26 -10
- wagtail/admin/tests/test_edit_handlers.py +19 -0
- wagtail/admin/tests/test_workflows.py +25 -1
- wagtail/admin/tests/viewsets/test_model_viewset.py +27 -0
- wagtail/admin/views/generic/history.py +17 -1
- wagtail/admin/views/generic/usage.py +8 -0
- wagtail/admin/views/reports/workflows.py +19 -4
- wagtail/contrib/forms/panels.py +5 -1
- wagtail/contrib/forms/tests/test_views.py +106 -0
- wagtail/search/backends/elasticsearch5.py +9 -2
- wagtail/search/tests/test_elasticsearch5_backend.py +25 -0
- wagtail/test/testapp/models.py +2 -0
- wagtail-5.2.4.dist-info/METADATA +80 -0
- {wagtail-5.2.2.dist-info → wagtail-5.2.4.dist-info}/RECORD +20 -20
- {wagtail-5.2.2.dist-info → wagtail-5.2.4.dist-info}/WHEEL +1 -1
- wagtail-5.2.2.dist-info/METADATA +0 -80
- {wagtail-5.2.2.dist-info → wagtail-5.2.4.dist-info}/LICENSE +0 -0
- {wagtail-5.2.2.dist-info → wagtail-5.2.4.dist-info}/entry_points.txt +0 -0
- {wagtail-5.2.2.dist-info → wagtail-5.2.4.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 = (5, 2,
|
|
9
|
+
VERSION = (5, 2, 4, "final", 1)
|
|
10
10
|
|
|
11
11
|
__version__ = get_version(VERSION)
|
|
12
12
|
|
|
@@ -78,7 +78,11 @@ class TitleFieldPanel(FieldPanel):
|
|
|
78
78
|
actions = [widget.attrs.get("data-action", None)] + self.apply_actions
|
|
79
79
|
attrs["data-action"] = " ".join(filter(None, actions))
|
|
80
80
|
|
|
81
|
-
targets = [
|
|
81
|
+
targets = [
|
|
82
|
+
self.get_target_selector(target)
|
|
83
|
+
for target in panel.targets
|
|
84
|
+
if target in self.form.fields
|
|
85
|
+
]
|
|
82
86
|
attrs["data-w-sync-target-value"] = ", ".join(filter(None, targets))
|
|
83
87
|
|
|
84
88
|
placeholder = self.get_placeholder()
|
|
@@ -1309,7 +1309,7 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
|
|
|
1309
1309
|
self.assertEqual(response.status_code, 403)
|
|
1310
1310
|
content = json.loads(response.content.decode("utf-8"))
|
|
1311
1311
|
self.assertEqual(
|
|
1312
|
-
content, {"detail": "You do not have permission to
|
|
1312
|
+
content, {"detail": "You do not have permission to copy this page"}
|
|
1313
1313
|
)
|
|
1314
1314
|
|
|
1315
1315
|
def test_recursively_copy_into_self(self):
|
|
@@ -1347,7 +1347,7 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
|
|
|
1347
1347
|
self.assertEqual(response.status_code, 403)
|
|
1348
1348
|
content = json.loads(response.content.decode("utf-8"))
|
|
1349
1349
|
self.assertEqual(
|
|
1350
|
-
content, {"detail": "You do not have permission to
|
|
1350
|
+
content, {"detail": "You do not have permission to copy this page"}
|
|
1351
1351
|
)
|
|
1352
1352
|
|
|
1353
1353
|
def test_without_publish_permissions_at_destination_with_keep_live(self):
|
|
@@ -1374,7 +1374,12 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
|
|
|
1374
1374
|
self.assertEqual(response.status_code, 403)
|
|
1375
1375
|
content = json.loads(response.content.decode("utf-8"))
|
|
1376
1376
|
self.assertEqual(
|
|
1377
|
-
content,
|
|
1377
|
+
content,
|
|
1378
|
+
{
|
|
1379
|
+
"detail": (
|
|
1380
|
+
"You do not have permission to publish a page at the destination"
|
|
1381
|
+
)
|
|
1382
|
+
},
|
|
1378
1383
|
)
|
|
1379
1384
|
|
|
1380
1385
|
def test_respects_page_creation_rules(self):
|
|
@@ -1384,7 +1389,7 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
|
|
|
1384
1389
|
self.assertEqual(response.status_code, 403)
|
|
1385
1390
|
content = json.loads(response.content.decode("utf-8"))
|
|
1386
1391
|
self.assertEqual(
|
|
1387
|
-
content, {"detail": "You do not have permission to
|
|
1392
|
+
content, {"detail": "You do not have permission to copy this page"}
|
|
1388
1393
|
)
|
|
1389
1394
|
|
|
1390
1395
|
def test_copy_page_slug_in_use(self):
|
|
@@ -1511,7 +1516,7 @@ class TestDeletePageAction(AdminAPITestCase, TestCase):
|
|
|
1511
1516
|
self.assertEqual(response.status_code, 403)
|
|
1512
1517
|
content = json.loads(response.content.decode("utf-8"))
|
|
1513
1518
|
self.assertEqual(
|
|
1514
|
-
content, {"detail": "You do not have permission to
|
|
1519
|
+
content, {"detail": "You do not have permission to delete this page"}
|
|
1515
1520
|
)
|
|
1516
1521
|
|
|
1517
1522
|
# Page is still there
|
|
@@ -1559,7 +1564,7 @@ class TestPublishPageAction(AdminAPITestCase, TestCase):
|
|
|
1559
1564
|
self.assertEqual(response.status_code, 403)
|
|
1560
1565
|
content = json.loads(response.content.decode("utf-8"))
|
|
1561
1566
|
self.assertEqual(
|
|
1562
|
-
content, {"detail": "You do not have permission to
|
|
1567
|
+
content, {"detail": "You do not have permission to publish this page"}
|
|
1563
1568
|
)
|
|
1564
1569
|
|
|
1565
1570
|
def test_publish_alias_page(self):
|
|
@@ -1649,7 +1654,7 @@ class TestUnpublishPageAction(AdminAPITestCase, TestCase):
|
|
|
1649
1654
|
self.assertEqual(response.status_code, 403)
|
|
1650
1655
|
content = json.loads(response.content.decode("utf-8"))
|
|
1651
1656
|
self.assertEqual(
|
|
1652
|
-
content, {"detail": "You do not have permission to
|
|
1657
|
+
content, {"detail": "You do not have permission to unpublish this page"}
|
|
1653
1658
|
)
|
|
1654
1659
|
|
|
1655
1660
|
|
|
@@ -1681,7 +1686,13 @@ class TestMovePageAction(AdminAPITestCase, TestCase):
|
|
|
1681
1686
|
|
|
1682
1687
|
content = json.loads(response.content.decode("utf-8"))
|
|
1683
1688
|
self.assertEqual(
|
|
1684
|
-
content,
|
|
1689
|
+
content,
|
|
1690
|
+
{
|
|
1691
|
+
"detail": (
|
|
1692
|
+
"You do not have permission to move the page to the "
|
|
1693
|
+
"target specified."
|
|
1694
|
+
),
|
|
1695
|
+
},
|
|
1685
1696
|
)
|
|
1686
1697
|
|
|
1687
1698
|
def test_move_page_without_destination_page_id(self):
|
|
@@ -1884,7 +1895,12 @@ class TestCreatePageAliasAction(AdminAPITestCase, TestCase):
|
|
|
1884
1895
|
|
|
1885
1896
|
content = json.loads(response.content.decode("utf-8"))
|
|
1886
1897
|
self.assertEqual(
|
|
1887
|
-
content,
|
|
1898
|
+
content,
|
|
1899
|
+
{
|
|
1900
|
+
"detail": (
|
|
1901
|
+
"You do not have permission to publish a page at the destination"
|
|
1902
|
+
),
|
|
1903
|
+
},
|
|
1888
1904
|
)
|
|
1889
1905
|
|
|
1890
1906
|
|
|
@@ -1941,7 +1957,7 @@ class TestRevertToPageRevisionAction(AdminAPITestCase, TestCase):
|
|
|
1941
1957
|
|
|
1942
1958
|
content = json.loads(response.content.decode("utf-8"))
|
|
1943
1959
|
self.assertEqual(
|
|
1944
|
-
content, {"detail": "You do not have permission to
|
|
1960
|
+
content, {"detail": "You do not have permission to edit this page"}
|
|
1945
1961
|
)
|
|
1946
1962
|
|
|
1947
1963
|
def test_revert_to_page_revision_without_revision_id(self):
|
|
@@ -2260,6 +2260,25 @@ class TestTitleFieldPanel(WagtailTestUtils, TestCase):
|
|
|
2260
2260
|
"focus->w-sync#check blur->w-sync#apply change->w-sync#apply keyup->w-sync#apply",
|
|
2261
2261
|
)
|
|
2262
2262
|
|
|
2263
|
+
def test_form_without_slugfield(self):
|
|
2264
|
+
html = self.get_edit_handler_html(ObjectList([TitleFieldPanel("title")]))
|
|
2265
|
+
|
|
2266
|
+
self.assertIsNotNone(html.find(attrs={"class": "w-panel title"}))
|
|
2267
|
+
|
|
2268
|
+
attrs = html.find("input").attrs
|
|
2269
|
+
self.assertEqual(attrs["data-w-sync-target-value"], "")
|
|
2270
|
+
|
|
2271
|
+
def test_form_with_readonly_slugfield(self):
|
|
2272
|
+
html = self.get_edit_handler_html(
|
|
2273
|
+
ObjectList([TitleFieldPanel("title"), FieldPanel("slug", read_only=True)]),
|
|
2274
|
+
instance=EventPage(),
|
|
2275
|
+
)
|
|
2276
|
+
|
|
2277
|
+
self.assertIsNotNone(html.find(attrs={"class": "w-panel title"}))
|
|
2278
|
+
|
|
2279
|
+
attrs = html.find("input").attrs
|
|
2280
|
+
self.assertEqual(attrs["data-w-sync-target-value"], "")
|
|
2281
|
+
|
|
2263
2282
|
def test_not_using_apply_actions_if_live(self):
|
|
2264
2283
|
"""
|
|
2265
2284
|
If the Page (or any model) has `live = True`, do not apply the actions by default.
|
|
@@ -2412,7 +2412,7 @@ class TestPageWorkflowReport(BasePageWorkflowTests):
|
|
|
2412
2412
|
self.submitter.first_name = "Sebastian"
|
|
2413
2413
|
self.submitter.last_name = "Mitter"
|
|
2414
2414
|
self.submitter.save()
|
|
2415
|
-
self.post("submit")
|
|
2415
|
+
self.post("submit", follow=True)
|
|
2416
2416
|
self.login(user=self.moderator)
|
|
2417
2417
|
|
|
2418
2418
|
def setup_workflow_and_tasks(self):
|
|
@@ -2545,11 +2545,35 @@ class TestPageWorkflowReport(BasePageWorkflowTests):
|
|
|
2545
2545
|
self.assertEqual(response.status_code, 200)
|
|
2546
2546
|
self.assertNotIn("Hello world!", content)
|
|
2547
2547
|
|
|
2548
|
+
def test_workflow_report_deleted(self):
|
|
2549
|
+
self.object.delete()
|
|
2550
|
+
response = self.client.get(reverse("wagtailadmin_reports:workflow"))
|
|
2551
|
+
self.assertEqual(response.status_code, 200)
|
|
2552
|
+
self.assertNotContains(response, "Hello world!")
|
|
2553
|
+
# test_workflow is only rendered in the filter, not the results
|
|
2554
|
+
self.assertContains(response, "test_workflow", count=1)
|
|
2555
|
+
self.assertNotContains(response, "Sebastian Mitter")
|
|
2556
|
+
self.assertNotContains(response, "March 31, 2020")
|
|
2557
|
+
|
|
2558
|
+
response = self.client.get(reverse("wagtailadmin_reports:workflow_tasks"))
|
|
2559
|
+
self.assertEqual(response.status_code, 200)
|
|
2560
|
+
self.assertNotContains(response, "Hello world!")
|
|
2561
|
+
|
|
2548
2562
|
|
|
2549
2563
|
class TestSnippetWorkflowReport(TestPageWorkflowReport, BaseSnippetWorkflowTests):
|
|
2550
2564
|
pass
|
|
2551
2565
|
|
|
2552
2566
|
|
|
2567
|
+
class TestNonLockableSnippetWorkflowReport(
|
|
2568
|
+
TestPageWorkflowReport, BaseSnippetWorkflowTests
|
|
2569
|
+
):
|
|
2570
|
+
# This model does not use LockableMixin, and it also does not have a
|
|
2571
|
+
# GenericRelation to WorkflowState and Revision, but it should not break
|
|
2572
|
+
# the report page.
|
|
2573
|
+
# See https://github.com/wagtail/wagtail/issues/11300 for more details.
|
|
2574
|
+
model = ModeratedModel
|
|
2575
|
+
|
|
2576
|
+
|
|
2553
2577
|
class TestPageNotificationPreferences(BasePageWorkflowTests):
|
|
2554
2578
|
def setUp(self):
|
|
2555
2579
|
super().setUp()
|
|
@@ -13,6 +13,7 @@ from django.utils.timezone import make_aware
|
|
|
13
13
|
from openpyxl import load_workbook
|
|
14
14
|
|
|
15
15
|
from wagtail.admin.admin_url_finder import AdminURLFinder
|
|
16
|
+
from wagtail.log_actions import log
|
|
16
17
|
from wagtail.models import ModelLogEntry
|
|
17
18
|
from wagtail.test.testapp.models import (
|
|
18
19
|
FeatureCompleteToy,
|
|
@@ -777,6 +778,18 @@ class TestBreadcrumbs(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
|
777
778
|
]
|
|
778
779
|
self.assertBreadcrumbsItemsRendered(items, response.content)
|
|
779
780
|
|
|
781
|
+
def test_history_view_pagination(self):
|
|
782
|
+
for i in range(25):
|
|
783
|
+
log(instance=self.object, action="wagtail.edit", user=self.user)
|
|
784
|
+
|
|
785
|
+
history_url = reverse(
|
|
786
|
+
"feature_complete_toy:history",
|
|
787
|
+
args=(quote(self.object.pk),),
|
|
788
|
+
)
|
|
789
|
+
response = self.client.get(history_url)
|
|
790
|
+
self.assertContains(response, "Page 1 of 2")
|
|
791
|
+
self.assertContains(response, f'<a href="{history_url}?p=2">')
|
|
792
|
+
|
|
780
793
|
def test_usage_view(self):
|
|
781
794
|
usage_url = reverse(
|
|
782
795
|
"feature_complete_toy:usage",
|
|
@@ -801,6 +814,20 @@ class TestBreadcrumbs(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
|
|
|
801
814
|
]
|
|
802
815
|
self.assertBreadcrumbsItemsRendered(items, response.content)
|
|
803
816
|
|
|
817
|
+
def test_usage_view_pagination(self):
|
|
818
|
+
for i in range(25):
|
|
819
|
+
VariousOnDeleteModel.objects.create(
|
|
820
|
+
text=f"Toybox {i}", cascading_toy=self.object
|
|
821
|
+
)
|
|
822
|
+
|
|
823
|
+
usage_url = reverse(
|
|
824
|
+
"feature_complete_toy:usage",
|
|
825
|
+
args=(quote(self.object.pk),),
|
|
826
|
+
)
|
|
827
|
+
response = self.client.get(usage_url)
|
|
828
|
+
self.assertContains(response, "Page 1 of 2")
|
|
829
|
+
self.assertContains(response, f'<a href="{usage_url}?p=2">')
|
|
830
|
+
|
|
804
831
|
def test_inspect_view(self):
|
|
805
832
|
inspect_url = reverse(
|
|
806
833
|
"feature_complete_toy:inspect",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from datetime import timedelta
|
|
2
2
|
|
|
3
3
|
import django_filters
|
|
4
|
-
from django.contrib.admin.utils import unquote
|
|
4
|
+
from django.contrib.admin.utils import quote, unquote
|
|
5
5
|
from django.core.paginator import Paginator
|
|
6
6
|
from django.shortcuts import get_object_or_404
|
|
7
7
|
from django.urls import reverse
|
|
@@ -57,6 +57,8 @@ class HistoryView(IndexView):
|
|
|
57
57
|
any_permission_required = ["add", "change", "delete"]
|
|
58
58
|
page_title = gettext_lazy("History")
|
|
59
59
|
results_template_name = "wagtailadmin/generic/history_results.html"
|
|
60
|
+
history_url_name = None
|
|
61
|
+
history_results_url_name = None
|
|
60
62
|
header_icon = "history"
|
|
61
63
|
is_searchable = False
|
|
62
64
|
paginate_by = 20
|
|
@@ -97,6 +99,20 @@ class HistoryView(IndexView):
|
|
|
97
99
|
{"url": "", "label": gettext("History")},
|
|
98
100
|
]
|
|
99
101
|
|
|
102
|
+
def get_history_url(self, instance):
|
|
103
|
+
if self.history_url_name:
|
|
104
|
+
return reverse(self.history_url_name, args=(quote(instance.pk),))
|
|
105
|
+
|
|
106
|
+
def get_history_results_url(self, instance):
|
|
107
|
+
if self.history_results_url_name:
|
|
108
|
+
return reverse(self.history_results_url_name, args=(quote(instance.pk),))
|
|
109
|
+
|
|
110
|
+
def get_index_url(self): # used for pagination links
|
|
111
|
+
return self.get_history_url(self.object)
|
|
112
|
+
|
|
113
|
+
def get_index_results_url(self):
|
|
114
|
+
return self.get_history_results_url(self.object)
|
|
115
|
+
|
|
100
116
|
def get_context_data(self, *args, object_list=None, **kwargs):
|
|
101
117
|
context = super().get_context_data(*args, object_list=object_list, **kwargs)
|
|
102
118
|
context["object"] = self.object
|
|
@@ -24,6 +24,7 @@ class UsageView(PermissionCheckedMixin, BaseObjectMixin, BaseListingView):
|
|
|
24
24
|
page_title = gettext_lazy("Usage of")
|
|
25
25
|
index_url_name = None
|
|
26
26
|
edit_url_name = None
|
|
27
|
+
usage_url_name = None
|
|
27
28
|
permission_required = "change"
|
|
28
29
|
|
|
29
30
|
def setup(self, request, *args, **kwargs):
|
|
@@ -40,6 +41,13 @@ class UsageView(PermissionCheckedMixin, BaseObjectMixin, BaseListingView):
|
|
|
40
41
|
return object.get_latest_revision_as_object()
|
|
41
42
|
return object
|
|
42
43
|
|
|
44
|
+
def get_usage_url(self, instance):
|
|
45
|
+
if self.usage_url_name:
|
|
46
|
+
return reverse(self.usage_url_name, args=(quote(instance.pk),))
|
|
47
|
+
|
|
48
|
+
def get_index_url(self): # used for pagination links
|
|
49
|
+
return self.get_usage_url(self.object)
|
|
50
|
+
|
|
43
51
|
def get_page_subtitle(self):
|
|
44
52
|
return get_latest_str(self.object)
|
|
45
53
|
|
|
@@ -187,10 +187,16 @@ class WorkflowView(ReportView):
|
|
|
187
187
|
content_type_id__in=get_editable_content_type_ids(self.request)
|
|
188
188
|
)
|
|
189
189
|
|
|
190
|
-
return
|
|
191
|
-
|
|
190
|
+
return (
|
|
191
|
+
WorkflowState.objects.filter(editable_pages | editable_objects)
|
|
192
|
+
.select_related("workflow", "requested_by")
|
|
193
|
+
.prefetch_related("content_object", "content_object__latest_revision")
|
|
194
|
+
.order_by("-created_at")
|
|
192
195
|
)
|
|
193
196
|
|
|
197
|
+
def decorate_paginated_queryset(self, object_list):
|
|
198
|
+
return [obj for obj in object_list if obj.content_object]
|
|
199
|
+
|
|
194
200
|
|
|
195
201
|
class WorkflowTasksView(ReportView):
|
|
196
202
|
template_name = "wagtailadmin/reports/workflow_tasks.html"
|
|
@@ -248,6 +254,15 @@ class WorkflowTasksView(ReportView):
|
|
|
248
254
|
self.request
|
|
249
255
|
)
|
|
250
256
|
)
|
|
251
|
-
return
|
|
252
|
-
|
|
257
|
+
return (
|
|
258
|
+
TaskState.objects.filter(editable_pages | editable_objects)
|
|
259
|
+
.select_related("workflow_state", "task")
|
|
260
|
+
.prefetch_related(
|
|
261
|
+
"workflow_state__content_object",
|
|
262
|
+
"workflow_state__content_object__latest_revision",
|
|
263
|
+
)
|
|
264
|
+
.order_by("-started_at")
|
|
253
265
|
)
|
|
266
|
+
|
|
267
|
+
def decorate_paginated_queryset(self, object_list):
|
|
268
|
+
return [obj for obj in object_list if obj.workflow_state.content_object]
|
wagtail/contrib/forms/panels.py
CHANGED
|
@@ -18,7 +18,11 @@ class FormSubmissionsPanel(Panel):
|
|
|
18
18
|
def submissions(self):
|
|
19
19
|
form_page_model = self.panel.model
|
|
20
20
|
form_submissions_model = form_page_model().get_submission_class()
|
|
21
|
-
|
|
21
|
+
if self.instance.pk:
|
|
22
|
+
return form_submissions_model.objects.filter(page=self.instance)
|
|
23
|
+
else:
|
|
24
|
+
# Page has not been created yet, so there can't be any submissions
|
|
25
|
+
return form_submissions_model.objects.none()
|
|
22
26
|
|
|
23
27
|
@cached_property
|
|
24
28
|
def submission_count(self):
|
|
@@ -76,6 +76,30 @@ class TestFormResponsesPanel(TestCase):
|
|
|
76
76
|
self.assertFalse(self.panel.is_shown())
|
|
77
77
|
|
|
78
78
|
|
|
79
|
+
class TestFormResponsesPanelWithNewPage(TestCase):
|
|
80
|
+
def setUp(self):
|
|
81
|
+
self.request = RequestFactory().get("/")
|
|
82
|
+
user = AnonymousUser() # technically, Anonymous users cannot access the admin
|
|
83
|
+
self.request.user = user
|
|
84
|
+
|
|
85
|
+
self.form_page = FormPage()
|
|
86
|
+
|
|
87
|
+
self.FormPageForm = get_form_for_model(
|
|
88
|
+
FormPage,
|
|
89
|
+
form_class=WagtailAdminPageForm,
|
|
90
|
+
fields=["title", "slug", "to_address", "from_address", "subject"],
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
panel = FormSubmissionsPanel().bind_to_model(FormPage)
|
|
94
|
+
self.panel = panel.get_bound_panel(
|
|
95
|
+
instance=self.form_page, form=self.FormPageForm(), request=self.request
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
def test_render_without_submissions(self):
|
|
99
|
+
"""The panel should not be shown if the number of submission is zero."""
|
|
100
|
+
self.assertFalse(self.panel.is_shown())
|
|
101
|
+
|
|
102
|
+
|
|
79
103
|
class TestFormResponsesPanelWithCustomSubmissionClass(WagtailTestUtils, TestCase):
|
|
80
104
|
def setUp(self):
|
|
81
105
|
self.request = RequestFactory().get("/")
|
|
@@ -1824,3 +1848,85 @@ class TestPreview(WagtailTestUtils, TestCase):
|
|
|
1824
1848
|
response = self.client.get(preview_url + params)
|
|
1825
1849
|
self.assertEqual(response.status_code, 200)
|
|
1826
1850
|
self.assertTemplateUsed(response, template)
|
|
1851
|
+
|
|
1852
|
+
|
|
1853
|
+
class TestFormPageCreate(WagtailTestUtils, TestCase):
|
|
1854
|
+
def setUp(self):
|
|
1855
|
+
# Find root page
|
|
1856
|
+
self.root_page = Page.objects.get(id=2)
|
|
1857
|
+
|
|
1858
|
+
# Login
|
|
1859
|
+
self.user = self.login()
|
|
1860
|
+
|
|
1861
|
+
def test_get_creation_form(self):
|
|
1862
|
+
response = self.client.get(
|
|
1863
|
+
reverse(
|
|
1864
|
+
"wagtailadmin_pages:add",
|
|
1865
|
+
args=("tests", "formpage", self.root_page.id),
|
|
1866
|
+
)
|
|
1867
|
+
)
|
|
1868
|
+
self.assertEqual(response.status_code, 200)
|
|
1869
|
+
|
|
1870
|
+
def test_post_creation_form(self):
|
|
1871
|
+
post_data = {
|
|
1872
|
+
"title": "Form page!",
|
|
1873
|
+
"slug": "contact-us",
|
|
1874
|
+
"form_fields-TOTAL_FORMS": "1",
|
|
1875
|
+
"form_fields-INITIAL_FORMS": "1",
|
|
1876
|
+
"form_fields-MIN_NUM_FORMS": "0",
|
|
1877
|
+
"form_fields-MAX_NUM_FORMS": "1000",
|
|
1878
|
+
"form_fields-0-id": "",
|
|
1879
|
+
"form_fields-0-label": "Field One",
|
|
1880
|
+
"form_fields-0-field_type": "singleline",
|
|
1881
|
+
}
|
|
1882
|
+
response = self.client.post(
|
|
1883
|
+
reverse(
|
|
1884
|
+
"wagtailadmin_pages:add",
|
|
1885
|
+
args=("tests", "formpage", self.root_page.id),
|
|
1886
|
+
),
|
|
1887
|
+
post_data,
|
|
1888
|
+
)
|
|
1889
|
+
# Find the page and check it
|
|
1890
|
+
page = Page.objects.get(slug="contact-us")
|
|
1891
|
+
|
|
1892
|
+
# Should be redirected to edit page
|
|
1893
|
+
self.assertRedirects(
|
|
1894
|
+
response, reverse("wagtailadmin_pages:edit", args=(page.id,))
|
|
1895
|
+
)
|
|
1896
|
+
|
|
1897
|
+
|
|
1898
|
+
class TestFormPageEdit(WagtailTestUtils, TestCase):
|
|
1899
|
+
def setUp(self):
|
|
1900
|
+
self.form_page = make_form_page()
|
|
1901
|
+
|
|
1902
|
+
# Login
|
|
1903
|
+
self.user = self.login()
|
|
1904
|
+
|
|
1905
|
+
def test_get_edit_form(self):
|
|
1906
|
+
response = self.client.get(
|
|
1907
|
+
reverse("wagtailadmin_pages:edit", args=(self.form_page.id,))
|
|
1908
|
+
)
|
|
1909
|
+
self.assertEqual(response.status_code, 200)
|
|
1910
|
+
|
|
1911
|
+
def test_post_edit_form(self):
|
|
1912
|
+
post_data = {
|
|
1913
|
+
"title": "Updated form page",
|
|
1914
|
+
"slug": "contact-us",
|
|
1915
|
+
"form_fields-TOTAL_FORMS": "1",
|
|
1916
|
+
"form_fields-INITIAL_FORMS": "1",
|
|
1917
|
+
"form_fields-MIN_NUM_FORMS": "0",
|
|
1918
|
+
"form_fields-MAX_NUM_FORMS": "1000",
|
|
1919
|
+
"form_fields-0-id": "",
|
|
1920
|
+
"form_fields-0-label": "Field One",
|
|
1921
|
+
"form_fields-0-field_type": "singleline",
|
|
1922
|
+
}
|
|
1923
|
+
response = self.client.post(
|
|
1924
|
+
reverse("wagtailadmin_pages:edit", args=(self.form_page.id,)),
|
|
1925
|
+
post_data,
|
|
1926
|
+
)
|
|
1927
|
+
# Should be redirected to edit page
|
|
1928
|
+
self.assertRedirects(
|
|
1929
|
+
response, reverse("wagtailadmin_pages:edit", args=(self.form_page.id,))
|
|
1930
|
+
)
|
|
1931
|
+
page = Page.objects.get(slug="contact-us").get_latest_revision_as_object()
|
|
1932
|
+
self.assertEqual(page.title, "Updated form page")
|
|
@@ -653,8 +653,15 @@ class ElasticsearchAutocompleteQueryCompilerImpl:
|
|
|
653
653
|
if len(fields) == 0:
|
|
654
654
|
# No fields. Return a query that'll match nothing
|
|
655
655
|
return {"bool": {"mustNot": {"match_all": {}}}}
|
|
656
|
-
|
|
657
|
-
|
|
656
|
+
elif isinstance(self.query, PlainText):
|
|
657
|
+
return self._compile_plaintext_query(self.query, fields)
|
|
658
|
+
elif isinstance(self.query, MatchAll):
|
|
659
|
+
return {"match_all": {}}
|
|
660
|
+
else:
|
|
661
|
+
raise NotImplementedError(
|
|
662
|
+
"`%s` is not supported for autocomplete queries."
|
|
663
|
+
% self.query.__class__.__name__
|
|
664
|
+
)
|
|
658
665
|
|
|
659
666
|
|
|
660
667
|
class Elasticsearch5AutocompleteQueryCompiler(
|
|
@@ -70,6 +70,31 @@ class TestElasticsearch5SearchQuery(TestCase):
|
|
|
70
70
|
}
|
|
71
71
|
self.assertDictEqual(query_compiler.get_query(), expected_result)
|
|
72
72
|
|
|
73
|
+
def test_match_all_autocomplete(self):
|
|
74
|
+
# Create a query
|
|
75
|
+
query = self.autocomplete_query_compiler_class(
|
|
76
|
+
models.Book.objects.all(), MATCH_ALL
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
# Check it
|
|
80
|
+
expected_result = {
|
|
81
|
+
"bool": {
|
|
82
|
+
"filter": {"match": {"content_type": "searchtests.Book"}},
|
|
83
|
+
"must": {"match_all": {}},
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
self.assertDictEqual(query.get_query(), expected_result)
|
|
87
|
+
|
|
88
|
+
def test_non_supported_queries_autocomplete(self):
|
|
89
|
+
# Create a query
|
|
90
|
+
query = self.autocomplete_query_compiler_class(
|
|
91
|
+
models.Book.objects.all(), Fuzzy("Hello")
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Check it
|
|
95
|
+
with self.assertRaises(NotImplementedError):
|
|
96
|
+
query.get_query()
|
|
97
|
+
|
|
73
98
|
def test_match_all(self):
|
|
74
99
|
# Create a query
|
|
75
100
|
query_compiler = self.query_compiler_class(models.Book.objects.all(), MATCH_ALL)
|
wagtail/test/testapp/models.py
CHANGED
|
@@ -49,6 +49,7 @@ from wagtail.contrib.forms.models import (
|
|
|
49
49
|
AbstractFormField,
|
|
50
50
|
AbstractFormSubmission,
|
|
51
51
|
)
|
|
52
|
+
from wagtail.contrib.forms.panels import FormSubmissionsPanel
|
|
52
53
|
from wagtail.contrib.forms.views import SubmissionsListView
|
|
53
54
|
from wagtail.contrib.settings.models import (
|
|
54
55
|
BaseGenericSetting,
|
|
@@ -568,6 +569,7 @@ class FormPage(AbstractEmailForm):
|
|
|
568
569
|
],
|
|
569
570
|
"Email",
|
|
570
571
|
),
|
|
572
|
+
FormSubmissionsPanel(),
|
|
571
573
|
]
|
|
572
574
|
|
|
573
575
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: wagtail
|
|
3
|
+
Version: 5.2.4
|
|
4
|
+
Summary: A Django content management system.
|
|
5
|
+
Home-page: https://wagtail.org/
|
|
6
|
+
Author: Wagtail core team + contributors
|
|
7
|
+
Author-email: hello@wagtail.org
|
|
8
|
+
License: BSD
|
|
9
|
+
Project-URL: Changelog, https://github.com/wagtail/wagtail/blob/main/CHANGELOG.txt
|
|
10
|
+
Project-URL: Documentation, https://docs.wagtail.org
|
|
11
|
+
Project-URL: Source, https://github.com/wagtail/wagtail
|
|
12
|
+
Project-URL: Tracker, https://github.com/wagtail/wagtail/issues
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Environment :: Web Environment
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved :: BSD License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Framework :: Django
|
|
25
|
+
Classifier: Framework :: Django :: 3.2
|
|
26
|
+
Classifier: Framework :: Django :: 4.1
|
|
27
|
+
Classifier: Framework :: Django :: 4.2
|
|
28
|
+
Classifier: Framework :: Django :: 5.0
|
|
29
|
+
Classifier: Framework :: Wagtail
|
|
30
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
31
|
+
Requires-Python: >=3.8
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
Requires-Dist: Django (<5.1,>=3.2)
|
|
34
|
+
Requires-Dist: django-modelcluster (<7.0,>=6.1)
|
|
35
|
+
Requires-Dist: django-permissionedforms (<1.0,>=0.1)
|
|
36
|
+
Requires-Dist: django-taggit (<5.0,>=2.0)
|
|
37
|
+
Requires-Dist: django-treebeard (<5.0,>=4.5.1)
|
|
38
|
+
Requires-Dist: djangorestframework (<4.0,>=3.11.1)
|
|
39
|
+
Requires-Dist: django-filter (<24,>=23.3)
|
|
40
|
+
Requires-Dist: draftjs-exporter (<3.0,>=2.1.5)
|
|
41
|
+
Requires-Dist: Pillow (<11.0.0,>=9.1.0)
|
|
42
|
+
Requires-Dist: beautifulsoup4 (<4.12,>=4.8)
|
|
43
|
+
Requires-Dist: html5lib (<2,>=0.999)
|
|
44
|
+
Requires-Dist: Willow[heif] (<1.7,>=1.6.2)
|
|
45
|
+
Requires-Dist: requests (<3.0,>=2.11.1)
|
|
46
|
+
Requires-Dist: l18n (>=2018.5)
|
|
47
|
+
Requires-Dist: openpyxl (<4.0,>=3.0.10)
|
|
48
|
+
Requires-Dist: anyascii (>=0.1.5)
|
|
49
|
+
Requires-Dist: telepath (<1,>=0.3.1)
|
|
50
|
+
Provides-Extra: docs
|
|
51
|
+
Requires-Dist: pyenchant (<4,>=3.1.1) ; extra == 'docs'
|
|
52
|
+
Requires-Dist: sphinxcontrib-spelling (<6,>=5.4.0) ; extra == 'docs'
|
|
53
|
+
Requires-Dist: Sphinx (>=1.5.2) ; extra == 'docs'
|
|
54
|
+
Requires-Dist: sphinx-autobuild (>=0.6.0) ; extra == 'docs'
|
|
55
|
+
Requires-Dist: sphinx-wagtail-theme (==6.1.1) ; extra == 'docs'
|
|
56
|
+
Requires-Dist: myst-parser (==0.18.1) ; extra == 'docs'
|
|
57
|
+
Requires-Dist: sphinx-copybutton (<1.0,>=0.5) ; extra == 'docs'
|
|
58
|
+
Provides-Extra: testing
|
|
59
|
+
Requires-Dist: python-dateutil (>=2.7) ; extra == 'testing'
|
|
60
|
+
Requires-Dist: pytz (>=2014.7) ; extra == 'testing'
|
|
61
|
+
Requires-Dist: Jinja2 (<3.2,>=3.0) ; extra == 'testing'
|
|
62
|
+
Requires-Dist: boto3 (<2,>=1.28) ; extra == 'testing'
|
|
63
|
+
Requires-Dist: freezegun (>=0.3.8) ; extra == 'testing'
|
|
64
|
+
Requires-Dist: azure-mgmt-cdn (<13.0,>=12.0) ; extra == 'testing'
|
|
65
|
+
Requires-Dist: azure-mgmt-frontdoor (<1.1,>=1.0) ; extra == 'testing'
|
|
66
|
+
Requires-Dist: django-pattern-library (<0.8,>=0.7) ; extra == 'testing'
|
|
67
|
+
Requires-Dist: coverage (>=3.7.0) ; extra == 'testing'
|
|
68
|
+
Requires-Dist: black (==22.3.0) ; extra == 'testing'
|
|
69
|
+
Requires-Dist: doc8 (==0.8.1) ; extra == 'testing'
|
|
70
|
+
Requires-Dist: ruff (==0.0.290) ; extra == 'testing'
|
|
71
|
+
Requires-Dist: semgrep (==1.40.0) ; extra == 'testing'
|
|
72
|
+
Requires-Dist: curlylint (==0.13.1) ; extra == 'testing'
|
|
73
|
+
Requires-Dist: djhtml (==1.5.2) ; extra == 'testing'
|
|
74
|
+
Requires-Dist: polib (<2.0,>=1.1) ; extra == 'testing'
|
|
75
|
+
Requires-Dist: factory-boy (>=3.2) ; extra == 'testing'
|
|
76
|
+
Requires-Dist: tblib (<3.0,>=2.0) ; extra == 'testing'
|
|
77
|
+
|
|
78
|
+
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.
|
|
79
|
+
|
|
80
|
+
For more details, see https://wagtail.org, https://docs.wagtail.org and https://github.com/wagtail/wagtail/.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
wagtail/__init__.py,sha256=
|
|
1
|
+
wagtail/__init__.py,sha256=jmetSduAfAHcC7kBOOD1M45uLzWe4wMk5AUNoUO9Z5g,724
|
|
2
2
|
wagtail/apps.py,sha256=38kXTdHoQzFnpUqDNxFpsqn2dut4V0u9rLOkhqCoYkc,713
|
|
3
3
|
wagtail/compat.py,sha256=L41FhlX4xy5KgTdJ63smtM78mtKf1mxkPeOs8kyOwS0,538
|
|
4
4
|
wagtail/coreutils.py,sha256=ZlmtoHC5YzXmhdKi13QkCSmBryAmS7k8s5jgQjahpEQ,20660
|
|
@@ -334,7 +334,7 @@ wagtail/admin/panels/page_chooser_panel.py,sha256=aOOvkbN0ONy2aeJWcsAc926O1NFttk
|
|
|
334
334
|
wagtail/admin/panels/page_utils.py,sha256=dBvYHofWP7-yWMY2KcmSVsC4-JJWdr9nNM5cQxUb4Mc,2297
|
|
335
335
|
wagtail/admin/panels/publishing_panel.py,sha256=zMUYL1ybwoiv3f1Za7pCOBKbzWHeA7dshTWV8Q3SN0A,2452
|
|
336
336
|
wagtail/admin/panels/signal_handlers.py,sha256=BOpF4PKqvGqz1qarMM2P7uzJaELDF9uYMOieXY2Xh-o,705
|
|
337
|
-
wagtail/admin/panels/title_field_panel.py,sha256=
|
|
337
|
+
wagtail/admin/panels/title_field_panel.py,sha256=md9ZV0IImKNKavALsQjVrO3kijKhHF9HUOknKXB4mEA,4868
|
|
338
338
|
wagtail/admin/rich_text/__init__.py,sha256=HcMHRljUQSC4nomdfxT44cNrTtdFp-OHMOlpzb_Fnhs,965
|
|
339
339
|
wagtail/admin/rich_text/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
340
340
|
wagtail/admin/rich_text/converters/contentstate.py,sha256=kdeaIioSf3bbKD7bAoESdQHirXzC6nzJdSAehQAyTWA,4927
|
|
@@ -846,7 +846,7 @@ wagtail/admin/tests/test_compare.py,sha256=NpPtmLNWdArAp91-OIFRozcXjKA1FUV5tgI3r
|
|
|
846
846
|
wagtail/admin/tests/test_contentstate.py,sha256=C8hzm30KP6KJH6Q7CzNojamPl_78aUdqRkq3VybPhGE,73011
|
|
847
847
|
wagtail/admin/tests/test_dbwhitelister.py,sha256=uKlqTviGnlD1dClroq9Y1wOXLIfZWA4LvsfCtYW5S-E,6069
|
|
848
848
|
wagtail/admin/tests/test_dismissibles.py,sha256=JKXt8SucZcAp4IkKNMQU7-qrm8oMu8vDKnyTdTUbAYo,2671
|
|
849
|
-
wagtail/admin/tests/test_edit_handlers.py,sha256=
|
|
849
|
+
wagtail/admin/tests/test_edit_handlers.py,sha256=yURSoqfc5bHJatbPuXVP-dnjY5JXSC_NqTgFcd8KznI,99249
|
|
850
850
|
wagtail/admin/tests/test_filters.py,sha256=PVRp_XbxggZ0IT-ZnZJZF0SZVxAtV39nZcDSSQxtBFU,3843
|
|
851
851
|
wagtail/admin/tests/test_forms.py,sha256=RsIFiDlE5b3Wbm7bJAfvSjElM8qA-Iaxrzqwmiq_kW0,994
|
|
852
852
|
wagtail/admin/tests/test_html_ruleset.py,sha256=QCSL8JGVyHQapCdGSgCFUTlsIgi2p8weugyQo4A-X7k,1743
|
|
@@ -869,12 +869,12 @@ wagtail/admin/tests/test_views.py,sha256=1i8N2Ao6rIbCY9wRXqNQzfSsAojnFxJ1TtI7JYf
|
|
|
869
869
|
wagtail/admin/tests/test_views_generic.py,sha256=FQJLz9aD7OtToCCwtlYs-Bu_0BxSM99R-jGE4ZPnfAM,2934
|
|
870
870
|
wagtail/admin/tests/test_whats_new.py,sha256=Vptrf94ilJephOP3O7s1FKLtjNxFLCne6Bi4c_VlJzw,5570
|
|
871
871
|
wagtail/admin/tests/test_widgets.py,sha256=3NIcu5Ktx6i5kAn8kSdW3HBg-SSVi8BspR-THj8aQ0Y,24656
|
|
872
|
-
wagtail/admin/tests/test_workflows.py,sha256=
|
|
872
|
+
wagtail/admin/tests/test_workflows.py,sha256=f2zd-Baa0ZW3zA-WztgKTAGLkwksUlAQRdA6osnWmdU,145781
|
|
873
873
|
wagtail/admin/tests/tests.py,sha256=GveGPLq49kvtr6J6Qz1-Cv1YHgjPxGk_amOgTeNslaU,22323
|
|
874
874
|
wagtail/admin/tests/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
875
875
|
wagtail/admin/tests/api/test_documents.py,sha256=2dfjTi6Bj3otRQ-ok9f3rwl-HpSmprfcmhWyYPDnXcs,5051
|
|
876
876
|
wagtail/admin/tests/api/test_images.py,sha256=JTVOPWDeI5y1dZfuL1wS_kXuNC2q45QoMpflSTtvreI,9304
|
|
877
|
-
wagtail/admin/tests/api/test_pages.py,sha256=
|
|
877
|
+
wagtail/admin/tests/api/test_pages.py,sha256=30_NuekkimRUJX0Lr6eekP-9Wf69-R_YkKiMt59lpms,71794
|
|
878
878
|
wagtail/admin/tests/api/utils.py,sha256=VW2E7P-Yq-n6rsgvRhwXk3Tuyic8uVIx6xcFZV5yoN4,236
|
|
879
879
|
wagtail/admin/tests/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
880
880
|
wagtail/admin/tests/pages/test_content_type_use_view.py,sha256=4ekBbMbIjpvEW7cmXuy2bP2tmI3rUNk1sx6cL7A_EW4,1336
|
|
@@ -908,7 +908,7 @@ wagtail/admin/tests/ui/test_tables.py,sha256=LSZu_E8pD7l4yJz4YjJlZ0vdk1edkHdHejV
|
|
|
908
908
|
wagtail/admin/tests/viewsets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
909
909
|
wagtail/admin/tests/viewsets/test_base_viewset.py,sha256=_6DhpxiinfXr-wjQfh0tcL1skZi1KXVlZLJpxCwazog,1537
|
|
910
910
|
wagtail/admin/tests/viewsets/test_chooser_viewset.py,sha256=fIoBQ3u_J-ZhWvpATq7BLEzCet7_hOl383xGIgFtf7E,2039
|
|
911
|
-
wagtail/admin/tests/viewsets/test_model_viewset.py,sha256=
|
|
911
|
+
wagtail/admin/tests/viewsets/test_model_viewset.py,sha256=xK11mvtyCD7DU9bNzVkIHuC2m1Pn5pAoKbKyWTGhMTI,50082
|
|
912
912
|
wagtail/admin/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
913
913
|
wagtail/admin/ui/components.py,sha256=He-K0puoWcxgH_vyXfO2OoO9iSo-pCTM-aVBqYHSrFs,1074
|
|
914
914
|
wagtail/admin/ui/fields.py,sha256=QQBV9L8w6L5w8E6DG8LKqrlIzz1K5leFSxfM67v6L1Q,1377
|
|
@@ -940,14 +940,14 @@ wagtail/admin/views/bulk_action/registry.py,sha256=e9-rN9TdHUmRwDfTeauvPUjE6p3ip
|
|
|
940
940
|
wagtail/admin/views/generic/__init__.py,sha256=_FnNGhm9fVAblGcipJ0DLyqKZ3syQYG3v4OZK6qOR-4,650
|
|
941
941
|
wagtail/admin/views/generic/base.py,sha256=xm3Z2jnHkTWMWdZKlZ68yjeaIfcTwTPYndI7-uhfAV4,7056
|
|
942
942
|
wagtail/admin/views/generic/chooser.py,sha256=pjOYGcYBHc1ZkZJ4LWcHkoGNQ7U7GdKBsJZ0vyOO4kc,18061
|
|
943
|
-
wagtail/admin/views/generic/history.py,sha256=
|
|
943
|
+
wagtail/admin/views/generic/history.py,sha256=1agfpkggAJb6-2P0tFj0CVphtZ8fynlcHSwLF_NlQ08,10269
|
|
944
944
|
wagtail/admin/views/generic/lock.py,sha256=dvZ613n3itNAhO3zdQzGRewm2kH-dyemx-LSuUC2AHM,1435
|
|
945
945
|
wagtail/admin/views/generic/mixins.py,sha256=Gxt02gof4SRdEGtUkWBygiDK01OsmhL-7nZK00fAbAI,28123
|
|
946
946
|
wagtail/admin/views/generic/models.py,sha256=XthJ6TaXDXvlxWCRMmNXGAGBwlqGfdW60TzmH9h0sJ4,50194
|
|
947
947
|
wagtail/admin/views/generic/multiple_upload.py,sha256=rgf3uXZShyZ_2rnidfk_tnU4YhHcXyPwrIKMKWIk78s,13031
|
|
948
948
|
wagtail/admin/views/generic/permissions.py,sha256=yOZFjz9pteBTnI2KayW-lYOu4mCl-kDDGjN029AptzA,1477
|
|
949
949
|
wagtail/admin/views/generic/preview.py,sha256=9tvUJoz55b0bKY4vvfqnDMNke3TTeSPaEamvrICYR9Q,5655
|
|
950
|
-
wagtail/admin/views/generic/usage.py,sha256=
|
|
950
|
+
wagtail/admin/views/generic/usage.py,sha256=CVdvz47WOr9xfYu5RaZltUPJII5VyG5eMLkQtDQ1S8U,4531
|
|
951
951
|
wagtail/admin/views/generic/workflow.py,sha256=u8mv-rdFeO0UmDaWVzzwtlXRaTZ_ZQzTEl1dwMtW-r8,9429
|
|
952
952
|
wagtail/admin/views/pages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
953
953
|
wagtail/admin/views/pages/convert_alias.py,sha256=hWKn1Uc2w4Z5ciq_ncsznRihiRXLFOgC2mNNFUgI7bM,1858
|
|
@@ -979,7 +979,7 @@ wagtail/admin/views/reports/aging_pages.py,sha256=AgdoEXa5Y8Gvfv6DpCiZV-A6YSF5Vk
|
|
|
979
979
|
wagtail/admin/views/reports/audit_logging.py,sha256=YAcNFGgVhUTp-XX0QZ8vuTKdiI3TLpMctdOAra3f0mY,8350
|
|
980
980
|
wagtail/admin/views/reports/base.py,sha256=ePpmLbRS5wsH3Z_02sC8x97S3p1uoWlIOffBtrw2f1E,1581
|
|
981
981
|
wagtail/admin/views/reports/locked_pages.py,sha256=9CVqHRYODp3Y3gw1IE4Q4M6iizmgXZCzQcD7o-5FtcQ,2206
|
|
982
|
-
wagtail/admin/views/reports/workflows.py,sha256=
|
|
982
|
+
wagtail/admin/views/reports/workflows.py,sha256=25KeVcZvApN4Xhah-fpLdObeFg3M6eHYl9lZSqM7WCQ,8899
|
|
983
983
|
wagtail/admin/viewsets/__init__.py,sha256=k_ZRVEmUEHmj7mVPJSTfJGDlsauTLX6loPPN0aD2v14,1476
|
|
984
984
|
wagtail/admin/viewsets/base.py,sha256=BNEM5XeX7TPetydJ7Dhh3qFRCDrCt8HlgN6e8JE_ws8,4998
|
|
985
985
|
wagtail/admin/viewsets/chooser.py,sha256=t9fzFyilR_5kYfTls4s9N-WYuwwniLZOlvkZ0-R0McQ,9356
|
|
@@ -1029,7 +1029,7 @@ wagtail/contrib/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
1029
1029
|
wagtail/contrib/forms/apps.py,sha256=OY2eHr8Jetf9FYnTTcfWX4XgiG_gWfSGS7ndwMuq5po,285
|
|
1030
1030
|
wagtail/contrib/forms/forms.py,sha256=b0LO8VbvTaX6RxVdnId2zM3ouzHvVtU8qyiFWeBR_EA,7583
|
|
1031
1031
|
wagtail/contrib/forms/models.py,sha256=tiZQoObhuPngA63q1gO_fKKO9n-V0ohYcLJylkCxbh8,12035
|
|
1032
|
-
wagtail/contrib/forms/panels.py,sha256=
|
|
1032
|
+
wagtail/contrib/forms/panels.py,sha256=zI3bFM1X5iT_fnxQUe5BWWN5iQKm6tEFEiaFhNRZcwk,1556
|
|
1033
1033
|
wagtail/contrib/forms/urls.py,sha256=Gph_x_24NvsHgVPuZmD5w4G74F411YEFEvhX2mKF0QM,501
|
|
1034
1034
|
wagtail/contrib/forms/utils.py,sha256=5bJcX15-X0ocf46c4KUTcrscNaEznB5lmoBlFXjBF0c,1430
|
|
1035
1035
|
wagtail/contrib/forms/views.py,sha256=xeC6uWfNCaZDloGCNDUHWbYU-23hZ4oIoLPqPbWzfHE,11746
|
|
@@ -1162,7 +1162,7 @@ wagtail/contrib/forms/templates/wagtailforms/panels/form_responses_panel.html,sh
|
|
|
1162
1162
|
wagtail/contrib/forms/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1163
1163
|
wagtail/contrib/forms/tests/test_forms.py,sha256=7tRUwJA2j9xzr28NpRC9hDYeOEfR1VTmBCPlny7UPVw,13634
|
|
1164
1164
|
wagtail/contrib/forms/tests/test_models.py,sha256=c1kPz-TWvIbqm16uUp5Ln8ndqhv6S2dFBS2IPZJdgXM,31728
|
|
1165
|
-
wagtail/contrib/forms/tests/test_views.py,sha256=
|
|
1165
|
+
wagtail/contrib/forms/tests/test_views.py,sha256=rXirGlom9s9veeodsYEU3mcBTCsRryT3D-pjErI05nM,73044
|
|
1166
1166
|
wagtail/contrib/forms/tests/utils.py,sha256=OESefxdqGRgL1lDItVPSFNw_FJNB4X0PvozdvAhrpkc,6043
|
|
1167
1167
|
wagtail/contrib/frontend_cache/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1168
1168
|
wagtail/contrib/frontend_cache/apps.py,sha256=y-TyHADOpdCrIQ7zfnVD6OOxjo28lnBhPJeBtjlPih4,407
|
|
@@ -3176,7 +3176,7 @@ wagtail/search/signal_handlers.py,sha256=Md4dhmwLF7kX7YLG-MsqTLQ6NdfkFIavBJ9n5Os
|
|
|
3176
3176
|
wagtail/search/utils.py,sha256=PnF65FM5Udc7mZ8J2oBMJ15T6vYGL0N69awp_RgEDmc,6210
|
|
3177
3177
|
wagtail/search/backends/__init__.py,sha256=nJEc435WnprL13v7OwcUCyHz0CTXMCMar9xTRqn1rH8,3455
|
|
3178
3178
|
wagtail/search/backends/base.py,sha256=M7lyovOz2Wau_UwjyEk7AYeQOLt6Q3Lm2hUHDUoEVNg,16806
|
|
3179
|
-
wagtail/search/backends/elasticsearch5.py,sha256=
|
|
3179
|
+
wagtail/search/backends/elasticsearch5.py,sha256=lfhUvXUafpmnw0kqdZVr9LBSUMjUuehMkixzj6rYYls,39018
|
|
3180
3180
|
wagtail/search/backends/elasticsearch6.py,sha256=L9B3rh1T9q5rFjtWh8CRgntSmoMbv5CVGTGEQIJmRpM,9048
|
|
3181
3181
|
wagtail/search/backends/elasticsearch7.py,sha256=hpjj_SA5yjTs2lrjTguI1o1XVepXqgO-1_XWwhLiiUk,4864
|
|
3182
3182
|
wagtail/search/backends/elasticsearch8.py,sha256=n3y05d_atzbnkaM4F1BXp3OhayE-J6uzfggYBdw2rBo,3750
|
|
@@ -3309,7 +3309,7 @@ wagtail/search/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
3309
3309
|
wagtail/search/tests/elasticsearch_common_tests.py,sha256=aifEijThsfzK7NYwbvjVdr36fW_ckXMesHtX-tDwPpw,7817
|
|
3310
3310
|
wagtail/search/tests/test_backends.py,sha256=DBOFXu2W6hAtH-KHnOjn7IBXWHfOWkJJW2Ery7eKzSs,40719
|
|
3311
3311
|
wagtail/search/tests/test_db_backend.py,sha256=X_x2yDApntvCRq4pL9UM1Q-DRY5WFCR_aaSnCbkcf4s,2031
|
|
3312
|
-
wagtail/search/tests/test_elasticsearch5_backend.py,sha256=
|
|
3312
|
+
wagtail/search/tests/test_elasticsearch5_backend.py,sha256=rObmzJmZ4-iM7UXUterLfCoT7rIYIGVUGNEUmB1EaME,43702
|
|
3313
3313
|
wagtail/search/tests/test_elasticsearch6_backend.py,sha256=M1QmKDJrTQulbsiEX0AFQDyihoieusZ0UVW17rNDoeo,47213
|
|
3314
3314
|
wagtail/search/tests/test_elasticsearch7_backend.py,sha256=NxjMGh1vUjgmaLn6MqULX-FA4OlGOZ7VvOslOnW_JKs,46344
|
|
3315
3315
|
wagtail/search/tests/test_elasticsearch8_backend.py,sha256=3EKGnVO8ldl8em5rE0xG4b_BXVFvh7QGk719FSXGbzE,482
|
|
@@ -3721,7 +3721,7 @@ wagtail/test/testapp/apps.py,sha256=NIqHOtcWNoM35crZpziUcE5nzmHtcb-PQgtDKjOKV34,
|
|
|
3721
3721
|
wagtail/test/testapp/blocks.py,sha256=GUzxM5RVmRHiDk7fmNtFGzfuO1WKJnmAEzJK8Ot52mU,971
|
|
3722
3722
|
wagtail/test/testapp/forms.py,sha256=jDu_6eF5DzRF3ww-9hGLKCyE90InGLQoiwkTjPQX5qo,1438
|
|
3723
3723
|
wagtail/test/testapp/media_forms.py,sha256=TVphjCtSfK90cl6p8lfz7hb5fUzAFmBb4KW0u3pOFa4,798
|
|
3724
|
-
wagtail/test/testapp/models.py,sha256=
|
|
3724
|
+
wagtail/test/testapp/models.py,sha256=vaSIte1rgY84-wvUYDIW7CZNhBi9qNaGFjLu0kgk6Po,60366
|
|
3725
3725
|
wagtail/test/testapp/rich_text.py,sha256=IbihBydjtAbJJLbwvVm4wW9OTgMkKU1lCrOFtpXCNEk,629
|
|
3726
3726
|
wagtail/test/testapp/urls.py,sha256=2zQPbGiM8e53nGkxu4ZtECjlalBk_t-pTPyapfiKwXc,559
|
|
3727
3727
|
wagtail/test/testapp/views.py,sha256=3NXrox9yW8-9HN5nmVoNdp5LlSrXGWq0bpmip1rM2zw,8432
|
|
@@ -4070,9 +4070,9 @@ wagtail/utils/urlpatterns.py,sha256=RDhVScxdm-RV4HSMjWElyrbEoTPsXu841_SKMgoFKtY,
|
|
|
4070
4070
|
wagtail/utils/utils.py,sha256=UALGn0KOyqi5ZoXOozWX99ZPUsVZP51ET8d7sZ1jlm0,430
|
|
4071
4071
|
wagtail/utils/version.py,sha256=40WGMIy8nSPQJFF01p7c38L444SexH2Cb-bQmR8ztXg,1478
|
|
4072
4072
|
wagtail/utils/widgets.py,sha256=oTpTMcmQ0Y4MugbSKp_Uigl97ftWdHvMfvhrrLyVmBs,1529
|
|
4073
|
-
wagtail-5.2.
|
|
4074
|
-
wagtail-5.2.
|
|
4075
|
-
wagtail-5.2.
|
|
4076
|
-
wagtail-5.2.
|
|
4077
|
-
wagtail-5.2.
|
|
4078
|
-
wagtail-5.2.
|
|
4073
|
+
wagtail-5.2.4.dist-info/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
|
|
4074
|
+
wagtail-5.2.4.dist-info/METADATA,sha256=1XqOblIzPCZys_AyynwCkFYDcXIxpkcicWerrBMJMB4,3855
|
|
4075
|
+
wagtail-5.2.4.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
|
4076
|
+
wagtail-5.2.4.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
|
|
4077
|
+
wagtail-5.2.4.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
|
|
4078
|
+
wagtail-5.2.4.dist-info/RECORD,,
|
wagtail-5.2.2.dist-info/METADATA
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: wagtail
|
|
3
|
-
Version: 5.2.2
|
|
4
|
-
Summary: A Django content management system.
|
|
5
|
-
Home-page: https://wagtail.org/
|
|
6
|
-
Author: Wagtail core team + contributors
|
|
7
|
-
Author-email: hello@wagtail.org
|
|
8
|
-
License: BSD
|
|
9
|
-
Project-URL: Changelog, https://github.com/wagtail/wagtail/blob/main/CHANGELOG.txt
|
|
10
|
-
Project-URL: Documentation, https://docs.wagtail.org
|
|
11
|
-
Project-URL: Source, https://github.com/wagtail/wagtail
|
|
12
|
-
Project-URL: Tracker, https://github.com/wagtail/wagtail/issues
|
|
13
|
-
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
-
Classifier: Environment :: Web Environment
|
|
15
|
-
Classifier: Intended Audience :: Developers
|
|
16
|
-
Classifier: License :: OSI Approved :: BSD License
|
|
17
|
-
Classifier: Operating System :: OS Independent
|
|
18
|
-
Classifier: Programming Language :: Python
|
|
19
|
-
Classifier: Programming Language :: Python :: 3
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
21
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
22
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
-
Classifier: Framework :: Django
|
|
25
|
-
Classifier: Framework :: Django :: 3.2
|
|
26
|
-
Classifier: Framework :: Django :: 4.1
|
|
27
|
-
Classifier: Framework :: Django :: 4.2
|
|
28
|
-
Classifier: Framework :: Django :: 5.0
|
|
29
|
-
Classifier: Framework :: Wagtail
|
|
30
|
-
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
31
|
-
Requires-Python: >=3.8
|
|
32
|
-
License-File: LICENSE
|
|
33
|
-
Requires-Dist: Django <5.1,>=3.2
|
|
34
|
-
Requires-Dist: django-modelcluster <7.0,>=6.1
|
|
35
|
-
Requires-Dist: django-permissionedforms <1.0,>=0.1
|
|
36
|
-
Requires-Dist: django-taggit <5.0,>=2.0
|
|
37
|
-
Requires-Dist: django-treebeard <5.0,>=4.5.1
|
|
38
|
-
Requires-Dist: djangorestframework <4.0,>=3.11.1
|
|
39
|
-
Requires-Dist: django-filter <24,>=23.3
|
|
40
|
-
Requires-Dist: draftjs-exporter <3.0,>=2.1.5
|
|
41
|
-
Requires-Dist: Pillow <11.0.0,>=9.1.0
|
|
42
|
-
Requires-Dist: beautifulsoup4 <4.12,>=4.8
|
|
43
|
-
Requires-Dist: html5lib <2,>=0.999
|
|
44
|
-
Requires-Dist: Willow[heif] <1.7,>=1.6.2
|
|
45
|
-
Requires-Dist: requests <3.0,>=2.11.1
|
|
46
|
-
Requires-Dist: l18n >=2018.5
|
|
47
|
-
Requires-Dist: openpyxl <4.0,>=3.0.10
|
|
48
|
-
Requires-Dist: anyascii >=0.1.5
|
|
49
|
-
Requires-Dist: telepath <1,>=0.1.1
|
|
50
|
-
Provides-Extra: docs
|
|
51
|
-
Requires-Dist: pyenchant <4,>=3.1.1 ; extra == 'docs'
|
|
52
|
-
Requires-Dist: sphinxcontrib-spelling <6,>=5.4.0 ; extra == 'docs'
|
|
53
|
-
Requires-Dist: Sphinx >=1.5.2 ; extra == 'docs'
|
|
54
|
-
Requires-Dist: sphinx-autobuild >=0.6.0 ; extra == 'docs'
|
|
55
|
-
Requires-Dist: sphinx-wagtail-theme ==6.1.1 ; extra == 'docs'
|
|
56
|
-
Requires-Dist: myst-parser ==0.18.1 ; extra == 'docs'
|
|
57
|
-
Requires-Dist: sphinx-copybutton <1.0,>=0.5 ; extra == 'docs'
|
|
58
|
-
Provides-Extra: testing
|
|
59
|
-
Requires-Dist: python-dateutil >=2.7 ; extra == 'testing'
|
|
60
|
-
Requires-Dist: pytz >=2014.7 ; extra == 'testing'
|
|
61
|
-
Requires-Dist: Jinja2 <3.2,>=3.0 ; extra == 'testing'
|
|
62
|
-
Requires-Dist: boto3 <2,>=1.28 ; extra == 'testing'
|
|
63
|
-
Requires-Dist: freezegun >=0.3.8 ; extra == 'testing'
|
|
64
|
-
Requires-Dist: azure-mgmt-cdn <13.0,>=12.0 ; extra == 'testing'
|
|
65
|
-
Requires-Dist: azure-mgmt-frontdoor <1.1,>=1.0 ; extra == 'testing'
|
|
66
|
-
Requires-Dist: django-pattern-library <0.8,>=0.7 ; extra == 'testing'
|
|
67
|
-
Requires-Dist: coverage >=3.7.0 ; extra == 'testing'
|
|
68
|
-
Requires-Dist: black ==22.3.0 ; extra == 'testing'
|
|
69
|
-
Requires-Dist: doc8 ==0.8.1 ; extra == 'testing'
|
|
70
|
-
Requires-Dist: ruff ==0.0.290 ; extra == 'testing'
|
|
71
|
-
Requires-Dist: semgrep ==1.40.0 ; extra == 'testing'
|
|
72
|
-
Requires-Dist: curlylint ==0.13.1 ; extra == 'testing'
|
|
73
|
-
Requires-Dist: djhtml ==1.5.2 ; extra == 'testing'
|
|
74
|
-
Requires-Dist: polib <2.0,>=1.1 ; extra == 'testing'
|
|
75
|
-
Requires-Dist: factory-boy >=3.2 ; extra == 'testing'
|
|
76
|
-
Requires-Dist: tblib <3.0,>=2.0 ; extra == 'testing'
|
|
77
|
-
|
|
78
|
-
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.
|
|
79
|
-
|
|
80
|
-
For more details, see https://wagtail.org, https://docs.wagtail.org and https://github.com/wagtail/wagtail/.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|