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