wagtail 6.0.1__py3-none-any.whl → 6.0.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.
Files changed (199) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
  3. wagtail/admin/locale/ca/LC_MESSAGES/django.po +122 -0
  4. wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
  5. wagtail/admin/locale/es/LC_MESSAGES/django.po +6 -6
  6. wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
  7. wagtail/admin/locale/fr/LC_MESSAGES/django.po +70 -3
  8. wagtail/admin/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  9. wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +2 -6
  10. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.mo +0 -0
  11. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.po +2 -2
  12. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  13. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +4 -0
  14. wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
  15. wagtail/admin/locale/hu/LC_MESSAGES/django.po +142 -2
  16. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  17. wagtail/admin/locale/it/LC_MESSAGES/django.po +80 -8
  18. wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
  19. wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +14 -2
  20. wagtail/admin/locale/lv/LC_MESSAGES/django.mo +0 -0
  21. wagtail/admin/locale/lv/LC_MESSAGES/django.po +154 -1
  22. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  23. wagtail/admin/locale/sl/LC_MESSAGES/django.po +145 -2
  24. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  25. wagtail/admin/locale/sv/LC_MESSAGES/django.po +77 -3
  26. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  27. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +17 -1
  28. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  29. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  30. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  31. wagtail/admin/templates/wagtailadmin/admin_base.html +1 -0
  32. wagtail/admin/templates/wagtailadmin/collections/edit.html +0 -1
  33. wagtail/admin/templates/wagtailadmin/generic/form.html +1 -0
  34. wagtail/admin/templates/wagtailadmin/generic/index_results.html +8 -0
  35. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +0 -1
  36. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -1
  37. wagtail/admin/templates/wagtailadmin/pages/index.html +0 -2
  38. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +1 -1
  39. wagtail/admin/tests/api/test_pages.py +26 -10
  40. wagtail/admin/tests/pages/test_page_search.py +39 -0
  41. wagtail/admin/tests/viewsets/test_model_viewset.py +45 -10
  42. wagtail/admin/views/generic/base.py +3 -0
  43. wagtail/admin/views/generic/models.py +27 -10
  44. wagtail/admin/views/pages/search.py +1 -0
  45. wagtail/admin/widgets/button.py +1 -2
  46. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  47. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.po +2 -2
  48. wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +2 -2
  49. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  50. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +2 -2
  51. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +2 -2
  52. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  53. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +2 -2
  54. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  55. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +41 -2
  56. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
  57. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +9 -3
  58. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  59. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.po +2 -2
  60. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.mo +0 -0
  61. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.po +6 -2
  62. wagtail/contrib/settings/tests/generic/test_admin.py +88 -1
  63. wagtail/contrib/settings/tests/site_specific/test_admin.py +92 -3
  64. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  65. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +2 -2
  66. wagtail/contrib/styleguide/tests.py +8 -0
  67. wagtail/contrib/styleguide/views.py +1 -1
  68. wagtail/contrib/table_block/blocks.py +1 -1
  69. wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
  70. wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.po +27 -2
  71. wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
  72. wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.po +27 -2
  73. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  74. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +27 -2
  75. wagtail/contrib/table_block/tests.py +6 -0
  76. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
  77. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +12 -2
  78. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
  79. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +12 -2
  80. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  81. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +12 -2
  82. wagtail/documents/locale/fr/LC_MESSAGES/django.po +2 -2
  83. wagtail/documents/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  84. wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +2 -2
  85. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  86. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +19 -2
  87. wagtail/documents/locale/hu/LC_MESSAGES/django.mo +0 -0
  88. wagtail/documents/locale/hu/LC_MESSAGES/django.po +16 -2
  89. wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
  90. wagtail/documents/locale/it/LC_MESSAGES/django.po +19 -2
  91. wagtail/embeds/locale/fr/LC_MESSAGES/django.po +2 -2
  92. wagtail/embeds/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  93. wagtail/embeds/locale/he_IL/LC_MESSAGES/django.po +2 -2
  94. wagtail/images/locale/ca/LC_MESSAGES/django.mo +0 -0
  95. wagtail/images/locale/ca/LC_MESSAGES/django.po +12 -0
  96. wagtail/images/locale/fr/LC_MESSAGES/django.po +2 -2
  97. wagtail/images/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  98. wagtail/images/locale/he_IL/LC_MESSAGES/django.po +2 -2
  99. wagtail/images/locale/hu/LC_MESSAGES/django.mo +0 -0
  100. wagtail/images/locale/hu/LC_MESSAGES/django.po +28 -2
  101. wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
  102. wagtail/images/locale/it/LC_MESSAGES/django.po +14 -2
  103. wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
  104. wagtail/locale/es/LC_MESSAGES/django.po +3 -2
  105. wagtail/locale/fr/LC_MESSAGES/django.po +2 -2
  106. wagtail/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  107. wagtail/locale/he_IL/LC_MESSAGES/django.po +2 -2
  108. wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
  109. wagtail/locale/it/LC_MESSAGES/django.po +5 -5
  110. wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
  111. wagtail/locale/sl/LC_MESSAGES/django.po +27 -2
  112. wagtail/locales/locale/ar/LC_MESSAGES/django.po +1 -1
  113. wagtail/locales/locale/be/LC_MESSAGES/django.po +1 -1
  114. wagtail/locales/locale/bg/LC_MESSAGES/django.po +1 -1
  115. wagtail/locales/locale/ca/LC_MESSAGES/django.po +1 -1
  116. wagtail/locales/locale/cs/LC_MESSAGES/django.po +1 -1
  117. wagtail/locales/locale/cy/LC_MESSAGES/django.po +1 -1
  118. wagtail/locales/locale/da/LC_MESSAGES/django.po +1 -1
  119. wagtail/locales/locale/de/LC_MESSAGES/django.po +1 -1
  120. wagtail/locales/locale/el/LC_MESSAGES/django.po +1 -1
  121. wagtail/locales/locale/es/LC_MESSAGES/django.po +1 -1
  122. wagtail/locales/locale/et/LC_MESSAGES/django.po +2 -2
  123. wagtail/locales/locale/fa/LC_MESSAGES/django.po +1 -1
  124. wagtail/locales/locale/fi/LC_MESSAGES/django.po +1 -1
  125. wagtail/locales/locale/fr/LC_MESSAGES/django.po +1 -1
  126. wagtail/locales/locale/gl/LC_MESSAGES/django.po +1 -1
  127. wagtail/locales/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  128. wagtail/locales/locale/he_IL/LC_MESSAGES/django.po +3 -3
  129. wagtail/locales/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  130. wagtail/locales/locale/hu/LC_MESSAGES/django.po +1 -1
  131. wagtail/locales/locale/id_ID/LC_MESSAGES/django.po +1 -1
  132. wagtail/locales/locale/is_IS/LC_MESSAGES/django.po +1 -1
  133. wagtail/locales/locale/it/LC_MESSAGES/django.po +1 -1
  134. wagtail/locales/locale/ja/LC_MESSAGES/django.po +1 -1
  135. wagtail/locales/locale/ko/LC_MESSAGES/django.po +1 -1
  136. wagtail/locales/locale/lt/LC_MESSAGES/django.po +1 -1
  137. wagtail/locales/locale/lv/LC_MESSAGES/django.po +1 -1
  138. wagtail/locales/locale/mi/LC_MESSAGES/django.po +1 -1
  139. wagtail/locales/locale/mn/LC_MESSAGES/django.po +1 -1
  140. wagtail/locales/locale/my/LC_MESSAGES/django.po +1 -1
  141. wagtail/locales/locale/nb/LC_MESSAGES/django.po +1 -1
  142. wagtail/locales/locale/nl/LC_MESSAGES/django.po +1 -1
  143. wagtail/locales/locale/pl/LC_MESSAGES/django.po +1 -1
  144. wagtail/locales/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  145. wagtail/locales/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  146. wagtail/locales/locale/ro/LC_MESSAGES/django.po +1 -1
  147. wagtail/locales/locale/ru/LC_MESSAGES/django.po +1 -1
  148. wagtail/locales/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  149. wagtail/locales/locale/sl/LC_MESSAGES/django.po +1 -1
  150. wagtail/locales/locale/sv/LC_MESSAGES/django.po +1 -1
  151. wagtail/locales/locale/tet/LC_MESSAGES/django.po +1 -1
  152. wagtail/locales/locale/th/LC_MESSAGES/django.po +1 -1
  153. wagtail/locales/locale/tr/LC_MESSAGES/django.po +1 -1
  154. wagtail/locales/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  155. wagtail/locales/locale/uk/LC_MESSAGES/django.po +1 -1
  156. wagtail/locales/locale/vi/LC_MESSAGES/django.po +1 -1
  157. wagtail/locales/locale/zh/LC_MESSAGES/django.po +1 -1
  158. wagtail/locales/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  159. wagtail/locales/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  160. wagtail/management/commands/convert_mariadb_uuids.py +43 -0
  161. wagtail/sites/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  162. wagtail/sites/locale/he_IL/LC_MESSAGES/django.po +2 -2
  163. wagtail/sites/locale/ro/LC_MESSAGES/django.mo +0 -0
  164. wagtail/sites/locale/ro/LC_MESSAGES/django.po +3 -2
  165. wagtail/sites/templates/wagtailsites/create.html +0 -1
  166. wagtail/sites/templates/wagtailsites/edit.html +0 -1
  167. wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
  168. wagtail/snippets/locale/de/LC_MESSAGES/django.po +2 -2
  169. wagtail/snippets/locale/fr/LC_MESSAGES/django.po +2 -2
  170. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  171. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +2 -2
  172. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  173. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +6 -2
  174. wagtail/snippets/locale/lv/LC_MESSAGES/django.mo +0 -0
  175. wagtail/snippets/locale/lv/LC_MESSAGES/django.po +12 -0
  176. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  177. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +4 -0
  178. wagtail/snippets/templates/wagtailsnippets/snippets/create.html +1 -2
  179. wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +1 -2
  180. wagtail/snippets/tests/test_viewset.py +32 -0
  181. wagtail/snippets/views/snippets.py +0 -19
  182. wagtail/test/testapp/migrations/0034_testpermissionedgenericsetting_and_more.py +42 -0
  183. wagtail/test/testapp/models.py +46 -0
  184. wagtail/test/testapp/views.py +1 -1
  185. wagtail/users/locale/fr/LC_MESSAGES/django.po +2 -2
  186. wagtail/users/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  187. wagtail/users/locale/he_IL/LC_MESSAGES/django.po +2 -2
  188. wagtail/users/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  189. wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +13 -2
  190. wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -1
  191. wagtail/users/templates/wagtailusers/users/create.html +0 -5
  192. wagtail/users/templates/wagtailusers/users/edit.html +0 -5
  193. wagtail/users/tests/test_admin_views.py +7 -1
  194. {wagtail-6.0.1.dist-info → wagtail-6.0.3.dist-info}/METADATA +2 -2
  195. {wagtail-6.0.1.dist-info → wagtail-6.0.3.dist-info}/RECORD +199 -197
  196. {wagtail-6.0.1.dist-info → wagtail-6.0.3.dist-info}/LICENSE +0 -0
  197. {wagtail-6.0.1.dist-info → wagtail-6.0.3.dist-info}/WHEEL +0 -0
  198. {wagtail-6.0.1.dist-info → wagtail-6.0.3.dist-info}/entry_points.txt +0 -0
  199. {wagtail-6.0.1.dist-info → wagtail-6.0.3.dist-info}/top_level.txt +0 -0
