wagtail 6.0.4__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 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, 4, "final", 1)
9
+ VERSION = (6, 0, 5, "final", 1)
10
10
 
11
11
  __version__ = get_version(VERSION)
12
12
 
@@ -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 test_create_restricted_field_without_permission(self):
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(codename="can_edit_sensitive_email_generic_setting")
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(codename="can_edit_sensitive_email_generic_setting")
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={"sensitive_email": "test-updated@example.com", "title": "title"},
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 test_edit_restricted_field_without_permission(self):
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={"sensitive_email": "test-updated@example.com", "title": "title"},
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 test_create_restricted_field_without_permission(self):
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(codename="can_edit_sensitive_email_site_setting")
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(codename="can_edit_sensitive_email_site_setting")
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={"sensitive_email": "test-updated@example.com", "title": "title"},
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 test_edit_restricted_field_without_permission(self):
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={"sensitive_email": "test-updated@example.com", "title": "title"},
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
 
@@ -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=qlk_KgJCF4VHS9RXzTg1O1YmSGd9NQhh0aWmbeByUqI,724
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
@@ -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=gQuewXAH70sUk9T2cu1jEZ-fDkAxrHEhmyMKONjTZtk,4760
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=J2909d8VRaJXrbXb4-9sm6hz82wefoQrIVDsjbHbIh0,10685
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=i29kYwRbSj0FuXxTm0zZw-TtTgnIUrWDQBMlflawWuc,15094
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
@@ -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.4.dist-info/LICENSE,sha256=0aiL7_RJ2YkOjscmRI7opwmuURrY6h8MR0B24nrdRQU,1512
3927
- wagtail-6.0.4.dist-info/METADATA,sha256=6Ef-2tXIk5xrp9ARl7sYEZGKSMc_jkQZl_d3dRMtl2g,3797
3928
- wagtail-6.0.4.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
3929
- wagtail-6.0.4.dist-info/entry_points.txt,sha256=R14Z0xKoufNcDaku0EWDKM-K8J4ap0EImO8C-df8HVM,53
3930
- wagtail-6.0.4.dist-info/top_level.txt,sha256=zcKgvuRTi0gSgVzJ1qMoERCwhQ_i0n9bkyxza3oh9as,8
3931
- wagtail-6.0.4.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.38.4)
2
+ Generator: bdist_wheel (0.43.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,79 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: wagtail
3
- Version: 6.0.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: 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/.