wagtail 6.0.3__py3-none-any.whl → 6.0.5__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/views/generic/__init__.py +1 -0
- wagtail/admin/views/generic/models.py +10 -4
- wagtail/contrib/settings/tests/generic/test_admin.py +144 -16
- wagtail/contrib/settings/tests/site_specific/test_admin.py +142 -17
- wagtail/contrib/settings/views.py +3 -0
- wagtail/snippets/tests/test_snippets.py +18 -10
- wagtail/snippets/views/snippets.py +3 -11
- wagtail-6.0.5.dist-info/METADATA +79 -0
- {wagtail-6.0.3.dist-info → wagtail-6.0.5.dist-info}/RECORD +14 -14
- {wagtail-6.0.3.dist-info → wagtail-6.0.5.dist-info}/WHEEL +1 -1
- wagtail-6.0.3.dist-info/METADATA +0 -79
- {wagtail-6.0.3.dist-info → wagtail-6.0.5.dist-info}/LICENSE +0 -0
- {wagtail-6.0.3.dist-info → wagtail-6.0.5.dist-info}/entry_points.txt +0 -0
- {wagtail-6.0.3.dist-info → wagtail-6.0.5.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, 0,
|
|
9
|
+
VERSION = (6, 0, 5, "final", 1)
|
|
10
10
|
|
|
11
11
|
__version__ = get_version(VERSION)
|
|
12
12
|
|
|
@@ -676,12 +676,18 @@ class CreateView(
|
|
|
676
676
|
return super().form_invalid(form)
|
|
677
677
|
|
|
678
678
|
|
|
679
|
-
class
|
|
679
|
+
class CopyViewMixin:
|
|
680
680
|
def get_object(self, queryset=None):
|
|
681
|
-
return get_object_or_404(
|
|
681
|
+
return get_object_or_404(
|
|
682
|
+
self.model, pk=unquote(str(self.kwargs[self.pk_url_kwarg]))
|
|
683
|
+
)
|
|
682
684
|
|
|
683
|
-
def
|
|
684
|
-
return
|
|
685
|
+
def get_initial_form_instance(self):
|
|
686
|
+
return self.get_object()
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
class CopyView(CopyViewMixin, CreateView):
|
|
690
|
+
pass
|
|
685
691
|
|
|
686
692
|
|
|
687
693
|
class EditView(
|
|
@@ -77,11 +77,6 @@ class BaseTestGenericSettingView(WagtailTestUtils, TestCase):
|
|
|
77
77
|
class TestGenericSettingCreateView(BaseTestGenericSettingView):
|
|
78
78
|
def setUp(self):
|
|
79
79
|
self.user = self.login()
|
|
80
|
-
self.user.user_permissions.add(
|
|
81
|
-
Permission.objects.get(
|
|
82
|
-
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
83
|
-
)
|
|
84
|
-
)
|
|
85
80
|
|
|
86
81
|
def test_get_edit(self):
|
|
87
82
|
response = self.get()
|
|
@@ -113,11 +108,62 @@ class TestGenericSettingCreateView(BaseTestGenericSettingView):
|
|
|
113
108
|
# Ensure the form supports file uploads
|
|
114
109
|
self.assertContains(response, 'enctype="multipart/form-data"')
|
|
115
110
|
|
|
116
|
-
def
|
|
111
|
+
def test_create_restricted_field_without_any_permission(self):
|
|
112
|
+
# User has no permissions over the setting model, only access to the admin
|
|
117
113
|
self.user.is_superuser = False
|
|
118
114
|
self.user.save()
|
|
115
|
+
self.user.user_permissions.add(
|
|
116
|
+
Permission.objects.get(
|
|
117
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
118
|
+
),
|
|
119
|
+
)
|
|
119
120
|
|
|
120
121
|
self.assertFalse(TestPermissionedGenericSetting.objects.exists())
|
|
122
|
+
# GET should redirect away with permission denied
|
|
123
|
+
response = self.get(setting=TestPermissionedGenericSetting)
|
|
124
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
125
|
+
|
|
126
|
+
# the GET might create a setting object, depending on when the permission check is done,
|
|
127
|
+
# so remove any created objects prior to testing the POST
|
|
128
|
+
TestPermissionedGenericSetting.objects.all().delete()
|
|
129
|
+
|
|
130
|
+
# POST should redirect away with permission denied
|
|
131
|
+
response = self.post(
|
|
132
|
+
post_data={"sensitive_email": "test@example.com", "title": "test"},
|
|
133
|
+
setting=TestPermissionedGenericSetting,
|
|
134
|
+
)
|
|
135
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
136
|
+
|
|
137
|
+
# The retrieved setting should contain none of the submitted data
|
|
138
|
+
setting = TestPermissionedGenericSetting.load()
|
|
139
|
+
self.assertEqual(setting.title, "")
|
|
140
|
+
self.assertEqual(setting.sensitive_email, "")
|
|
141
|
+
|
|
142
|
+
def test_create_restricted_field_without_field_permission(self):
|
|
143
|
+
# User has edit permission over the setting model, but not the sensitive_email field
|
|
144
|
+
self.user.is_superuser = False
|
|
145
|
+
self.user.save()
|
|
146
|
+
self.user.user_permissions.add(
|
|
147
|
+
Permission.objects.get(
|
|
148
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
149
|
+
),
|
|
150
|
+
Permission.objects.get(
|
|
151
|
+
content_type__app_label="tests",
|
|
152
|
+
codename="change_testpermissionedgenericsetting",
|
|
153
|
+
),
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
self.assertFalse(TestPermissionedGenericSetting.objects.exists())
|
|
157
|
+
# GET should provide a form with title but not sensitive_email
|
|
158
|
+
response = self.get(setting=TestPermissionedGenericSetting)
|
|
159
|
+
self.assertEqual(response.status_code, 200)
|
|
160
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
161
|
+
self.assertNotIn("sensitive_email", list(response.context["form"].fields))
|
|
162
|
+
|
|
163
|
+
# the GET creates a setting object, so remove any created objects prior to testing the POST
|
|
164
|
+
TestPermissionedGenericSetting.objects.all().delete()
|
|
165
|
+
|
|
166
|
+
# POST should allow the title to be set, but not the sensitive_email
|
|
121
167
|
response = self.post(
|
|
122
168
|
post_data={"sensitive_email": "test@example.com", "title": "test"},
|
|
123
169
|
setting=TestPermissionedGenericSetting,
|
|
@@ -129,11 +175,31 @@ class TestGenericSettingCreateView(BaseTestGenericSettingView):
|
|
|
129
175
|
self.assertEqual(settings.sensitive_email, "")
|
|
130
176
|
|
|
131
177
|
def test_create_restricted_field(self):
|
|
178
|
+
# User has edit permission over the setting model, including the sensitive_email field
|
|
132
179
|
self.user.is_superuser = False
|
|
133
180
|
self.user.save()
|
|
134
181
|
self.user.user_permissions.add(
|
|
135
|
-
Permission.objects.get(
|
|
182
|
+
Permission.objects.get(
|
|
183
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
184
|
+
),
|
|
185
|
+
Permission.objects.get(
|
|
186
|
+
content_type__app_label="tests",
|
|
187
|
+
codename="change_testpermissionedgenericsetting",
|
|
188
|
+
),
|
|
189
|
+
Permission.objects.get(codename="can_edit_sensitive_email_generic_setting"),
|
|
136
190
|
)
|
|
191
|
+
|
|
192
|
+
self.assertFalse(TestPermissionedGenericSetting.objects.exists())
|
|
193
|
+
# GET should provide a form with title and sensitive_email
|
|
194
|
+
response = self.get(setting=TestPermissionedGenericSetting)
|
|
195
|
+
self.assertEqual(response.status_code, 200)
|
|
196
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
197
|
+
self.assertIn("sensitive_email", list(response.context["form"].fields))
|
|
198
|
+
|
|
199
|
+
# the GET creates a setting object, so remove any created objects prior to testing the POST
|
|
200
|
+
TestPermissionedGenericSetting.objects.all().delete()
|
|
201
|
+
|
|
202
|
+
# POST should allow both title and sensitive_email to be set
|
|
137
203
|
self.assertFalse(TestPermissionedGenericSetting.objects.exists())
|
|
138
204
|
response = self.post(
|
|
139
205
|
post_data={"sensitive_email": "test@example.com", "title": "test"},
|
|
@@ -153,11 +219,6 @@ class TestGenericSettingEditView(BaseTestGenericSettingView):
|
|
|
153
219
|
self.test_setting.save()
|
|
154
220
|
|
|
155
221
|
self.user = self.login()
|
|
156
|
-
self.user.user_permissions.add(
|
|
157
|
-
Permission.objects.get(
|
|
158
|
-
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
222
|
|
|
162
223
|
def test_get_edit(self):
|
|
163
224
|
response = self.get()
|
|
@@ -197,48 +258,115 @@ class TestGenericSettingEditView(BaseTestGenericSettingView):
|
|
|
197
258
|
)
|
|
198
259
|
|
|
199
260
|
def test_edit_restricted_field(self):
|
|
261
|
+
# User has edit permission over the setting model, including the sensitive_email field
|
|
200
262
|
test_setting = TestPermissionedGenericSetting()
|
|
201
263
|
test_setting.sensitive_email = "test@example.com"
|
|
264
|
+
test_setting.title = "Old title"
|
|
202
265
|
test_setting.save()
|
|
203
266
|
self.user.is_superuser = False
|
|
204
267
|
self.user.save()
|
|
205
268
|
|
|
206
269
|
self.user.user_permissions.add(
|
|
207
|
-
Permission.objects.get(
|
|
270
|
+
Permission.objects.get(
|
|
271
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
272
|
+
),
|
|
273
|
+
Permission.objects.get(
|
|
274
|
+
content_type__app_label="tests",
|
|
275
|
+
codename="change_testpermissionedgenericsetting",
|
|
276
|
+
),
|
|
277
|
+
Permission.objects.get(codename="can_edit_sensitive_email_generic_setting"),
|
|
208
278
|
)
|
|
209
279
|
|
|
280
|
+
# GET should provide a form with title and sensitive_email
|
|
210
281
|
response = self.get(setting=TestPermissionedGenericSetting)
|
|
211
282
|
self.assertEqual(response.status_code, 200)
|
|
283
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
212
284
|
self.assertIn("sensitive_email", list(response.context["form"].fields))
|
|
213
285
|
|
|
286
|
+
# POST should allow both title and sensitive_email to be set
|
|
214
287
|
response = self.post(
|
|
215
288
|
setting=TestPermissionedGenericSetting,
|
|
216
|
-
post_data={
|
|
289
|
+
post_data={
|
|
290
|
+
"sensitive_email": "test-updated@example.com",
|
|
291
|
+
"title": "New title",
|
|
292
|
+
},
|
|
217
293
|
)
|
|
218
294
|
self.assertEqual(response.status_code, 302)
|
|
219
295
|
|
|
220
296
|
test_setting.refresh_from_db()
|
|
221
297
|
self.assertEqual(test_setting.sensitive_email, "test-updated@example.com")
|
|
298
|
+
self.assertEqual(test_setting.title, "New title")
|
|
222
299
|
|
|
223
|
-
def
|
|
300
|
+
def test_edit_restricted_field_without_field_permission(self):
|
|
301
|
+
# User has edit permission over the setting model, but not the sensitive_email field
|
|
224
302
|
test_setting = TestPermissionedGenericSetting()
|
|
225
303
|
test_setting.sensitive_email = "test@example.com"
|
|
304
|
+
test_setting.title = "Old title"
|
|
226
305
|
test_setting.save()
|
|
227
306
|
self.user.is_superuser = False
|
|
228
307
|
self.user.save()
|
|
308
|
+
self.user.user_permissions.add(
|
|
309
|
+
Permission.objects.get(
|
|
310
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
311
|
+
),
|
|
312
|
+
Permission.objects.get(
|
|
313
|
+
content_type__app_label="tests",
|
|
314
|
+
codename="change_testpermissionedgenericsetting",
|
|
315
|
+
),
|
|
316
|
+
)
|
|
229
317
|
|
|
318
|
+
# GET should provide a form with title but not sensitive_email
|
|
230
319
|
response = self.get(setting=TestPermissionedGenericSetting)
|
|
231
320
|
self.assertEqual(response.status_code, 200)
|
|
321
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
232
322
|
self.assertNotIn("sensitive_email", list(response.context["form"].fields))
|
|
233
323
|
|
|
324
|
+
# POST should allow the title to be set, but not the sensitive_email
|
|
234
325
|
response = self.post(
|
|
235
326
|
setting=TestPermissionedGenericSetting,
|
|
236
|
-
post_data={
|
|
327
|
+
post_data={
|
|
328
|
+
"sensitive_email": "test-updated@example.com",
|
|
329
|
+
"title": "New title",
|
|
330
|
+
},
|
|
237
331
|
)
|
|
238
332
|
self.assertEqual(response.status_code, 302)
|
|
239
333
|
|
|
240
334
|
test_setting.refresh_from_db()
|
|
241
335
|
self.assertEqual(test_setting.sensitive_email, "test@example.com")
|
|
336
|
+
self.assertEqual(test_setting.title, "New title")
|
|
337
|
+
|
|
338
|
+
def test_edit_restricted_field_without_any_permission(self):
|
|
339
|
+
# User has no permissions over the setting model, only access to the admin
|
|
340
|
+
test_setting = TestPermissionedGenericSetting()
|
|
341
|
+
test_setting.sensitive_email = "test@example.com"
|
|
342
|
+
test_setting.title = "Old title"
|
|
343
|
+
test_setting.save()
|
|
344
|
+
self.user.is_superuser = False
|
|
345
|
+
self.user.save()
|
|
346
|
+
self.user.user_permissions.add(
|
|
347
|
+
Permission.objects.get(
|
|
348
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
349
|
+
),
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
# GET should redirect away with permission denied
|
|
353
|
+
response = self.get(setting=TestPermissionedGenericSetting)
|
|
354
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
355
|
+
|
|
356
|
+
# POST should redirect away with permission denied
|
|
357
|
+
response = self.post(
|
|
358
|
+
setting=TestPermissionedGenericSetting,
|
|
359
|
+
post_data={
|
|
360
|
+
"sensitive_email": "test-updated@example.com",
|
|
361
|
+
"title": "new title",
|
|
362
|
+
},
|
|
363
|
+
)
|
|
364
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
365
|
+
|
|
366
|
+
# The retrieved setting should be unchanged
|
|
367
|
+
test_setting.refresh_from_db()
|
|
368
|
+
self.assertEqual(test_setting.sensitive_email, "test@example.com")
|
|
369
|
+
self.assertEqual(test_setting.title, "Old title")
|
|
242
370
|
|
|
243
371
|
|
|
244
372
|
class TestAdminPermission(WagtailTestUtils, TestCase):
|
|
@@ -73,11 +73,6 @@ class BaseTestSiteSettingView(WagtailTestUtils, TestCase):
|
|
|
73
73
|
class TestSiteSettingCreateView(BaseTestSiteSettingView):
|
|
74
74
|
def setUp(self):
|
|
75
75
|
self.user = self.login()
|
|
76
|
-
self.user.user_permissions.add(
|
|
77
|
-
Permission.objects.get(
|
|
78
|
-
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
79
|
-
)
|
|
80
|
-
)
|
|
81
76
|
|
|
82
77
|
def test_get_edit(self):
|
|
83
78
|
response = self.get()
|
|
@@ -109,11 +104,61 @@ class TestSiteSettingCreateView(BaseTestSiteSettingView):
|
|
|
109
104
|
# Ensure the form supports file uploads
|
|
110
105
|
self.assertContains(response, 'enctype="multipart/form-data"')
|
|
111
106
|
|
|
112
|
-
def
|
|
107
|
+
def test_create_restricted_field_without_any_permission(self):
|
|
108
|
+
# User has no permissions over the setting model, only access to the admin
|
|
109
|
+
self.user.is_superuser = False
|
|
110
|
+
self.user.save()
|
|
111
|
+
self.user.user_permissions.add(
|
|
112
|
+
Permission.objects.get(
|
|
113
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
114
|
+
),
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
self.assertFalse(TestPermissionedSiteSetting.objects.exists())
|
|
118
|
+
# GET should redirect away with permission denied
|
|
119
|
+
response = self.get(setting=TestPermissionedSiteSetting)
|
|
120
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
121
|
+
|
|
122
|
+
# the GET might create a setting object, depending on when the permission check is done,
|
|
123
|
+
# so remove any created objects prior to testing the POST
|
|
124
|
+
|
|
125
|
+
# POST should redirect away with permission denied
|
|
126
|
+
response = self.post(
|
|
127
|
+
post_data={"sensitive_email": "test@example.com", "title": "test"},
|
|
128
|
+
setting=TestPermissionedSiteSetting,
|
|
129
|
+
)
|
|
130
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
131
|
+
|
|
132
|
+
# The retrieved setting should contain none of the submitted data
|
|
133
|
+
settings = TestPermissionedSiteSetting.for_site(Site.objects.get(pk=1))
|
|
134
|
+
self.assertEqual(settings.title, "")
|
|
135
|
+
self.assertEqual(settings.sensitive_email, "")
|
|
136
|
+
|
|
137
|
+
def test_create_restricted_field_without_field_permission(self):
|
|
138
|
+
# User has edit permission over the setting model, but not the sensitive_email field
|
|
113
139
|
self.user.is_superuser = False
|
|
114
140
|
self.user.save()
|
|
141
|
+
self.user.user_permissions.add(
|
|
142
|
+
Permission.objects.get(
|
|
143
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
144
|
+
),
|
|
145
|
+
Permission.objects.get(
|
|
146
|
+
content_type__app_label="tests",
|
|
147
|
+
codename="change_testpermissionedsitesetting",
|
|
148
|
+
),
|
|
149
|
+
)
|
|
115
150
|
|
|
116
151
|
self.assertFalse(TestPermissionedSiteSetting.objects.exists())
|
|
152
|
+
# GET should provide a form with title but not sensitive_email
|
|
153
|
+
response = self.get(setting=TestPermissionedSiteSetting)
|
|
154
|
+
self.assertEqual(response.status_code, 200)
|
|
155
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
156
|
+
self.assertNotIn("sensitive_email", list(response.context["form"].fields))
|
|
157
|
+
|
|
158
|
+
# the GET creates a setting object, so remove any created objects prior to testing the POST
|
|
159
|
+
TestPermissionedSiteSetting.objects.all().delete()
|
|
160
|
+
|
|
161
|
+
# POST should allow the title to be set, but not the sensitive_email
|
|
117
162
|
response = self.post(
|
|
118
163
|
post_data={"sensitive_email": "test@example.com", "title": "test"},
|
|
119
164
|
setting=TestPermissionedSiteSetting,
|
|
@@ -125,12 +170,30 @@ class TestSiteSettingCreateView(BaseTestSiteSettingView):
|
|
|
125
170
|
self.assertEqual(settings.sensitive_email, "")
|
|
126
171
|
|
|
127
172
|
def test_create_restricted_field(self):
|
|
173
|
+
# User has edit permission over the setting model, including the sensitive_email field
|
|
128
174
|
self.user.is_superuser = False
|
|
129
175
|
self.user.save()
|
|
130
176
|
self.user.user_permissions.add(
|
|
131
|
-
Permission.objects.get(
|
|
177
|
+
Permission.objects.get(
|
|
178
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
179
|
+
),
|
|
180
|
+
Permission.objects.get(
|
|
181
|
+
content_type__app_label="tests",
|
|
182
|
+
codename="change_testpermissionedsitesetting",
|
|
183
|
+
),
|
|
184
|
+
Permission.objects.get(codename="can_edit_sensitive_email_site_setting"),
|
|
132
185
|
)
|
|
133
186
|
self.assertFalse(TestPermissionedSiteSetting.objects.exists())
|
|
187
|
+
# GET should provide a form with title and sensitive_email
|
|
188
|
+
response = self.get(setting=TestPermissionedSiteSetting)
|
|
189
|
+
self.assertEqual(response.status_code, 200)
|
|
190
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
191
|
+
self.assertIn("sensitive_email", list(response.context["form"].fields))
|
|
192
|
+
|
|
193
|
+
# the GET creates a setting object, so remove any created objects prior to testing the POST
|
|
194
|
+
TestPermissionedSiteSetting.objects.all().delete()
|
|
195
|
+
|
|
196
|
+
# POST should allow both title and sensitive_email to be set
|
|
134
197
|
response = self.post(
|
|
135
198
|
post_data={"sensitive_email": "test@example.com", "title": "test"},
|
|
136
199
|
setting=TestPermissionedSiteSetting,
|
|
@@ -153,11 +216,6 @@ class TestSiteSettingEditView(BaseTestSiteSettingView):
|
|
|
153
216
|
self.test_setting.save()
|
|
154
217
|
|
|
155
218
|
self.user = self.login()
|
|
156
|
-
self.user.user_permissions.add(
|
|
157
|
-
Permission.objects.get(
|
|
158
|
-
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
159
|
-
)
|
|
160
|
-
)
|
|
161
219
|
|
|
162
220
|
def test_get_edit(self):
|
|
163
221
|
response = self.get()
|
|
@@ -202,50 +260,117 @@ class TestSiteSettingEditView(BaseTestSiteSettingView):
|
|
|
202
260
|
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
203
261
|
|
|
204
262
|
def test_edit_restricted_field(self):
|
|
263
|
+
# User has edit permission over the setting model, including the sensitive_email field
|
|
205
264
|
test_setting = TestPermissionedSiteSetting()
|
|
265
|
+
test_setting.title = "Old title"
|
|
206
266
|
test_setting.sensitive_email = "test@example.com"
|
|
207
267
|
test_setting.site = self.default_site
|
|
208
268
|
test_setting.save()
|
|
209
269
|
self.user.is_superuser = False
|
|
210
270
|
self.user.save()
|
|
211
|
-
|
|
212
271
|
self.user.user_permissions.add(
|
|
213
|
-
Permission.objects.get(
|
|
272
|
+
Permission.objects.get(
|
|
273
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
274
|
+
),
|
|
275
|
+
Permission.objects.get(
|
|
276
|
+
content_type__app_label="tests",
|
|
277
|
+
codename="change_testpermissionedsitesetting",
|
|
278
|
+
),
|
|
279
|
+
Permission.objects.get(codename="can_edit_sensitive_email_site_setting"),
|
|
214
280
|
)
|
|
215
281
|
|
|
282
|
+
# GET should provide a form with title and sensitive_email
|
|
216
283
|
response = self.get(setting=TestPermissionedSiteSetting)
|
|
217
284
|
self.assertEqual(response.status_code, 200)
|
|
285
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
218
286
|
self.assertIn("sensitive_email", list(response.context["form"].fields))
|
|
219
287
|
|
|
288
|
+
# POST should allow both title and sensitive_email to be set
|
|
220
289
|
response = self.post(
|
|
221
290
|
setting=TestPermissionedSiteSetting,
|
|
222
|
-
post_data={
|
|
291
|
+
post_data={
|
|
292
|
+
"sensitive_email": "test-updated@example.com",
|
|
293
|
+
"title": "New title",
|
|
294
|
+
},
|
|
223
295
|
)
|
|
224
296
|
self.assertEqual(response.status_code, 302)
|
|
225
297
|
|
|
226
298
|
test_setting.refresh_from_db()
|
|
227
299
|
self.assertEqual(test_setting.sensitive_email, "test-updated@example.com")
|
|
300
|
+
self.assertEqual(test_setting.title, "New title")
|
|
228
301
|
|
|
229
|
-
def
|
|
302
|
+
def test_edit_restricted_field_without_field_permission(self):
|
|
303
|
+
# User has edit permission over the setting model, but not the sensitive_email field
|
|
230
304
|
test_setting = TestPermissionedSiteSetting()
|
|
305
|
+
test_setting.title = "Old title"
|
|
231
306
|
test_setting.sensitive_email = "test@example.com"
|
|
232
307
|
test_setting.site = self.default_site
|
|
233
308
|
test_setting.save()
|
|
234
309
|
self.user.is_superuser = False
|
|
235
310
|
self.user.save()
|
|
311
|
+
self.user.user_permissions.add(
|
|
312
|
+
Permission.objects.get(
|
|
313
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
314
|
+
),
|
|
315
|
+
Permission.objects.get(
|
|
316
|
+
content_type__app_label="tests",
|
|
317
|
+
codename="change_testpermissionedsitesetting",
|
|
318
|
+
),
|
|
319
|
+
)
|
|
236
320
|
|
|
321
|
+
# GET should provide a form with title but not sensitive_email
|
|
237
322
|
response = self.get(setting=TestPermissionedSiteSetting)
|
|
238
323
|
self.assertEqual(response.status_code, 200)
|
|
324
|
+
self.assertIn("title", list(response.context["form"].fields))
|
|
239
325
|
self.assertNotIn("sensitive_email", list(response.context["form"].fields))
|
|
240
326
|
|
|
327
|
+
# POST should allow the title to be set, but not the sensitive_email
|
|
241
328
|
response = self.post(
|
|
242
329
|
setting=TestPermissionedSiteSetting,
|
|
243
|
-
post_data={
|
|
330
|
+
post_data={
|
|
331
|
+
"sensitive_email": "test-updated@example.com",
|
|
332
|
+
"title": "New title",
|
|
333
|
+
},
|
|
244
334
|
)
|
|
245
335
|
self.assertEqual(response.status_code, 302)
|
|
246
336
|
|
|
247
337
|
test_setting.refresh_from_db()
|
|
248
338
|
self.assertEqual(test_setting.sensitive_email, "test@example.com")
|
|
339
|
+
self.assertEqual(test_setting.title, "New title")
|
|
340
|
+
|
|
341
|
+
def test_edit_restricted_field_without_any_permission(self):
|
|
342
|
+
# User has no permissions over the setting model, only access to the admin
|
|
343
|
+
test_setting = TestPermissionedSiteSetting()
|
|
344
|
+
test_setting.title = "Old title"
|
|
345
|
+
test_setting.sensitive_email = "test@example.com"
|
|
346
|
+
test_setting.site = self.default_site
|
|
347
|
+
test_setting.save()
|
|
348
|
+
self.user.is_superuser = False
|
|
349
|
+
self.user.save()
|
|
350
|
+
self.user.user_permissions.add(
|
|
351
|
+
Permission.objects.get(
|
|
352
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
353
|
+
),
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# GET should redirect away with permission denied
|
|
357
|
+
response = self.get(setting=TestPermissionedSiteSetting)
|
|
358
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
359
|
+
|
|
360
|
+
# POST should redirect away with permission denied
|
|
361
|
+
response = self.post(
|
|
362
|
+
setting=TestPermissionedSiteSetting,
|
|
363
|
+
post_data={
|
|
364
|
+
"sensitive_email": "test-updated@example.com",
|
|
365
|
+
"title": "New title",
|
|
366
|
+
},
|
|
367
|
+
)
|
|
368
|
+
self.assertRedirects(response, status_code=302, expected_url="/admin/")
|
|
369
|
+
|
|
370
|
+
# The retrieved setting should be unchanged
|
|
371
|
+
test_setting.refresh_from_db()
|
|
372
|
+
self.assertEqual(test_setting.sensitive_email, "test@example.com")
|
|
373
|
+
self.assertEqual(test_setting.title, "Old title")
|
|
249
374
|
|
|
250
375
|
|
|
251
376
|
@override_settings(
|
|
@@ -14,6 +14,7 @@ from wagtail.admin.panels import (
|
|
|
14
14
|
)
|
|
15
15
|
from wagtail.admin.views import generic
|
|
16
16
|
from wagtail.models import Site
|
|
17
|
+
from wagtail.permission_policies import ModelPermissionPolicy
|
|
17
18
|
|
|
18
19
|
from .forms import SiteSwitchForm
|
|
19
20
|
from .models import BaseGenericSetting, BaseSiteSetting
|
|
@@ -82,11 +83,13 @@ class EditView(generic.EditView):
|
|
|
82
83
|
template_name = "wagtailsettings/edit.html"
|
|
83
84
|
header_icon = "cogs"
|
|
84
85
|
error_message = gettext_lazy("The setting could not be saved due to errors.")
|
|
86
|
+
permission_required = "change"
|
|
85
87
|
|
|
86
88
|
def setup(self, request, app_name, model_name, *args, **kwargs):
|
|
87
89
|
self.app_name = app_name
|
|
88
90
|
self.model_name = model_name
|
|
89
91
|
self.model = get_model_from_url_params(app_name, model_name)
|
|
92
|
+
self.permission_policy = ModelPermissionPolicy(self.model)
|
|
90
93
|
self.pk = kwargs.get(self.pk_url_kwarg)
|
|
91
94
|
super().setup(request, app_name, model_name, *args, **kwargs)
|
|
92
95
|
|
|
@@ -35,7 +35,6 @@ from wagtail.snippets.action_menu import (
|
|
|
35
35
|
)
|
|
36
36
|
from wagtail.snippets.blocks import SnippetChooserBlock
|
|
37
37
|
from wagtail.snippets.models import SNIPPET_MODELS, register_snippet
|
|
38
|
-
from wagtail.snippets.views.snippets import CopyView
|
|
39
38
|
from wagtail.snippets.widgets import (
|
|
40
39
|
AdminSnippetChooser,
|
|
41
40
|
SnippetChooserAdapter,
|
|
@@ -974,20 +973,29 @@ class TestSnippetCopyView(WagtailTestUtils, TestCase):
|
|
|
974
973
|
StandardSnippet.snippet_viewset.get_url_name("copy"),
|
|
975
974
|
args=(self.snippet.pk,),
|
|
976
975
|
)
|
|
977
|
-
self.login()
|
|
976
|
+
self.user = self.login()
|
|
977
|
+
|
|
978
|
+
def test_without_permission(self):
|
|
979
|
+
self.user.is_superuser = False
|
|
980
|
+
self.user.save()
|
|
981
|
+
admin_permission = Permission.objects.get(
|
|
982
|
+
content_type__app_label="wagtailadmin", codename="access_admin"
|
|
983
|
+
)
|
|
984
|
+
self.user.user_permissions.add(admin_permission)
|
|
978
985
|
|
|
979
|
-
|
|
986
|
+
response = self.client.get(self.url)
|
|
987
|
+
self.assertEqual(response.status_code, 302)
|
|
988
|
+
self.assertRedirects(response, reverse("wagtailadmin_home"))
|
|
989
|
+
|
|
990
|
+
def test_form_is_prefilled(self):
|
|
980
991
|
response = self.client.get(self.url)
|
|
981
992
|
self.assertEqual(response.status_code, 200)
|
|
982
993
|
self.assertTemplateUsed(response, "wagtailsnippets/snippets/create.html")
|
|
983
994
|
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
view.setup(request, pk=self.snippet.pk)
|
|
989
|
-
|
|
990
|
-
self.assertEqual(view._get_initial_form_instance(), self.snippet)
|
|
995
|
+
# Ensure form is prefilled
|
|
996
|
+
soup = self.get_soup(response.content)
|
|
997
|
+
text_input = soup.select_one('input[name="text"]')
|
|
998
|
+
self.assertEqual(text_input.attrs.get("value"), "Test snippet")
|
|
991
999
|
|
|
992
1000
|
|
|
993
1001
|
@override_settings(WAGTAIL_I18N_ENABLED=True)
|
|
@@ -5,7 +5,7 @@ from django.contrib.admin.utils import quote
|
|
|
5
5
|
from django.core import checks
|
|
6
6
|
from django.core.exceptions import ImproperlyConfigured, PermissionDenied
|
|
7
7
|
from django.http import Http404
|
|
8
|
-
from django.shortcuts import
|
|
8
|
+
from django.shortcuts import redirect
|
|
9
9
|
from django.urls import path, re_path, reverse, reverse_lazy
|
|
10
10
|
from django.utils.functional import cached_property
|
|
11
11
|
from django.utils.text import capfirst
|
|
@@ -264,16 +264,8 @@ class CreateView(generic.CreateEditViewOptionalFeaturesMixin, generic.CreateView
|
|
|
264
264
|
return context
|
|
265
265
|
|
|
266
266
|
|
|
267
|
-
class CopyView(CreateView):
|
|
268
|
-
|
|
269
|
-
return get_object_or_404(self.model, pk=self.kwargs["pk"])
|
|
270
|
-
|
|
271
|
-
def _get_initial_form_instance(self):
|
|
272
|
-
instance = self.get_object()
|
|
273
|
-
# Set locale of the new instance
|
|
274
|
-
if self.locale:
|
|
275
|
-
instance.locale = self.locale
|
|
276
|
-
return instance
|
|
267
|
+
class CopyView(generic.CopyViewMixin, CreateView):
|
|
268
|
+
pass
|
|
277
269
|
|
|
278
270
|
|
|
279
271
|
class EditView(generic.CreateEditViewOptionalFeaturesMixin, generic.EditView):
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: wagtail
|
|
3
|
+
Version: 6.0.5
|
|
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: Programming Language :: Python :: 3.12
|
|
25
|
+
Classifier: Framework :: Django
|
|
26
|
+
Classifier: Framework :: Django :: 4.2
|
|
27
|
+
Classifier: Framework :: Django :: 5.0
|
|
28
|
+
Classifier: Framework :: Wagtail
|
|
29
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
30
|
+
Requires-Python: >=3.8
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Requires-Dist: Django <6.0,>=4.2
|
|
33
|
+
Requires-Dist: django-modelcluster <7.0,>=6.2.1
|
|
34
|
+
Requires-Dist: django-permissionedforms <1.0,>=0.1
|
|
35
|
+
Requires-Dist: django-taggit <5.1,>=4.0
|
|
36
|
+
Requires-Dist: django-treebeard <5.0,>=4.5.1
|
|
37
|
+
Requires-Dist: djangorestframework <4.0,>=3.11.1
|
|
38
|
+
Requires-Dist: django-filter <24,>=23.3
|
|
39
|
+
Requires-Dist: draftjs-exporter <6.0,>=2.1.5
|
|
40
|
+
Requires-Dist: Pillow <11.0.0,>=9.1.0
|
|
41
|
+
Requires-Dist: beautifulsoup4 <4.13,>=4.8
|
|
42
|
+
Requires-Dist: html5lib <2,>=0.999
|
|
43
|
+
Requires-Dist: Willow[heif] <2,>=1.6.2
|
|
44
|
+
Requires-Dist: requests <3.0,>=2.11.1
|
|
45
|
+
Requires-Dist: l18n >=2018.5
|
|
46
|
+
Requires-Dist: openpyxl <4.0,>=3.0.10
|
|
47
|
+
Requires-Dist: anyascii >=0.1.5
|
|
48
|
+
Requires-Dist: telepath <1,>=0.3.1
|
|
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 >=1.5.2 ; extra == 'docs'
|
|
54
|
+
Requires-Dist: sphinx-autobuild >=0.6.0 ; extra == 'docs'
|
|
55
|
+
Requires-Dist: sphinx-wagtail-theme ==6.3.0 ; extra == 'docs'
|
|
56
|
+
Requires-Dist: myst-parser ==2.0.0 ; 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.7 ; extra == 'testing'
|
|
67
|
+
Requires-Dist: coverage >=3.7.0 ; extra == 'testing'
|
|
68
|
+
Requires-Dist: doc8 ==0.8.1 ; extra == 'testing'
|
|
69
|
+
Requires-Dist: ruff ==0.1.5 ; extra == 'testing'
|
|
70
|
+
Requires-Dist: semgrep ==1.40.0 ; extra == 'testing'
|
|
71
|
+
Requires-Dist: curlylint ==0.13.1 ; extra == 'testing'
|
|
72
|
+
Requires-Dist: djhtml ==3.0.6 ; extra == 'testing'
|
|
73
|
+
Requires-Dist: polib <2.0,>=1.1 ; extra == 'testing'
|
|
74
|
+
Requires-Dist: factory-boy >=3.2 ; extra == 'testing'
|
|
75
|
+
Requires-Dist: tblib <3.0,>=2.0 ; extra == 'testing'
|
|
76
|
+
|
|
77
|
+
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.
|
|
78
|
+
|
|
79
|
+
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=K1wcA7S0Dnw2cah_2MSZ9P5YYQC3hqIaZv6jZCx-OSY,724
|
|
2
2
|
wagtail/apps.py,sha256=38kXTdHoQzFnpUqDNxFpsqn2dut4V0u9rLOkhqCoYkc,713
|
|
3
3
|
wagtail/compat.py,sha256=L41FhlX4xy5KgTdJ63smtM78mtKf1mxkPeOs8kyOwS0,538
|
|
4
4
|
wagtail/coreutils.py,sha256=2eFnlfuyzu8wr5_u2j_zbrHhQDPxPfnaIlgRc4433J0,20660
|
|
@@ -931,13 +931,13 @@ wagtail/admin/views/bulk_action/__init__.py,sha256=vvb1oKmExfxl6cd6g7YaCO4LSwxWN
|
|
|
931
931
|
wagtail/admin/views/bulk_action/base_bulk_action.py,sha256=UuidpHVm3uQTI6zRYxwSgxZNkAVP_XCWhkCEMW0Wu1s,5201
|
|
932
932
|
wagtail/admin/views/bulk_action/dispatcher.py,sha256=fqhOJ3tyRwIDP474vewlsAq1FgP48AgKOvdiySxDlto,504
|
|
933
933
|
wagtail/admin/views/bulk_action/registry.py,sha256=e9-rN9TdHUmRwDfTeauvPUjE6p3ipqReiuhxAhQDnJc,1640
|
|
934
|
-
wagtail/admin/views/generic/__init__.py,sha256=
|
|
934
|
+
wagtail/admin/views/generic/__init__.py,sha256=DmUsijsaRTmV5htoqydJ74OKuu4AiuhThvTFflCguok,683
|
|
935
935
|
wagtail/admin/views/generic/base.py,sha256=iJKNGAd3orZOzLGviEfCF9rjdfo_hK3QCIDAAMkXcdQ,16705
|
|
936
936
|
wagtail/admin/views/generic/chooser.py,sha256=pjOYGcYBHc1ZkZJ4LWcHkoGNQ7U7GdKBsJZ0vyOO4kc,18061
|
|
937
937
|
wagtail/admin/views/generic/history.py,sha256=gsjOYx5aHv1s3klx_5VuZwsPqEaxV_8kucswr6MUTVE,10764
|
|
938
938
|
wagtail/admin/views/generic/lock.py,sha256=dvZ613n3itNAhO3zdQzGRewm2kH-dyemx-LSuUC2AHM,1435
|
|
939
939
|
wagtail/admin/views/generic/mixins.py,sha256=s17uj8lGDOI2zi3oH3HDJUem3tDddYQc3mrNxc-J_-I,28349
|
|
940
|
-
wagtail/admin/views/generic/models.py,sha256=
|
|
940
|
+
wagtail/admin/views/generic/models.py,sha256=WurcJDa8xinxo0JmjrHXL8h2Pfi7tKfgMPiMDx2mZXM,50949
|
|
941
941
|
wagtail/admin/views/generic/multiple_upload.py,sha256=rgf3uXZShyZ_2rnidfk_tnU4YhHcXyPwrIKMKWIk78s,13031
|
|
942
942
|
wagtail/admin/views/generic/permissions.py,sha256=8WY3Pd3jt3sPH4CNaQqmhUvgb1YjD3fjIgkqh7zRjbc,1476
|
|
943
943
|
wagtail/admin/views/generic/preview.py,sha256=9tvUJoz55b0bKY4vvfqnDMNke3TTeSPaEamvrICYR9Q,5655
|
|
@@ -1519,7 +1519,7 @@ wagtail/contrib/settings/models.py,sha256=unPAWwCPbPYDw2D0VAU08eUQHgeZP4r2S5_yWp
|
|
|
1519
1519
|
wagtail/contrib/settings/permissions.py,sha256=ztOm40Dny3pG_N0ruM4dPcx1Bij5BR1SVDM7QAbRHrk,197
|
|
1520
1520
|
wagtail/contrib/settings/registry.py,sha256=IkgU_XLRRIRY_aSGFKsmvjCxs8fi7q1ChvNgcRNaLsU,4450
|
|
1521
1521
|
wagtail/contrib/settings/urls.py,sha256=qP0AhY-yZjWpmJQl5s2jHeu-GImWQKxkMw3AhcnZO2w,354
|
|
1522
|
-
wagtail/contrib/settings/views.py,sha256=
|
|
1522
|
+
wagtail/contrib/settings/views.py,sha256=XM5uvM8n3DZ9MoYQ7yZX9Yx9hAzNp_GhllSN8_Wt9yg,4924
|
|
1523
1523
|
wagtail/contrib/settings/wagtail_hooks.py,sha256=IJynK_Kv3tSTuvUqfN3AmmaogGvzgyKC9n9UUqrZsyc,243
|
|
1524
1524
|
wagtail/contrib/settings/locale/af/LC_MESSAGES/django.mo,sha256=RUNArieX_RjkKIb2kwGF4KfTlYrfxMi-HTNkhuroQEk,478
|
|
1525
1525
|
wagtail/contrib/settings/locale/af/LC_MESSAGES/django.po,sha256=TwMpd_a6pCzaDftJmjvGYFSo3DM43vFhd26ccW49trM,741
|
|
@@ -1648,13 +1648,13 @@ wagtail/contrib/settings/templatetags/wagtailsettings_tags.py,sha256=_YT4sMMUcuL
|
|
|
1648
1648
|
wagtail/contrib/settings/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1649
1649
|
wagtail/contrib/settings/tests/generic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1650
1650
|
wagtail/contrib/settings/tests/generic/base.py,sha256=ROErYgcjkO7ll5NpleP0Y0gin0J6CxFDDFrS7zfJy48,780
|
|
1651
|
-
wagtail/contrib/settings/tests/generic/test_admin.py,sha256=
|
|
1651
|
+
wagtail/contrib/settings/tests/generic/test_admin.py,sha256=oN7Q8w78Mb9PJO-3Ogggzhg0wNqqkQGsesP8n89GDbE,16782
|
|
1652
1652
|
wagtail/contrib/settings/tests/generic/test_model.py,sha256=6fvP7I4L-NBsQAqZwrVSyvc828p1DEaPZr8RwjiYqZM,5276
|
|
1653
1653
|
wagtail/contrib/settings/tests/generic/test_register.py,sha256=J_E6KrlYeQtQqGD8P_4YTjVu3ZLiin3epeU2MsBrq2s,907
|
|
1654
1654
|
wagtail/contrib/settings/tests/generic/test_templates.py,sha256=Pvm0ZwMBkCf1Z8EYiJ9Xyv_NEY4OScfDawFwU6oTUbc,7250
|
|
1655
1655
|
wagtail/contrib/settings/tests/site_specific/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1656
1656
|
wagtail/contrib/settings/tests/site_specific/base.py,sha256=F0AGRh-k87W5qaYtX_hOLX9fX_DQn8V1rA3vM5lG9_Q,1186
|
|
1657
|
-
wagtail/contrib/settings/tests/site_specific/test_admin.py,sha256=
|
|
1657
|
+
wagtail/contrib/settings/tests/site_specific/test_admin.py,sha256=s_mSiq-bo4jYRrB4sv8kNjpvz7P-s3043Spr9PhwLs0,21083
|
|
1658
1658
|
wagtail/contrib/settings/tests/site_specific/test_forms.py,sha256=ObrofQc5X6J19sezBRIkodk67fmfAVNahl-85vv34Zk,1226
|
|
1659
1659
|
wagtail/contrib/settings/tests/site_specific/test_model.py,sha256=Sxpvta-DmfYa0oL7Hqjk8AA8OPWMSWbGnBSwN8xkBiQ,9634
|
|
1660
1660
|
wagtail/contrib/settings/tests/site_specific/test_register.py,sha256=Zi8VC7vaZ8XA_JwM_0OQLCd4npnIZQA5Y6EMSpWGWq0,860
|
|
@@ -3464,7 +3464,7 @@ wagtail/snippets/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
|
3464
3464
|
wagtail/snippets/tests/test_locking.py,sha256=QdaRVuX47tCbwoA62KYNJm9qxH33ekKs-nai5UeYDp4,25370
|
|
3465
3465
|
wagtail/snippets/tests/test_management.py,sha256=GQw8HCZSJWny8giAUua_5-RstN7U_QGcsOkVuG72YHM,894
|
|
3466
3466
|
wagtail/snippets/tests/test_preview.py,sha256=BpsAvmWJ2cX4zGZHbJg42lwIAztUTAgF_k9KRJWsSEw,19848
|
|
3467
|
-
wagtail/snippets/tests/test_snippets.py,sha256
|
|
3467
|
+
wagtail/snippets/tests/test_snippets.py,sha256=-Oyh2bCgIAsmasdI_xjKQ6PiTPeKdGOlv79g4_nUJ-0,215147
|
|
3468
3468
|
wagtail/snippets/tests/test_usage.py,sha256=2nAyuC5Nt3PbDnJgXNRAP_KDEt1gf_SGPiYL4IgmMWY,8076
|
|
3469
3469
|
wagtail/snippets/tests/test_viewset.py,sha256=yCvlGerr5VbubC8I6W4ZlKS0yC7gMtsdA4cspski4JU,59972
|
|
3470
3470
|
wagtail/snippets/tests/test_workflows.py,sha256=cbE1K46mCjb2yhaT5FGGKAXlZiirvWbKHVDAWpkrU4c,11493
|
|
@@ -3473,7 +3473,7 @@ wagtail/snippets/tests/test_bulk_actions/test_bulk_delete.py,sha256=h19bHzxx0FiP
|
|
|
3473
3473
|
wagtail/snippets/tests/test_bulk_actions/test_custom_models.py,sha256=ymcv9FcRzaqA9P_QXIkCLDS2SBhV2Kc9jDrw1W51LZo,2156
|
|
3474
3474
|
wagtail/snippets/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3475
3475
|
wagtail/snippets/views/chooser.py,sha256=Yhr19rpjifwu3YWE0k1ULZkcXWVKXP0mXc4o-ul7f88,2178
|
|
3476
|
-
wagtail/snippets/views/snippets.py,sha256=
|
|
3476
|
+
wagtail/snippets/views/snippets.py,sha256=mTCmGAkZ7BAtIg4Zb4iFesIChWMMa9w672iGDWVfWNQ,47138
|
|
3477
3477
|
wagtail/templates/wagtailcore/login.html,sha256=OFcM7lpacqi4vTcHAwmh6-FjYl2fWEKKMJsqPYWhinM,998
|
|
3478
3478
|
wagtail/templates/wagtailcore/page.html,sha256=731rpIL3MbL3oNEEIzrwQ-a7KgJITGnyCRJa5K8EuU4,343
|
|
3479
3479
|
wagtail/templates/wagtailcore/password_required.html,sha256=cHsx0GRU8EaXeEyR_jigoKuf4gzS1leEuhFmoU4wmUM,726
|
|
@@ -3923,9 +3923,9 @@ wagtail/utils/urlpatterns.py,sha256=RDhVScxdm-RV4HSMjWElyrbEoTPsXu841_SKMgoFKtY,
|
|
|
3923
3923
|
wagtail/utils/utils.py,sha256=UALGn0KOyqi5ZoXOozWX99ZPUsVZP51ET8d7sZ1jlm0,430
|
|
3924
3924
|
wagtail/utils/version.py,sha256=40WGMIy8nSPQJFF01p7c38L444SexH2Cb-bQmR8ztXg,1478
|
|
3925
3925
|
wagtail/utils/widgets.py,sha256=ibAvxHCjNw06bMlTD7wvrwmGEMNS3NzrnSKREGfPF44,1775
|
|
3926
|
-
wagtail-6.0.
|
|
3927
|
-
wagtail-6.0.
|
|
3928
|
-
wagtail-6.0.
|
|
3929
|
-
wagtail-6.0.
|
|
3930
|
-
wagtail-6.0.
|
|
3931
|
-
wagtail-6.0.
|
|
3926
|
+
wagtail-6.0.5.dist-info/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
|
|
3927
|
+
wagtail-6.0.5.dist-info/METADATA,sha256=tLzVohroDl1RnnH3ALTZSlOE_jiQKZFma52jDGJq6ZY,3713
|
|
3928
|
+
wagtail-6.0.5.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
3929
|
+
wagtail-6.0.5.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
|
|
3930
|
+
wagtail-6.0.5.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
|
|
3931
|
+
wagtail-6.0.5.dist-info/RECORD,,
|
wagtail-6.0.3.dist-info/METADATA
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: wagtail
|
|
3
|
-
Version: 6.0.3
|
|
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: Programming Language :: Python :: 3.12
|
|
25
|
-
Classifier: Framework :: Django
|
|
26
|
-
Classifier: Framework :: Django :: 4.2
|
|
27
|
-
Classifier: Framework :: Django :: 5.0
|
|
28
|
-
Classifier: Framework :: Wagtail
|
|
29
|
-
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
30
|
-
Requires-Python: >=3.8
|
|
31
|
-
License-File: LICENSE
|
|
32
|
-
Requires-Dist: Django (<6.0,>=4.2)
|
|
33
|
-
Requires-Dist: django-modelcluster (<7.0,>=6.2.1)
|
|
34
|
-
Requires-Dist: django-permissionedforms (<1.0,>=0.1)
|
|
35
|
-
Requires-Dist: django-taggit (<5.1,>=4.0)
|
|
36
|
-
Requires-Dist: django-treebeard (<5.0,>=4.5.1)
|
|
37
|
-
Requires-Dist: djangorestframework (<4.0,>=3.11.1)
|
|
38
|
-
Requires-Dist: django-filter (<24,>=23.3)
|
|
39
|
-
Requires-Dist: draftjs-exporter (<6.0,>=2.1.5)
|
|
40
|
-
Requires-Dist: Pillow (<11.0.0,>=9.1.0)
|
|
41
|
-
Requires-Dist: beautifulsoup4 (<4.13,>=4.8)
|
|
42
|
-
Requires-Dist: html5lib (<2,>=0.999)
|
|
43
|
-
Requires-Dist: Willow[heif] (<2,>=1.6.2)
|
|
44
|
-
Requires-Dist: requests (<3.0,>=2.11.1)
|
|
45
|
-
Requires-Dist: l18n (>=2018.5)
|
|
46
|
-
Requires-Dist: openpyxl (<4.0,>=3.0.10)
|
|
47
|
-
Requires-Dist: anyascii (>=0.1.5)
|
|
48
|
-
Requires-Dist: telepath (<1,>=0.3.1)
|
|
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 (>=1.5.2) ; extra == 'docs'
|
|
54
|
-
Requires-Dist: sphinx-autobuild (>=0.6.0) ; extra == 'docs'
|
|
55
|
-
Requires-Dist: sphinx-wagtail-theme (==6.3.0) ; extra == 'docs'
|
|
56
|
-
Requires-Dist: myst-parser (==2.0.0) ; 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.7) ; extra == 'testing'
|
|
67
|
-
Requires-Dist: coverage (>=3.7.0) ; extra == 'testing'
|
|
68
|
-
Requires-Dist: doc8 (==0.8.1) ; extra == 'testing'
|
|
69
|
-
Requires-Dist: ruff (==0.1.5) ; extra == 'testing'
|
|
70
|
-
Requires-Dist: semgrep (==1.40.0) ; extra == 'testing'
|
|
71
|
-
Requires-Dist: curlylint (==0.13.1) ; extra == 'testing'
|
|
72
|
-
Requires-Dist: djhtml (==3.0.6) ; extra == 'testing'
|
|
73
|
-
Requires-Dist: polib (<2.0,>=1.1) ; extra == 'testing'
|
|
74
|
-
Requires-Dist: factory-boy (>=3.2) ; extra == 'testing'
|
|
75
|
-
Requires-Dist: tblib (<3.0,>=2.0) ; extra == 'testing'
|
|
76
|
-
|
|
77
|
-
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.
|
|
78
|
-
|
|
79
|
-
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
|