@@ -56,6 +56,7 @@
56
56
  <script src="{% versioned_static 'wagtailadmin/js/wagtailadmin.js' %}"></script>
57
57
  <script src="{% versioned_static 'wagtailadmin/js/telepath/telepath.js' %}"></script>
58
58
  <script src="{% versioned_static 'wagtailadmin/js/sidebar.js' %}"></script>
59
+ <script src="{% versioned_static 'wagtailadmin/js/modal-workflow.js' %}"></script>
59
60
 
60
61
  {% hook_output 'insert_global_admin_js' %}
61
62
 
@@ -7,6 +7,5 @@
7
7
 
8
8
  {% block extra_js %}
9
9
  {{ block.super }}
10
- <script src="{% versioned_static 'wagtailadmin/js/modal-workflow.js' %}"></script>
11
10
  <script src="{% versioned_static 'wagtailadmin/js/privacy-switch.js' %}"></script>
12
11
  {% endblock %}
@@ -44,6 +44,7 @@
44
44
  {% block extra_js %}
45
45
  {{ block.super }}
46
46
  {{ media.js }}
47
+ {% include "wagtailadmin/pages/_editor_js.html" %}
47
48
  {% endblock %}
48
49
 
49
50
  {% block extra_css %}
@@ -12,6 +12,14 @@
12
12
  </template>
13
13
  {% endif %}
14
14
 
15
+ {% if render_buttons_fragment %}
16
+ <template data-controller="w-teleport" data-w-teleport-target-value="#w-slim-header-buttons" data-w-teleport-reset-value="true">
17
+ {% for button in header_buttons %}
18
+ {% component button %}
19
+ {% endfor %}
20
+ </template>
21
+ {% endif %}
22
+
15
23
  {% if is_searching and view.show_other_searches %}
16
24
  <div class="nice-padding">
17
25
  {% search_other %}
@@ -89,7 +89,6 @@
89
89
  </table>
90
90
  {% endpanel %}
91
91
 
92
- <script src="{% versioned_static 'wagtailadmin/js/modal-workflow.js' %}"></script>
93
92
  <script src="{% versioned_static 'wagtailadmin/js/workflow-action.js' %}"></script>
94
93
  <script>
95
94
  document.querySelectorAll('[data-controller="w-dropdown"]').forEach((e) => {
@@ -18,7 +18,6 @@
18
18
  <script src="{% versioned_static 'wagtailadmin/js/vendor/rangy-core.js' %}"></script>
19
19
  <script src="{% versioned_static 'wagtailadmin/js/vendor/mousetrap.min.js' %}"></script>
20
20
  <script src="{% versioned_static 'wagtailadmin/js/expanding-formset.js' %}"></script>
21
- <script src="{% versioned_static 'wagtailadmin/js/modal-workflow.js' %}"></script>
22
21
  <script src="{% versioned_static 'wagtailadmin/js/page-editor.js' %}"></script>
23
22
  <script src="{% versioned_static 'wagtailadmin/js/preview-panel.js' %}"></script>
24
23
  <script src="{% versioned_static 'wagtailadmin/js/privacy-switch.js' %}"></script>
@@ -23,8 +23,6 @@
23
23
  {% block extra_js %}
24
24
  {{ block.super }}
25
25
 
26
- {% comment %} modal-workflow is required by the view restrictions interface {% endcomment %}
27
- <script src="{% versioned_static 'wagtailadmin/js/modal-workflow.js' %}"></script>
28
26
  <script src="{% versioned_static 'wagtailadmin/js/privacy-switch.js' %}"></script>
29
27
 
30
28
  {% comment %}
@@ -49,7 +49,7 @@
49
49
  {% if actions or block_actions %}
50
50
  {# Actions divider #}
51
51
  <div class="w-w-px w-h-[30px] w-ml-auto sm:w-ml-0 w-bg-border-furniture"></div>
52
- <div class="w-flex w-items-center w-ml-3">
52
+ <div id="w-slim-header-buttons" class="w-flex w-items-center w-ml-3">
53
53
  {% firstof actions block_actions %}
54
54
  </div>
55
55
  {% endif %}
@@ -1310,7 +1310,7 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
1310
1310
  self.assertEqual(response.status_code, 403)
1311
1311
  content = json.loads(response.content.decode("utf-8"))
1312
1312
  self.assertEqual(
1313
- content, {"detail": "You do not have permission to perform this action."}
1313
+ content, {"detail": "You do not have permission to copy this page"}
1314
1314
  )
1315
1315
 
1316
1316
  def test_recursively_copy_into_self(self):
@@ -1348,7 +1348,7 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
1348
1348
  self.assertEqual(response.status_code, 403)
1349
1349
  content = json.loads(response.content.decode("utf-8"))
1350
1350
  self.assertEqual(
1351
- content, {"detail": "You do not have permission to perform this action."}
1351
+ content, {"detail": "You do not have permission to copy this page"}
1352
1352
  )
1353
1353
 
1354
1354
  def test_without_publish_permissions_at_destination_with_keep_live(self):
@@ -1375,7 +1375,12 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
1375
1375
  self.assertEqual(response.status_code, 403)
1376
1376
  content = json.loads(response.content.decode("utf-8"))
1377
1377
  self.assertEqual(
1378
- content, {"detail": "You do not have permission to perform this action."}
1378
+ content,
1379
+ {
1380
+ "detail": (
1381
+ "You do not have permission to publish a page at the destination"
1382
+ )
1383
+ },
1379
1384
  )
1380
1385
 
1381
1386
  def test_respects_page_creation_rules(self):
@@ -1385,7 +1390,7 @@ class TestCopyPageAction(AdminAPITestCase, TestCase):
1385
1390
  self.assertEqual(response.status_code, 403)
1386
1391
  content = json.loads(response.content.decode("utf-8"))
1387
1392
  self.assertEqual(
1388
- content, {"detail": "You do not have permission to perform this action."}
1393
+ content, {"detail": "You do not have permission to copy this page"}
1389
1394
  )
1390
1395
 
1391
1396
  def test_copy_page_slug_in_use(self):
@@ -1512,7 +1517,7 @@ class TestDeletePageAction(AdminAPITestCase, TestCase):
1512
1517
  self.assertEqual(response.status_code, 403)
1513
1518
  content = json.loads(response.content.decode("utf-8"))
1514
1519
  self.assertEqual(
1515
- content, {"detail": "You do not have permission to perform this action."}
1520
+ content, {"detail": "You do not have permission to delete this page"}
1516
1521
  )
1517
1522
 
1518
1523
  # Page is still there
@@ -1560,7 +1565,7 @@ class TestPublishPageAction(AdminAPITestCase, TestCase):
1560
1565
  self.assertEqual(response.status_code, 403)
1561
1566
  content = json.loads(response.content.decode("utf-8"))
1562
1567
  self.assertEqual(
1563
- content, {"detail": "You do not have permission to perform this action."}
1568
+ content, {"detail": "You do not have permission to publish this page"}
1564
1569
  )
1565
1570
 
1566
1571
  def test_publish_alias_page(self):
@@ -1650,7 +1655,7 @@ class TestUnpublishPageAction(AdminAPITestCase, TestCase):
1650
1655
  self.assertEqual(response.status_code, 403)
1651
1656
  content = json.loads(response.content.decode("utf-8"))
1652
1657
  self.assertEqual(
1653
- content, {"detail": "You do not have permission to perform this action."}
1658
+ content, {"detail": "You do not have permission to unpublish this page"}
1654
1659
  )
1655
1660
 
1656
1661
 
@@ -1682,7 +1687,13 @@ class TestMovePageAction(AdminAPITestCase, TestCase):
1682
1687
 
1683
1688
  content = json.loads(response.content.decode("utf-8"))
1684
1689
  self.assertEqual(
1685
- content, {"detail": "You do not have permission to perform this action."}
1690
+ content,
1691
+ {
1692
+ "detail": (
1693
+ "You do not have permission to move the page to the "
1694
+ "target specified."
1695
+ ),
1696
+ },
1686
1697
  )
1687
1698
 
1688
1699
  def test_move_page_without_destination_page_id(self):
@@ -1955,7 +1966,12 @@ class TestCreatePageAliasAction(AdminAPITestCase, TestCase):
1955
1966
 
1956
1967
  content = json.loads(response.content.decode("utf-8"))
1957
1968
  self.assertEqual(
1958
- content, {"detail": "You do not have permission to perform this action."}
1969
+ content,
1970
+ {
1971
+ "detail": (
1972
+ "You do not have permission to publish a page at the destination"
1973
+ ),
1974
+ },
1959
1975
  )
1960
1976
 
1961
1977
 
@@ -2012,7 +2028,7 @@ class TestRevertToPageRevisionAction(AdminAPITestCase, TestCase):
2012
2028
 
2013
2029
  content = json.loads(response.content.decode("utf-8"))
2014
2030
  self.assertEqual(
2015
- content, {"detail": "You do not have permission to perform this action."}
2031
+ content, {"detail": "You do not have permission to edit this page"}
2016
2032
  )
2017
2033
 
2018
2034
  def test_revert_to_page_revision_without_revision_id(self):
@@ -4,6 +4,7 @@ from django.contrib.auth.models import Permission
4
4
  from django.core import management
5
5
  from django.test import TransactionTestCase
6
6
  from django.urls import reverse
7
+ from django.utils.http import urlencode
7
8
 
8
9
  from wagtail.models import Page
9
10
  from wagtail.test.testapp.models import EventIndex, SimplePage, SingleEventPage
@@ -33,10 +34,29 @@ class TestPageSearch(WagtailTestUtils, TransactionTestCase):
33
34
  self.assertEqual(response.status_code, 200)
34
35
 
35
36
  def test_search(self):
37
+ # Find root page
38
+ root_page = Page.objects.get(id=2)
39
+
40
+ # Create a page
41
+ new_page = root_page.add_child(
42
+ instance=SimplePage(
43
+ title="Hello from Cauldron Lake",
44
+ slug="bright-falls",
45
+ content="It's not a lake, it's an ocean",
46
+ live=True,
47
+ has_unpublished_changes=False,
48
+ )
49
+ )
50
+
36
51
  response = self.get({"q": "Hello"})
37
52
  self.assertEqual(response.status_code, 200)
38
53
  self.assertTemplateUsed(response, "wagtailadmin/pages/search.html")
39
54
  self.assertEqual(response.context["query_string"], "Hello")
55
+ next_url = urlencode({"next": reverse("wagtailadmin_pages:search")})
56
+ expected_new_page_copy_url = (
57
+ reverse("wagtailadmin_pages:copy", args=(new_page.pk,)) + f"?{next_url}"
58
+ )
59
+ self.assertContains(response, f'href="{expected_new_page_copy_url}"')
40
60
 
41
61
  def test_search_searchable_fields(self):
42
62
  # Find root page
@@ -62,6 +82,20 @@ class TestPageSearch(WagtailTestUtils, TransactionTestCase):
62
82
  self.assertContains(response, "There is one matching page")
63
83
 
64
84
  def test_ajax(self):
85
+ # Find root page
86
+ root_page = Page.objects.get(id=2)
87
+
88
+ # Create a page
89
+ new_page = root_page.add_child(
90
+ instance=SimplePage(
91
+ title="Hello from Cauldron Lake",
92
+ slug="bright-falls",
93
+ content="It's not a lake, it's an ocean",
94
+ live=True,
95
+ has_unpublished_changes=False,
96
+ )
97
+ )
98
+
65
99
  response = self.get(
66
100
  {"q": "Hello"}, url_name="wagtailadmin_pages:search_results"
67
101
  )
@@ -69,6 +103,11 @@ class TestPageSearch(WagtailTestUtils, TransactionTestCase):
69
103
  self.assertTemplateNotUsed(response, "wagtailadmin/pages/search.html")
70
104
  self.assertTemplateUsed(response, "wagtailadmin/pages/search_results.html")
71
105
  self.assertEqual(response.context["query_string"], "Hello")
106
+ next_url = urlencode({"next": reverse("wagtailadmin_pages:search")})
107
+ expected_new_page_copy_url = (
108
+ reverse("wagtailadmin_pages:copy", args=(new_page.pk,)) + f"?{next_url}"
109
+ )
110
+ self.assertContains(response, f'href="{expected_new_page_copy_url}"')
72
111
 
73
112
  def test_pagination(self):
74
113
  # page numbers in range should be accepted
@@ -6,7 +6,7 @@ from django.contrib.admin.utils import quote
6
6
  from django.contrib.auth import get_permission_codename
7
7
  from django.contrib.auth.models import Permission
8
8
  from django.contrib.contenttypes.models import ContentType
9
- from django.test import RequestFactory, TestCase
9
+ from django.test import TestCase
10
10
  from django.urls import NoReverseMatch, reverse
11
11
  from django.utils.formats import date_format, localize
12
12
  from django.utils.html import escape
@@ -14,6 +14,7 @@ from django.utils.timezone import make_aware
14
14
  from openpyxl import load_workbook
15
15
 
16
16
  from wagtail.admin.admin_url_finder import AdminURLFinder
17
+ from wagtail.admin.staticfiles import versioned_static
17
18
  from wagtail.log_actions import log
18
19
  from wagtail.models import ModelLogEntry
19
20
  from wagtail.test.testapp.models import (
@@ -22,7 +23,6 @@ from wagtail.test.testapp.models import (
22
23
  SearchTestModel,
23
24
  VariousOnDeleteModel,
24
25
  )
25
- from wagtail.test.testapp.views import FCToyAlt1ViewSet
26
26
  from wagtail.test.utils.template_tests import AdminTemplateTestUtils
27
27
  from wagtail.test.utils.wagtail_tests import WagtailTestUtils
28
28
  from wagtail.utils.deprecation import RemovedInWagtail70Warning
@@ -1425,14 +1425,11 @@ class TestCopyView(WagtailTestUtils, TestCase):
1425
1425
  self.assertRedirects(response, reverse("wagtailadmin_home"))
1426
1426
 
1427
1427
  def test_form_is_prefilled(self):
1428
- request = RequestFactory().get(self.url)
1429
- request.user = self.user
1430
- view = FCToyAlt1ViewSet().copy_view_class()
1431
- view.setup(request)
1432
- view.model = self.object.__class__
1433
- view.kwargs = {"pk": self.object.pk}
1434
-
1435
- self.assertEqual(view.get_form_kwargs()["instance"], self.object)
1428
+ response = self.client.get(self.url)
1429
+ self.assertEqual(response.status_code, 200)
1430
+ soup = self.get_soup(response.content)
1431
+ name_input = soup.select_one('input[name="name"]')
1432
+ self.assertEqual(name_input.attrs.get("value"), "Test Toy")
1436
1433
 
1437
1434
 
1438
1435
  class TestEditHandler(WagtailTestUtils, TestCase):
@@ -1448,6 +1445,10 @@ class TestEditHandler(WagtailTestUtils, TestCase):
1448
1445
  response = self.client.get(self.url)
1449
1446
  self.assertEqual(response.status_code, 200)
1450
1447
  self.assertTemplateUsed(response, "wagtailadmin/shared/panel.html")
1448
+ # Many features from the Panels API are powered by client-side JS in
1449
+ # _editor_js.html. We need to make sure that this template is included
1450
+ # in the response for now.
1451
+ self.assertTemplateUsed(response, "wagtailadmin/pages/_editor_js.html", count=1)
1451
1452
 
1452
1453
  soup = self.get_soup(response.content)
1453
1454
 
@@ -1464,6 +1465,40 @@ class TestEditHandler(WagtailTestUtils, TestCase):
1464
1465
  self.assertIsNotNone(rendered_heading)
1465
1466
  self.assertEqual(rendered_heading.text.strip(), expected_heading)
1466
1467
 
1468
+ # Ensure modal-workflow.js is included, as it's needed by choosers
1469
+ modal_workflow_js = versioned_static("wagtailadmin/js/modal-workflow.js")
1470
+ modal_workflow_script = soup.select_one(f'script[src="{modal_workflow_js}"]')
1471
+ self.assertIsNotNone(modal_workflow_script)
1472
+
1473
+ def test_field_permissions(self):
1474
+ self.user.is_superuser = False
1475
+ self.user.save()
1476
+ self.user.user_permissions.add(
1477
+ Permission.objects.get(
1478
+ content_type__app_label="wagtailadmin", codename="access_admin"
1479
+ ),
1480
+ Permission.objects.get(
1481
+ content_type__app_label=self.object._meta.app_label,
1482
+ codename=get_permission_codename("change", self.object._meta),
1483
+ ),
1484
+ )
1485
+
1486
+ response = self.client.get(self.url)
1487
+ self.assertEqual(response.status_code, 200)
1488
+ self.assertEqual(list(response.context["form"].fields), ["name"])
1489
+
1490
+ self.user.user_permissions.add(
1491
+ Permission.objects.get(
1492
+ codename="can_set_release_date",
1493
+ )
1494
+ )
1495
+
1496
+ response = self.client.get(self.url)
1497
+ self.assertEqual(response.status_code, 200)
1498
+ self.assertEqual(
1499
+ list(response.context["form"].fields), ["name", "release_date"]
1500
+ )
1501
+
1467
1502
 
1468
1503
  class TestDefaultMessages(WagtailTestUtils, TestCase):
1469
1504
  def setUp(self):
@@ -442,5 +442,8 @@ class BaseListingView(WagtailAdminTemplateMixin, BaseListView):
442
442
  and self.filters
443
443
  and self.results_only
444
444
  )
445
+ context["render_buttons_fragment"] = (
446
+ context.get("header_buttons") and self.results_only
447
+ )
445
448
 
446
449
  return context
@@ -27,6 +27,7 @@ from django.views.generic.edit import (
27
27
  from wagtail.actions.unpublish import UnpublishAction
28
28
  from wagtail.admin import messages
29
29
  from wagtail.admin.filters import WagtailFilterSet
30
+ from wagtail.admin.forms.models import WagtailAdminModelForm
30
31
  from wagtail.admin.forms.search import SearchForm
31
32
  from wagtail.admin.panels import get_edit_handler
32
33
  from wagtail.admin.ui.components import Component, MediaContainer
@@ -334,7 +335,6 @@ class IndexView(
334
335
  self.add_item_label,
335
336
  url=self.add_url,
336
337
  icon_name="plus",
337
- attrs={"data-w-link-reflect-keys-value": '["locale"]'},
338
338
  )
339
339
  )
340
340
  return buttons
@@ -349,10 +349,6 @@ class IndexView(
349
349
  url=self.xlsx_export_url,
350
350
  icon_name="download",
351
351
  priority=90,
352
- attrs={
353
- "data-controller": "w-link",
354
- "data-w-link-preserve-keys-value": '["export"]',
355
- },
356
352
  )
357
353
  )
358
354
  buttons.append(
@@ -361,10 +357,6 @@ class IndexView(
361
357
  url=self.csv_export_url,
362
358
  icon_name="download",
363
359
  priority=100,
364
- attrs={
365
- "data-controller": "w-link",
366
- "data-w-link-preserve-keys-value": '["export"]',
367
- },
368
360
  )
369
361
  )
370
362
 
@@ -625,6 +617,24 @@ class CreateView(
625
617
  for locale in Locale.objects.all().exclude(id=self.locale.id)
626
618
  ]
627
619
 
620
+ def get_initial_form_instance(self):
621
+ if self.locale:
622
+ instance = self.model()
623
+ instance.locale = self.locale
624
+ return instance
625
+
626
+ def get_form_kwargs(self):
627
+ if instance := self.get_initial_form_instance():
628
+ # super().get_form_kwargs() will use self.object as the instance kwarg
629
+ self.object = instance
630
+ kwargs = super().get_form_kwargs()
631
+
632
+ form_class = self.get_form_class()
633
+ # Add for_user support for PermissionedForm
634
+ if issubclass(form_class, WagtailAdminModelForm):
635
+ kwargs["for_user"] = self.request.user
636
+ return kwargs
637
+
628
638
  def save_instance(self):
629
639
  """
630
640
  Called after the form is successfully validated - saves the object to the db
@@ -668,7 +678,7 @@ class CreateView(
668
678
 
669
679
  class CopyView(CreateView):
670
680
  def get_object(self, queryset=None):
671
- return get_object_or_404(self.model, pk=self.kwargs["pk"])
681
+ return get_object_or_404(self.model, pk=unquote(str(self.kwargs["pk"])))
672
682
 
673
683
  def get_form_kwargs(self):
674
684
  return {**super().get_form_kwargs(), "instance": self.get_object()}
@@ -795,6 +805,13 @@ class EditView(
795
805
  for translation in self.object.get_translations().select_related("locale")
796
806
  ]
797
807
 
808
+ def get_form_kwargs(self):
809
+ kwargs = super().get_form_kwargs()
810
+ form_class = self.get_form_class()
811
+ if issubclass(form_class, WagtailAdminModelForm):
812
+ kwargs["for_user"] = self.request.user
813
+ return kwargs
814
+
798
815
  def save_instance(self):
799
816
  """
800
817
  Called after the form is successfully validated - saves the object to the db.
@@ -162,6 +162,7 @@ class BaseSearchView(PermissionCheckedMixin, BaseListingView):
162
162
  def get_table_kwargs(self):
163
163
  kwargs = super().get_table_kwargs()
164
164
  kwargs["show_locale_labels"] = self.show_locale_labels
165
+ kwargs["actions_next_url"] = self.get_index_url()
165
166
  return kwargs
166
167
 
167
168
  def get_context_data(self, **kwargs: Any) -> Dict[str, Any]:
@@ -109,9 +109,8 @@ class HeaderButton(Button):
109
109
  attrs = attrs.copy()
110
110
  attrs.update(
111
111
  {
112
- "data-controller": "w-tooltip w-link",
112
+ "data-controller": "w-tooltip",
113
113
  "data-w-tooltip-content-value": label,
114
- "data-action": "w-swap:success@document->w-link#setParamsFromSwapRequest",
115
114
  "aria-label": label,
116
115
  }
117
116
  )
@@ -17,8 +17,8 @@ msgstr ""
17
17
  "Content-Type: text/plain; charset=UTF-8\n"
18
18
  "Content-Transfer-Encoding: 8bit\n"
19
19
  "Language: he_IL\n"
20
- "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
21
- "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
20
+ "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
21
+ "1 == 0) ? 1: 2;\n"
22
22
 
23
23
  msgid "Date from"
24
24
  msgstr "מתאריך"
@@ -6,8 +6,8 @@
6
6
  # Axel Haustant, 2016
7
7
  # Axel Haustant, 2016
8
8
  # Bertrand Bordage <bordage.bertrand@gmail.com>, 2015,2017-2018
9
- # fpoulain <fpoulain@metrodore.fr>, 2018
10
- # fpoulain <fpoulain@metrodore.fr>, 2018
9
+ # 69c761fa404d2f74d5a7a2904d9e6f47_dc2dbc9 <f37077798760362881f9d396b6e22ec7_1878>, 2018
10
+ # 69c761fa404d2f74d5a7a2904d9e6f47_dc2dbc9 <f37077798760362881f9d396b6e22ec7_1878>, 2018
11
11
  # Léo <leo@naeka.fr>, 2016
12
12
  # Loic Teixeira, 2020-2022
13
13
  # nahuel, 2014
@@ -20,8 +20,8 @@ msgstr ""
20
20
  "Content-Type: text/plain; charset=UTF-8\n"
21
21
  "Content-Transfer-Encoding: 8bit\n"
22
22
  "Language: he_IL\n"
23
- "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
24
- "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
23
+ "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
24
+ "1 == 0) ? 1: 2;\n"
25
25
 
26
26
  msgid "Type"
27
27
  msgstr "סוג"
@@ -5,8 +5,8 @@
5
5
  # Translators:
6
6
  # Adrien <laadrien@gmail.com>, 2014
7
7
  # Bertrand Bordage <bordage.bertrand@gmail.com>, 2015,2018
8
- # fpoulain <fpoulain@metrodore.fr>, 2018
9
- # fpoulain <fpoulain@metrodore.fr>, 2018
8
+ # 69c761fa404d2f74d5a7a2904d9e6f47_dc2dbc9 <f37077798760362881f9d396b6e22ec7_1878>, 2018
9
+ # 69c761fa404d2f74d5a7a2904d9e6f47_dc2dbc9 <f37077798760362881f9d396b6e22ec7_1878>, 2018
10
10
  # Léo <leo@naeka.fr>, 2016
11
11
  # Loic Teixeira, 2020,2022
12
12
  # Loic Teixeira, 2020,2022-2023
@@ -19,8 +19,8 @@ msgstr ""
19
19
  "Content-Type: text/plain; charset=UTF-8\n"
20
20
  "Content-Transfer-Encoding: 8bit\n"
21
21
  "Language: he_IL\n"
22
- "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
23
- "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
22
+ "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
23
+ "1 == 0) ? 1: 2;\n"
24
24
 
25
25
  msgid "Search term(s)/phrase"
26
26
  msgstr "חיפוש מושגים/משפט"
@@ -3,14 +3,14 @@
3
3
  # This file is distributed under the same license as the PACKAGE package.
4
4
  #
5
5
  # Translators:
6
- # Dino Aljević <dino8890@protonmail.com>, 2020,2022-2023
6
+ # Dino Aljević <dino8890@protonmail.com>, 2020,2022-2024
7
7
  msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: Wagtail\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
11
  "POT-Creation-Date: 2024-01-24 13:51+0000\n"
12
12
  "PO-Revision-Date: 2015-08-26 14:04+0000\n"
13
- "Last-Translator: Dino Aljević <dino8890@protonmail.com>, 2020,2022-2023\n"
13
+ "Last-Translator: Dino Aljević <dino8890@protonmail.com>, 2020,2022-2024\n"
14
14
  "Language-Team: Croatian (Croatia) (http://app.transifex.com/torchbox/wagtail/"
15
15
  "language/hr_HR/)\n"
16
16
  "MIME-Version: 1.0\n"
@@ -36,15 +36,37 @@ msgstr ""
36
36
  msgid "Please specify at least one recommendation for this search term."
37
37
  msgstr "Molimo navedite barem jednu preporuku za ovaj pojam."
38
38
 
39
+ msgid "You must enter an external link text if you enter an external link URL."
40
+ msgstr ""
41
+ "Potrebno je unijeti tekst vanjske poveznice ako uneste URL vanjske poveznice."
42
+
43
+ msgid "You must recommend a page OR an external link."
44
+ msgstr "Potrebno je preporučiti stranicu ILI vanjsku poveznicu."
45
+
46
+ msgid "Please only select a page OR enter an external link."
47
+ msgstr "Molimo odaberite samo stranicu ILI vanjsku poveznicu."
48
+
39
49
  msgid "Query Daily Hits"
40
50
  msgstr "Dnevni pregledi za upit"
41
51
 
42
52
  msgid "page"
43
53
  msgstr "stranica"
44
54
 
55
+ msgid "Choose an internal page for this promotion"
56
+ msgstr "Odaberite unutarnju stranicu za promociju"
57
+
58
+ msgid "External link URL"
59
+ msgstr "URL vanjske poveznice"
60
+
61
+ msgid "Alternatively, use an external link for this promotion"
62
+ msgstr "Ili iskoristite vanjsku poveznicu za promociju"
63
+
45
64
  msgid "description"
46
65
  msgstr "opis"
47
66
 
67
+ msgid "Applies to internal page or external link"
68
+ msgstr "Za unutarnju stranicu ili vanjsku poveznicu"
69
+
48
70
  msgid "search promotion"
49
71
  msgstr "Promocija pretraživanja"
50
72
 
@@ -54,6 +76,17 @@ msgstr "Dodaj promociju"
54
76
  msgid "Add search pick"
55
77
  msgstr "Dodaj promovirani rezultat"
56
78
 
79
+ msgid ""
80
+ "<p>Promoted search results are a means of recommending specific pages or "
81
+ "external links that might not organically come high up in search results. E."
82
+ "g recommending your primary donation page to a user searching with the less "
83
+ "common term \"<em>giving</em>\".</p>"
84
+ msgstr ""
85
+ "<p> Promovirani rezultati pretraživanja su način za preporuku određenih "
86
+ "stranica ili vanjskih poveznica koje se možda neće priordno pojaviti pri "
87
+ "vrhu u rezultatima pretraživanja. Npr. preporuka glavne stranice za donacije "
88
+ "korisniku koji pretražuje manje učestao pojam \"<em>darivanje</em>\".</p>"
89
+
57
90
  msgid ""
58
91
  "<p>The \"Search term(s)/phrase\" field below must contain the full and exact "
59
92
  "search for which you wish to provide recommended results, <em>including</em> "
@@ -96,9 +129,15 @@ msgstr "Pomakni gore"
96
129
  msgid "Move down"
97
130
  msgstr "Pomakni dolje"
98
131
 
132
+ msgid "Recommended search result"
133
+ msgstr "Preporučeni rezultat pretraživanja"
134
+
99
135
  msgid "Promoted search results"
100
136
  msgstr "Promovirani rezultati pretraživanja"
101
137
 
138
+ msgid "Add a recommended result"
139
+ msgstr "Dodaj preporučeni rezultat"
140
+
102
141
  msgid "Search Terms"
103
142
  msgstr "Pojmovi za pretraživanje"
104
143