wagtail 6.4.1__py3-none-any.whl → 7.0rc1__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 (1199) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_page.py +4 -4
  3. wagtail/admin/action_menu.py +3 -0
  4. wagtail/admin/active_filters.py +218 -0
  5. wagtail/admin/auth.py +3 -39
  6. wagtail/admin/forms/choosers.py +8 -7
  7. wagtail/admin/forms/models.py +46 -1
  8. wagtail/admin/forms/pages.py +9 -0
  9. wagtail/admin/locale/ar/LC_MESSAGES/django.mo +0 -0
  10. wagtail/admin/locale/ar/LC_MESSAGES/django.po +30 -12
  11. wagtail/admin/locale/ar/LC_MESSAGES/djangojs.mo +0 -0
  12. wagtail/admin/locale/ar/LC_MESSAGES/djangojs.po +5 -1
  13. wagtail/admin/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  14. wagtail/admin/locale/be/LC_MESSAGES/django.mo +0 -0
  15. wagtail/admin/locale/be/LC_MESSAGES/django.po +27 -13
  16. wagtail/admin/locale/be/LC_MESSAGES/djangojs.mo +0 -0
  17. wagtail/admin/locale/be/LC_MESSAGES/djangojs.po +3 -0
  18. wagtail/admin/locale/bg/LC_MESSAGES/django.mo +0 -0
  19. wagtail/admin/locale/bg/LC_MESSAGES/django.po +3 -3
  20. wagtail/admin/locale/bn/LC_MESSAGES/django.po +1 -1
  21. wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
  22. wagtail/admin/locale/ca/LC_MESSAGES/django.po +30 -28
  23. wagtail/admin/locale/ca/LC_MESSAGES/djangojs.mo +0 -0
  24. wagtail/admin/locale/ca/LC_MESSAGES/djangojs.po +3 -0
  25. wagtail/admin/locale/cs/LC_MESSAGES/django.mo +0 -0
  26. wagtail/admin/locale/cs/LC_MESSAGES/django.po +30 -19
  27. wagtail/admin/locale/cs/LC_MESSAGES/djangojs.mo +0 -0
  28. wagtail/admin/locale/cs/LC_MESSAGES/djangojs.po +5 -2
  29. wagtail/admin/locale/cy/LC_MESSAGES/django.po +1 -1
  30. wagtail/admin/locale/cy/LC_MESSAGES/djangojs.mo +0 -0
  31. wagtail/admin/locale/cy/LC_MESSAGES/djangojs.po +3 -0
  32. wagtail/admin/locale/da/LC_MESSAGES/django.po +4 -4
  33. wagtail/admin/locale/de/LC_MESSAGES/django.mo +0 -0
  34. wagtail/admin/locale/de/LC_MESSAGES/django.po +33 -30
  35. wagtail/admin/locale/de/LC_MESSAGES/djangojs.mo +0 -0
  36. wagtail/admin/locale/de/LC_MESSAGES/djangojs.po +5 -1
  37. wagtail/admin/locale/dv/LC_MESSAGES/django.mo +0 -0
  38. wagtail/admin/locale/dv/LC_MESSAGES/django.po +7 -18
  39. wagtail/admin/locale/dv/LC_MESSAGES/djangojs.mo +0 -0
  40. wagtail/admin/locale/dv/LC_MESSAGES/djangojs.po +3 -0
  41. wagtail/admin/locale/el/LC_MESSAGES/django.mo +0 -0
  42. wagtail/admin/locale/el/LC_MESSAGES/django.po +9 -8
  43. wagtail/admin/locale/el/LC_MESSAGES/djangojs.mo +0 -0
  44. wagtail/admin/locale/el/LC_MESSAGES/djangojs.po +5 -2
  45. wagtail/admin/locale/en/LC_MESSAGES/django.po +386 -319
  46. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +11 -7
  47. wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
  48. wagtail/admin/locale/es/LC_MESSAGES/django.po +32 -22
  49. wagtail/admin/locale/es/LC_MESSAGES/djangojs.mo +0 -0
  50. wagtail/admin/locale/es/LC_MESSAGES/djangojs.po +5 -2
  51. wagtail/admin/locale/es_419/LC_MESSAGES/django.po +2 -1
  52. wagtail/admin/locale/es_VE/LC_MESSAGES/django.po +2 -1
  53. wagtail/admin/locale/et/LC_MESSAGES/django.mo +0 -0
  54. wagtail/admin/locale/et/LC_MESSAGES/django.po +30 -19
  55. wagtail/admin/locale/et/LC_MESSAGES/djangojs.mo +0 -0
  56. wagtail/admin/locale/et/LC_MESSAGES/djangojs.po +3 -0
  57. wagtail/admin/locale/eu/LC_MESSAGES/django.po +1 -1
  58. wagtail/admin/locale/fa/LC_MESSAGES/django.mo +0 -0
  59. wagtail/admin/locale/fa/LC_MESSAGES/django.po +10 -9
  60. wagtail/admin/locale/fa/LC_MESSAGES/djangojs.mo +0 -0
  61. wagtail/admin/locale/fa/LC_MESSAGES/djangojs.po +5 -2
  62. wagtail/admin/locale/fi/LC_MESSAGES/django.mo +0 -0
  63. wagtail/admin/locale/fi/LC_MESSAGES/django.po +30 -21
  64. wagtail/admin/locale/fi/LC_MESSAGES/djangojs.mo +0 -0
  65. wagtail/admin/locale/fi/LC_MESSAGES/djangojs.po +5 -2
  66. wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
  67. wagtail/admin/locale/fr/LC_MESSAGES/django.po +80 -24
  68. wagtail/admin/locale/fr/LC_MESSAGES/djangojs.mo +0 -0
  69. wagtail/admin/locale/fr/LC_MESSAGES/djangojs.po +3 -0
  70. wagtail/admin/locale/gl/LC_MESSAGES/django.mo +0 -0
  71. wagtail/admin/locale/gl/LC_MESSAGES/django.po +75 -22
  72. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.mo +0 -0
  73. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.po +3 -0
  74. wagtail/admin/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  75. wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +5 -5
  76. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  77. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +30 -19
  78. wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.mo +0 -0
  79. wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.po +3 -0
  80. wagtail/admin/locale/ht/LC_MESSAGES/django.po +1 -1
  81. wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
  82. wagtail/admin/locale/hu/LC_MESSAGES/django.po +350 -25
  83. wagtail/admin/locale/hu/LC_MESSAGES/djangojs.mo +0 -0
  84. wagtail/admin/locale/hu/LC_MESSAGES/djangojs.po +8 -0
  85. wagtail/admin/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  86. wagtail/admin/locale/id_ID/LC_MESSAGES/django.po +11 -11
  87. wagtail/admin/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  88. wagtail/admin/locale/is_IS/LC_MESSAGES/django.po +30 -29
  89. wagtail/admin/locale/is_IS/LC_MESSAGES/djangojs.mo +0 -0
  90. wagtail/admin/locale/is_IS/LC_MESSAGES/djangojs.po +5 -2
  91. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  92. wagtail/admin/locale/it/LC_MESSAGES/django.po +30 -29
  93. wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
  94. wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +5 -2
  95. wagtail/admin/locale/ja/LC_MESSAGES/django.mo +0 -0
  96. wagtail/admin/locale/ja/LC_MESSAGES/django.po +14 -15
  97. wagtail/admin/locale/ja/LC_MESSAGES/djangojs.mo +0 -0
  98. wagtail/admin/locale/ja/LC_MESSAGES/djangojs.po +5 -2
  99. wagtail/admin/locale/ka/LC_MESSAGES/django.po +1 -1
  100. wagtail/admin/locale/ko/LC_MESSAGES/django.mo +0 -0
  101. wagtail/admin/locale/ko/LC_MESSAGES/django.po +92 -19
  102. wagtail/admin/locale/ko/LC_MESSAGES/djangojs.mo +0 -0
  103. wagtail/admin/locale/ko/LC_MESSAGES/djangojs.po +16 -0
  104. wagtail/admin/locale/lt/LC_MESSAGES/django.mo +0 -0
  105. wagtail/admin/locale/lt/LC_MESSAGES/django.po +30 -15
  106. wagtail/admin/locale/lt/LC_MESSAGES/djangojs.mo +0 -0
  107. wagtail/admin/locale/lt/LC_MESSAGES/djangojs.po +3 -0
  108. wagtail/admin/locale/lv/LC_MESSAGES/django.mo +0 -0
  109. wagtail/admin/locale/lv/LC_MESSAGES/django.po +10 -9
  110. wagtail/admin/locale/lv/LC_MESSAGES/djangojs.mo +0 -0
  111. wagtail/admin/locale/lv/LC_MESSAGES/djangojs.po +3 -0
  112. wagtail/admin/locale/mi/LC_MESSAGES/django.po +1 -1
  113. wagtail/admin/locale/mi/LC_MESSAGES/djangojs.mo +0 -0
  114. wagtail/admin/locale/mi/LC_MESSAGES/djangojs.po +3 -0
  115. wagtail/admin/locale/mn/LC_MESSAGES/django.mo +0 -0
  116. wagtail/admin/locale/mn/LC_MESSAGES/django.po +12 -11
  117. wagtail/admin/locale/my/LC_MESSAGES/django.po +1 -1
  118. wagtail/admin/locale/nb/LC_MESSAGES/django.mo +0 -0
  119. wagtail/admin/locale/nb/LC_MESSAGES/django.po +31 -15
  120. wagtail/admin/locale/nb/LC_MESSAGES/djangojs.mo +0 -0
  121. wagtail/admin/locale/nb/LC_MESSAGES/djangojs.po +5 -2
  122. wagtail/admin/locale/nl/LC_MESSAGES/django.mo +0 -0
  123. wagtail/admin/locale/nl/LC_MESSAGES/django.po +32 -29
  124. wagtail/admin/locale/nl/LC_MESSAGES/djangojs.mo +0 -0
  125. wagtail/admin/locale/nl/LC_MESSAGES/djangojs.po +5 -2
  126. wagtail/admin/locale/pl/LC_MESSAGES/django.mo +0 -0
  127. wagtail/admin/locale/pl/LC_MESSAGES/django.po +30 -22
  128. wagtail/admin/locale/pl/LC_MESSAGES/djangojs.mo +0 -0
  129. wagtail/admin/locale/pl/LC_MESSAGES/djangojs.po +3 -0
  130. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  131. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.po +33 -28
  132. wagtail/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo +0 -0
  133. wagtail/admin/locale/pt_BR/LC_MESSAGES/djangojs.po +3 -0
  134. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  135. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +31 -18
  136. wagtail/admin/locale/pt_PT/LC_MESSAGES/djangojs.mo +0 -0
  137. wagtail/admin/locale/pt_PT/LC_MESSAGES/djangojs.po +5 -2
  138. wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
  139. wagtail/admin/locale/ro/LC_MESSAGES/django.po +30 -28
  140. wagtail/admin/locale/ro/LC_MESSAGES/djangojs.mo +0 -0
  141. wagtail/admin/locale/ro/LC_MESSAGES/djangojs.po +5 -2
  142. wagtail/admin/locale/ru/LC_MESSAGES/django.mo +0 -0
  143. wagtail/admin/locale/ru/LC_MESSAGES/django.po +34 -29
  144. wagtail/admin/locale/ru/LC_MESSAGES/djangojs.mo +0 -0
  145. wagtail/admin/locale/ru/LC_MESSAGES/djangojs.po +5 -2
  146. wagtail/admin/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  147. wagtail/admin/locale/sk_SK/LC_MESSAGES/django.po +6 -6
  148. wagtail/admin/locale/sk_SK/LC_MESSAGES/djangojs.mo +0 -0
  149. wagtail/admin/locale/sk_SK/LC_MESSAGES/djangojs.po +3 -0
  150. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  151. wagtail/admin/locale/sl/LC_MESSAGES/django.po +31 -27
  152. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.mo +0 -0
  153. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.po +3 -0
  154. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  155. wagtail/admin/locale/sv/LC_MESSAGES/django.po +30 -18
  156. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.mo +0 -0
  157. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.po +5 -2
  158. wagtail/admin/locale/tet/LC_MESSAGES/django.mo +0 -0
  159. wagtail/admin/locale/tet/LC_MESSAGES/django.po +5 -5
  160. wagtail/admin/locale/tet/LC_MESSAGES/djangojs.mo +0 -0
  161. wagtail/admin/locale/tet/LC_MESSAGES/djangojs.po +5 -2
  162. wagtail/admin/locale/th/LC_MESSAGES/django.mo +0 -0
  163. wagtail/admin/locale/th/LC_MESSAGES/django.po +10 -17
  164. wagtail/admin/locale/tr/LC_MESSAGES/django.mo +0 -0
  165. wagtail/admin/locale/tr/LC_MESSAGES/django.po +28 -13
  166. wagtail/admin/locale/tr/LC_MESSAGES/djangojs.mo +0 -0
  167. wagtail/admin/locale/tr/LC_MESSAGES/djangojs.po +5 -2
  168. wagtail/admin/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  169. wagtail/admin/locale/tr_TR/LC_MESSAGES/django.po +28 -13
  170. wagtail/admin/locale/tr_TR/LC_MESSAGES/djangojs.mo +0 -0
  171. wagtail/admin/locale/tr_TR/LC_MESSAGES/djangojs.po +5 -2
  172. wagtail/admin/locale/ug/LC_MESSAGES/django.mo +0 -0
  173. wagtail/admin/locale/ug/LC_MESSAGES/django.po +12 -29
  174. wagtail/admin/locale/ug/LC_MESSAGES/djangojs.mo +0 -0
  175. wagtail/admin/locale/ug/LC_MESSAGES/djangojs.po +3 -0
  176. wagtail/admin/locale/uk/LC_MESSAGES/django.mo +0 -0
  177. wagtail/admin/locale/uk/LC_MESSAGES/django.po +30 -26
  178. wagtail/admin/locale/uk/LC_MESSAGES/djangojs.mo +0 -0
  179. wagtail/admin/locale/uk/LC_MESSAGES/djangojs.po +6 -3
  180. wagtail/admin/locale/vi/LC_MESSAGES/django.po +2 -1
  181. wagtail/admin/locale/zh/LC_MESSAGES/django.mo +0 -0
  182. wagtail/admin/locale/zh/LC_MESSAGES/django.po +2 -2
  183. wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  184. wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.po +33 -18
  185. wagtail/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo +0 -0
  186. wagtail/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po +5 -2
  187. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  188. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +11 -14
  189. wagtail/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo +0 -0
  190. wagtail/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po +3 -0
  191. wagtail/admin/localization.py +42 -1
  192. wagtail/admin/menu.py +1 -10
  193. wagtail/admin/paginator.py +95 -0
  194. wagtail/admin/panels/field_panel.py +27 -6
  195. wagtail/admin/panels/inline_panel.py +28 -11
  196. wagtail/admin/panels/multiple_chooser_panel.py +3 -3
  197. wagtail/admin/rich_text/converters/html_to_contentstate.py +6 -6
  198. wagtail/admin/search.py +1 -10
  199. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  200. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  201. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  202. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  203. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  204. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  205. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  206. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  207. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  208. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  209. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +32 -11
  210. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  211. wagtail/admin/templates/wagtailadmin/admin_base.html +1 -0
  212. wagtail/admin/templates/wagtailadmin/generic/index.html +7 -2
  213. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +2 -3
  214. wagtail/admin/templates/wagtailadmin/pages/action_menu/publish.html +2 -2
  215. wagtail/admin/templates/wagtailadmin/pages/bulk_actions/confirm_bulk_move.html +0 -1
  216. wagtail/admin/templates/wagtailadmin/pages/move_choose_destination.html +0 -1
  217. wagtail/admin/templates/wagtailadmin/panels/publishing/schedule_publishing_panel.html +1 -1
  218. wagtail/admin/templates/wagtailadmin/shared/active_filters.html +8 -1
  219. wagtail/admin/templates/wagtailadmin/shared/pagination_nav.html +25 -13
  220. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/privacy.html +1 -2
  221. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/workflow.html +1 -1
  222. wagtail/admin/templates/wagtailadmin/skeleton.html +2 -1
  223. wagtail/admin/templates/wagtailadmin/tables/locale_cell.html +4 -0
  224. wagtail/admin/templates/wagtailadmin/userbar/base.html +10 -8
  225. wagtail/admin/templatetags/wagtailadmin_tags.py +57 -132
  226. wagtail/admin/tests/pages/test_bulk_actions/test_bulk_move.py +31 -0
  227. wagtail/admin/tests/pages/test_create_page.py +627 -0
  228. wagtail/admin/tests/pages/test_edit_page.py +102 -18
  229. wagtail/admin/tests/pages/test_explorer_view.py +55 -26
  230. wagtail/admin/tests/pages/test_page_search.py +10 -0
  231. wagtail/admin/tests/pages/test_page_usage.py +2 -1
  232. wagtail/admin/tests/pages/test_preview.py +176 -36
  233. wagtail/admin/tests/pages/test_revisions.py +4 -7
  234. wagtail/admin/tests/test_account_management.py +1 -1
  235. wagtail/admin/tests/test_admin_search.py +1 -0
  236. wagtail/admin/tests/test_buttons_hooks.py +9 -145
  237. wagtail/admin/tests/test_collections_views.py +60 -0
  238. wagtail/admin/tests/test_contentstate.py +1 -1
  239. wagtail/admin/tests/test_dashboard.py +25 -0
  240. wagtail/admin/tests/test_edit_handlers.py +64 -0
  241. wagtail/admin/tests/test_forms.py +38 -0
  242. wagtail/admin/tests/test_keyboard_shortcuts.py +141 -5
  243. wagtail/admin/tests/test_page_chooser.py +2 -2
  244. wagtail/admin/tests/test_paginator.py +86 -0
  245. wagtail/admin/tests/test_privacy.py +12 -1
  246. wagtail/admin/tests/test_reports_views.py +8 -43
  247. wagtail/admin/tests/test_rich_text.py +14 -0
  248. wagtail/admin/tests/test_templatetags.py +50 -36
  249. wagtail/admin/tests/test_userbar.py +79 -15
  250. wagtail/admin/tests/test_views.py +16 -1
  251. wagtail/admin/tests/test_widgets.py +47 -8
  252. wagtail/admin/tests/test_workflows.py +119 -6
  253. wagtail/admin/tests/tests.py +16 -15
  254. wagtail/admin/tests/ui/test_sidebar.py +0 -27
  255. wagtail/admin/tests/viewsets/test_chooser_viewset.py +38 -4
  256. wagtail/admin/tests/viewsets/test_model_viewset.py +1 -37
  257. wagtail/admin/ui/side_panels.py +14 -16
  258. wagtail/admin/ui/sidebar.py +5 -37
  259. wagtail/admin/ui/tables/__init__.py +34 -2
  260. wagtail/admin/ui/tables/pages.py +9 -0
  261. wagtail/admin/urls/__init__.py +2 -2
  262. wagtail/admin/urls/pages.py +3 -1
  263. wagtail/admin/userbar.py +3 -5
  264. wagtail/admin/utils.py +43 -4
  265. wagtail/admin/views/generic/base.py +16 -115
  266. wagtail/admin/views/generic/chooser.py +25 -8
  267. wagtail/admin/views/generic/mixins.py +45 -11
  268. wagtail/admin/views/generic/models.py +15 -30
  269. wagtail/admin/views/generic/preview.py +9 -3
  270. wagtail/admin/views/generic/workflow.py +11 -1
  271. wagtail/admin/views/i18n.py +14 -0
  272. wagtail/admin/views/pages/bulk_actions/move.py +1 -1
  273. wagtail/admin/views/pages/create.py +68 -6
  274. wagtail/admin/views/pages/edit.py +33 -14
  275. wagtail/admin/views/pages/listing.py +3 -2
  276. wagtail/admin/views/pages/move.py +43 -29
  277. wagtail/admin/views/pages/preview.py +15 -2
  278. wagtail/admin/views/pages/search.py +3 -0
  279. wagtail/admin/views/reports/base.py +0 -22
  280. wagtail/admin/views/reports/page_types_usage.py +2 -1
  281. wagtail/admin/views/tags.py +3 -1
  282. wagtail/admin/views/workflows.py +0 -3
  283. wagtail/admin/viewsets/model.py +5 -48
  284. wagtail/admin/wagtail_hooks.py +16 -17
  285. wagtail/admin/widgets/button.py +3 -33
  286. wagtail/admin/widgets/tags.py +31 -3
  287. wagtail/api/v2/views.py +4 -4
  288. wagtail/blocks/base.py +18 -15
  289. wagtail/blocks/field_block.py +2 -1
  290. wagtail/blocks/stream_block.py +15 -11
  291. wagtail/compat.py +17 -1
  292. wagtail/contrib/forms/forms.py +10 -7
  293. wagtail/contrib/forms/locale/af/LC_MESSAGES/django.po +1 -1
  294. wagtail/contrib/forms/locale/ar/LC_MESSAGES/django.po +1 -1
  295. wagtail/contrib/forms/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  296. wagtail/contrib/forms/locale/be/LC_MESSAGES/django.po +1 -1
  297. wagtail/contrib/forms/locale/bg/LC_MESSAGES/django.po +1 -1
  298. wagtail/contrib/forms/locale/bn/LC_MESSAGES/django.po +1 -1
  299. wagtail/contrib/forms/locale/ca/LC_MESSAGES/django.po +1 -1
  300. wagtail/contrib/forms/locale/cs/LC_MESSAGES/django.mo +0 -0
  301. wagtail/contrib/forms/locale/cs/LC_MESSAGES/django.po +2 -2
  302. wagtail/contrib/forms/locale/cy/LC_MESSAGES/django.po +2 -1
  303. wagtail/contrib/forms/locale/da/LC_MESSAGES/django.po +1 -1
  304. wagtail/contrib/forms/locale/de/LC_MESSAGES/django.mo +0 -0
  305. wagtail/contrib/forms/locale/de/LC_MESSAGES/django.po +3 -2
  306. wagtail/contrib/forms/locale/dv/LC_MESSAGES/django.po +2 -1
  307. wagtail/contrib/forms/locale/el/LC_MESSAGES/django.po +1 -1
  308. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +4 -4
  309. wagtail/contrib/forms/locale/es/LC_MESSAGES/django.po +1 -1
  310. wagtail/contrib/forms/locale/es_419/LC_MESSAGES/django.po +1 -1
  311. wagtail/contrib/forms/locale/et/LC_MESSAGES/django.po +1 -1
  312. wagtail/contrib/forms/locale/eu/LC_MESSAGES/django.po +1 -1
  313. wagtail/contrib/forms/locale/fa/LC_MESSAGES/django.po +1 -1
  314. wagtail/contrib/forms/locale/fi/LC_MESSAGES/django.po +1 -1
  315. wagtail/contrib/forms/locale/fr/LC_MESSAGES/django.po +2 -1
  316. wagtail/contrib/forms/locale/gl/LC_MESSAGES/django.po +1 -1
  317. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.po +1 -1
  318. wagtail/contrib/forms/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  319. wagtail/contrib/forms/locale/ht/LC_MESSAGES/django.po +1 -1
  320. wagtail/contrib/forms/locale/hu/LC_MESSAGES/django.po +1 -1
  321. wagtail/contrib/forms/locale/hy/LC_MESSAGES/django.po +1 -1
  322. wagtail/contrib/forms/locale/id_ID/LC_MESSAGES/django.po +1 -1
  323. wagtail/contrib/forms/locale/is_IS/LC_MESSAGES/django.po +1 -1
  324. wagtail/contrib/forms/locale/it/LC_MESSAGES/django.po +1 -1
  325. wagtail/contrib/forms/locale/ja/LC_MESSAGES/django.po +1 -1
  326. wagtail/contrib/forms/locale/ka/LC_MESSAGES/django.po +1 -1
  327. wagtail/contrib/forms/locale/ko/LC_MESSAGES/django.po +1 -1
  328. wagtail/contrib/forms/locale/lt/LC_MESSAGES/django.po +1 -1
  329. wagtail/contrib/forms/locale/lv/LC_MESSAGES/django.po +1 -1
  330. wagtail/contrib/forms/locale/mi/LC_MESSAGES/django.po +1 -1
  331. wagtail/contrib/forms/locale/mn/LC_MESSAGES/django.mo +0 -0
  332. wagtail/contrib/forms/locale/mn/LC_MESSAGES/django.po +3 -2
  333. wagtail/contrib/forms/locale/my/LC_MESSAGES/django.po +1 -1
  334. wagtail/contrib/forms/locale/nb/LC_MESSAGES/django.po +1 -1
  335. wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.mo +0 -0
  336. wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.po +2 -2
  337. wagtail/contrib/forms/locale/pl/LC_MESSAGES/django.mo +0 -0
  338. wagtail/contrib/forms/locale/pl/LC_MESSAGES/django.po +2 -2
  339. wagtail/contrib/forms/locale/pt_BR/LC_MESSAGES/django.po +2 -1
  340. wagtail/contrib/forms/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  341. wagtail/contrib/forms/locale/ro/LC_MESSAGES/django.mo +0 -0
  342. wagtail/contrib/forms/locale/ro/LC_MESSAGES/django.po +2 -2
  343. wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.po +2 -1
  344. wagtail/contrib/forms/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  345. wagtail/contrib/forms/locale/sl/LC_MESSAGES/django.mo +0 -0
  346. wagtail/contrib/forms/locale/sl/LC_MESSAGES/django.po +2 -2
  347. wagtail/contrib/forms/locale/sv/LC_MESSAGES/django.po +1 -1
  348. wagtail/contrib/forms/locale/tet/LC_MESSAGES/django.po +1 -1
  349. wagtail/contrib/forms/locale/th/LC_MESSAGES/django.po +1 -1
  350. wagtail/contrib/forms/locale/tr/LC_MESSAGES/django.po +1 -1
  351. wagtail/contrib/forms/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  352. wagtail/contrib/forms/locale/ug/LC_MESSAGES/django.po +1 -1
  353. wagtail/contrib/forms/locale/uk/LC_MESSAGES/django.po +1 -1
  354. wagtail/contrib/forms/locale/vi/LC_MESSAGES/django.po +1 -1
  355. wagtail/contrib/forms/locale/zh/LC_MESSAGES/django.po +1 -1
  356. wagtail/contrib/forms/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  357. wagtail/contrib/forms/locale/zh_Hans/LC_MESSAGES/django.po +2 -2
  358. wagtail/contrib/forms/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  359. wagtail/contrib/forms/tests/test_forms.py +62 -0
  360. wagtail/contrib/frontend_cache/backends/cloudfront.py +1 -29
  361. wagtail/contrib/frontend_cache/tests.py +112 -52
  362. wagtail/contrib/frontend_cache/utils.py +109 -17
  363. wagtail/contrib/redirects/forms.py +3 -2
  364. wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.po +1 -1
  365. wagtail/contrib/redirects/locale/be/LC_MESSAGES/django.po +1 -1
  366. wagtail/contrib/redirects/locale/bg/LC_MESSAGES/django.po +1 -1
  367. wagtail/contrib/redirects/locale/bn/LC_MESSAGES/django.po +1 -1
  368. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.mo +0 -0
  369. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +2 -2
  370. wagtail/contrib/redirects/locale/cs/LC_MESSAGES/django.po +1 -1
  371. wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.po +2 -1
  372. wagtail/contrib/redirects/locale/da/LC_MESSAGES/django.po +1 -1
  373. wagtail/contrib/redirects/locale/de/LC_MESSAGES/django.po +2 -1
  374. wagtail/contrib/redirects/locale/dv/LC_MESSAGES/django.po +2 -1
  375. wagtail/contrib/redirects/locale/el/LC_MESSAGES/django.po +1 -1
  376. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +8 -8
  377. wagtail/contrib/redirects/locale/en_IN/LC_MESSAGES/django.po +1 -1
  378. wagtail/contrib/redirects/locale/es/LC_MESSAGES/django.po +1 -1
  379. wagtail/contrib/redirects/locale/es_419/LC_MESSAGES/django.po +1 -1
  380. wagtail/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po +1 -1
  381. wagtail/contrib/redirects/locale/et/LC_MESSAGES/django.po +1 -1
  382. wagtail/contrib/redirects/locale/eu/LC_MESSAGES/django.po +1 -1
  383. wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.mo +0 -0
  384. wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.po +3 -2
  385. wagtail/contrib/redirects/locale/fi/LC_MESSAGES/django.mo +0 -0
  386. wagtail/contrib/redirects/locale/fi/LC_MESSAGES/django.po +2 -2
  387. wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +3 -1
  388. wagtail/contrib/redirects/locale/gl/LC_MESSAGES/django.po +1 -1
  389. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +1 -1
  390. wagtail/contrib/redirects/locale/hi/LC_MESSAGES/django.po +1 -1
  391. wagtail/contrib/redirects/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  392. wagtail/contrib/redirects/locale/ht/LC_MESSAGES/django.po +1 -1
  393. wagtail/contrib/redirects/locale/hu/LC_MESSAGES/django.po +1 -1
  394. wagtail/contrib/redirects/locale/hy/LC_MESSAGES/django.po +1 -1
  395. wagtail/contrib/redirects/locale/id_ID/LC_MESSAGES/django.po +1 -1
  396. wagtail/contrib/redirects/locale/is_IS/LC_MESSAGES/django.po +1 -1
  397. wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.po +1 -1
  398. wagtail/contrib/redirects/locale/ja/LC_MESSAGES/django.po +1 -1
  399. wagtail/contrib/redirects/locale/ka/LC_MESSAGES/django.po +1 -1
  400. wagtail/contrib/redirects/locale/ko/LC_MESSAGES/django.mo +0 -0
  401. wagtail/contrib/redirects/locale/ko/LC_MESSAGES/django.po +18 -2
  402. wagtail/contrib/redirects/locale/lt/LC_MESSAGES/django.po +1 -1
  403. wagtail/contrib/redirects/locale/lv/LC_MESSAGES/django.po +1 -1
  404. wagtail/contrib/redirects/locale/mi/LC_MESSAGES/django.po +1 -1
  405. wagtail/contrib/redirects/locale/mn/LC_MESSAGES/django.po +1 -1
  406. wagtail/contrib/redirects/locale/my/LC_MESSAGES/django.po +1 -1
  407. wagtail/contrib/redirects/locale/nb/LC_MESSAGES/django.po +2 -1
  408. wagtail/contrib/redirects/locale/nl/LC_MESSAGES/django.mo +0 -0
  409. wagtail/contrib/redirects/locale/nl/LC_MESSAGES/django.po +2 -2
  410. wagtail/contrib/redirects/locale/pl/LC_MESSAGES/django.mo +0 -0
  411. wagtail/contrib/redirects/locale/pl/LC_MESSAGES/django.po +2 -2
  412. wagtail/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  413. wagtail/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po +3 -2
  414. wagtail/contrib/redirects/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  415. wagtail/contrib/redirects/locale/ro/LC_MESSAGES/django.mo +0 -0
  416. wagtail/contrib/redirects/locale/ro/LC_MESSAGES/django.po +3 -2
  417. wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.mo +0 -0
  418. wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.po +3 -2
  419. wagtail/contrib/redirects/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  420. wagtail/contrib/redirects/locale/sl/LC_MESSAGES/django.mo +0 -0
  421. wagtail/contrib/redirects/locale/sl/LC_MESSAGES/django.po +2 -2
  422. wagtail/contrib/redirects/locale/sr/LC_MESSAGES/django.po +1 -1
  423. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.mo +0 -0
  424. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.po +2 -2
  425. wagtail/contrib/redirects/locale/ta/LC_MESSAGES/django.po +1 -1
  426. wagtail/contrib/redirects/locale/tet/LC_MESSAGES/django.po +1 -1
  427. wagtail/contrib/redirects/locale/th/LC_MESSAGES/django.po +1 -1
  428. wagtail/contrib/redirects/locale/tr/LC_MESSAGES/django.po +1 -1
  429. wagtail/contrib/redirects/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  430. wagtail/contrib/redirects/locale/ug/LC_MESSAGES/django.po +1 -1
  431. wagtail/contrib/redirects/locale/uk/LC_MESSAGES/django.mo +0 -0
  432. wagtail/contrib/redirects/locale/uk/LC_MESSAGES/django.po +3 -2
  433. wagtail/contrib/redirects/locale/vi/LC_MESSAGES/django.po +1 -1
  434. wagtail/contrib/redirects/locale/zh/LC_MESSAGES/django.po +1 -1
  435. wagtail/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  436. wagtail/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po +2 -2
  437. wagtail/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  438. wagtail/contrib/redirects/tmp_storages.py +1 -0
  439. wagtail/contrib/routable_page/tests.py +3 -3
  440. wagtail/contrib/search_promotions/forms.py +3 -2
  441. wagtail/contrib/search_promotions/locale/af/LC_MESSAGES/django.po +1 -1
  442. wagtail/contrib/search_promotions/locale/ar/LC_MESSAGES/django.mo +0 -0
  443. wagtail/contrib/search_promotions/locale/ar/LC_MESSAGES/django.po +1 -4
  444. wagtail/contrib/search_promotions/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  445. wagtail/contrib/search_promotions/locale/be/LC_MESSAGES/django.mo +0 -0
  446. wagtail/contrib/search_promotions/locale/be/LC_MESSAGES/django.po +1 -4
  447. wagtail/contrib/search_promotions/locale/bg/LC_MESSAGES/django.mo +0 -0
  448. wagtail/contrib/search_promotions/locale/bg/LC_MESSAGES/django.po +1 -4
  449. wagtail/contrib/search_promotions/locale/bn/LC_MESSAGES/django.po +1 -1
  450. wagtail/contrib/search_promotions/locale/ca/LC_MESSAGES/django.mo +0 -0
  451. wagtail/contrib/search_promotions/locale/ca/LC_MESSAGES/django.po +3 -6
  452. wagtail/contrib/search_promotions/locale/cs/LC_MESSAGES/django.mo +0 -0
  453. wagtail/contrib/search_promotions/locale/cs/LC_MESSAGES/django.po +1 -4
  454. wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.mo +0 -0
  455. wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.po +1 -4
  456. wagtail/contrib/search_promotions/locale/da/LC_MESSAGES/django.po +1 -1
  457. wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.mo +0 -0
  458. wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.po +3 -6
  459. wagtail/contrib/search_promotions/locale/dv/LC_MESSAGES/django.po +2 -1
  460. wagtail/contrib/search_promotions/locale/el/LC_MESSAGES/django.mo +0 -0
  461. wagtail/contrib/search_promotions/locale/el/LC_MESSAGES/django.po +1 -4
  462. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +19 -23
  463. wagtail/contrib/search_promotions/locale/es/LC_MESSAGES/django.mo +0 -0
  464. wagtail/contrib/search_promotions/locale/es/LC_MESSAGES/django.po +1 -4
  465. wagtail/contrib/search_promotions/locale/es_419/LC_MESSAGES/django.po +1 -1
  466. wagtail/contrib/search_promotions/locale/et/LC_MESSAGES/django.mo +0 -0
  467. wagtail/contrib/search_promotions/locale/et/LC_MESSAGES/django.po +1 -4
  468. wagtail/contrib/search_promotions/locale/eu/LC_MESSAGES/django.po +1 -1
  469. wagtail/contrib/search_promotions/locale/fa/LC_MESSAGES/django.mo +0 -0
  470. wagtail/contrib/search_promotions/locale/fa/LC_MESSAGES/django.po +1 -4
  471. wagtail/contrib/search_promotions/locale/fi/LC_MESSAGES/django.mo +0 -0
  472. wagtail/contrib/search_promotions/locale/fi/LC_MESSAGES/django.po +1 -4
  473. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.mo +0 -0
  474. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +3 -6
  475. wagtail/contrib/search_promotions/locale/gl/LC_MESSAGES/django.mo +0 -0
  476. wagtail/contrib/search_promotions/locale/gl/LC_MESSAGES/django.po +3 -6
  477. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +1 -1
  478. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  479. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +1 -4
  480. wagtail/contrib/search_promotions/locale/ht/LC_MESSAGES/django.mo +0 -0
  481. wagtail/contrib/search_promotions/locale/ht/LC_MESSAGES/django.po +1 -4
  482. wagtail/contrib/search_promotions/locale/hu/LC_MESSAGES/django.mo +0 -0
  483. wagtail/contrib/search_promotions/locale/hu/LC_MESSAGES/django.po +11 -5
  484. wagtail/contrib/search_promotions/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  485. wagtail/contrib/search_promotions/locale/id_ID/LC_MESSAGES/django.po +1 -4
  486. wagtail/contrib/search_promotions/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  487. wagtail/contrib/search_promotions/locale/is_IS/LC_MESSAGES/django.po +1 -4
  488. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
  489. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +1 -4
  490. wagtail/contrib/search_promotions/locale/ja/LC_MESSAGES/django.mo +0 -0
  491. wagtail/contrib/search_promotions/locale/ja/LC_MESSAGES/django.po +1 -4
  492. wagtail/contrib/search_promotions/locale/ka/LC_MESSAGES/django.po +1 -1
  493. wagtail/contrib/search_promotions/locale/ko/LC_MESSAGES/django.mo +0 -0
  494. wagtail/contrib/search_promotions/locale/ko/LC_MESSAGES/django.po +5 -4
  495. wagtail/contrib/search_promotions/locale/lt/LC_MESSAGES/django.mo +0 -0
  496. wagtail/contrib/search_promotions/locale/lt/LC_MESSAGES/django.po +1 -4
  497. wagtail/contrib/search_promotions/locale/lv/LC_MESSAGES/django.mo +0 -0
  498. wagtail/contrib/search_promotions/locale/lv/LC_MESSAGES/django.po +1 -4
  499. wagtail/contrib/search_promotions/locale/mi/LC_MESSAGES/django.mo +0 -0
  500. wagtail/contrib/search_promotions/locale/mi/LC_MESSAGES/django.po +1 -4
  501. wagtail/contrib/search_promotions/locale/mn/LC_MESSAGES/django.mo +0 -0
  502. wagtail/contrib/search_promotions/locale/mn/LC_MESSAGES/django.po +1 -4
  503. wagtail/contrib/search_promotions/locale/my/LC_MESSAGES/django.mo +0 -0
  504. wagtail/contrib/search_promotions/locale/my/LC_MESSAGES/django.po +1 -4
  505. wagtail/contrib/search_promotions/locale/nb/LC_MESSAGES/django.mo +0 -0
  506. wagtail/contrib/search_promotions/locale/nb/LC_MESSAGES/django.po +1 -4
  507. wagtail/contrib/search_promotions/locale/nl/LC_MESSAGES/django.mo +0 -0
  508. wagtail/contrib/search_promotions/locale/nl/LC_MESSAGES/django.po +3 -6
  509. wagtail/contrib/search_promotions/locale/pl/LC_MESSAGES/django.mo +0 -0
  510. wagtail/contrib/search_promotions/locale/pl/LC_MESSAGES/django.po +1 -4
  511. wagtail/contrib/search_promotions/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  512. wagtail/contrib/search_promotions/locale/pt_BR/LC_MESSAGES/django.po +1 -4
  513. wagtail/contrib/search_promotions/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  514. wagtail/contrib/search_promotions/locale/pt_PT/LC_MESSAGES/django.po +1 -4
  515. wagtail/contrib/search_promotions/locale/ro/LC_MESSAGES/django.mo +0 -0
  516. wagtail/contrib/search_promotions/locale/ro/LC_MESSAGES/django.po +1 -4
  517. wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.mo +0 -0
  518. wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.po +3 -6
  519. wagtail/contrib/search_promotions/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  520. wagtail/contrib/search_promotions/locale/sk_SK/LC_MESSAGES/django.po +1 -4
  521. wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.mo +0 -0
  522. wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.po +1 -4
  523. wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.mo +0 -0
  524. wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.po +1 -4
  525. wagtail/contrib/search_promotions/locale/tet/LC_MESSAGES/django.mo +0 -0
  526. wagtail/contrib/search_promotions/locale/tet/LC_MESSAGES/django.po +1 -4
  527. wagtail/contrib/search_promotions/locale/th/LC_MESSAGES/django.mo +0 -0
  528. wagtail/contrib/search_promotions/locale/th/LC_MESSAGES/django.po +1 -4
  529. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.mo +0 -0
  530. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.po +1 -4
  531. wagtail/contrib/search_promotions/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  532. wagtail/contrib/search_promotions/locale/tr_TR/LC_MESSAGES/django.po +1 -4
  533. wagtail/contrib/search_promotions/locale/ug/LC_MESSAGES/django.mo +0 -0
  534. wagtail/contrib/search_promotions/locale/ug/LC_MESSAGES/django.po +1 -4
  535. wagtail/contrib/search_promotions/locale/uk/LC_MESSAGES/django.mo +0 -0
  536. wagtail/contrib/search_promotions/locale/uk/LC_MESSAGES/django.po +1 -4
  537. wagtail/contrib/search_promotions/locale/vi/LC_MESSAGES/django.mo +0 -0
  538. wagtail/contrib/search_promotions/locale/vi/LC_MESSAGES/django.po +1 -4
  539. wagtail/contrib/search_promotions/locale/zh/LC_MESSAGES/django.mo +0 -0
  540. wagtail/contrib/search_promotions/locale/zh/LC_MESSAGES/django.po +1 -4
  541. wagtail/contrib/search_promotions/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  542. wagtail/contrib/search_promotions/locale/zh_Hans/LC_MESSAGES/django.po +1 -4
  543. wagtail/contrib/search_promotions/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  544. wagtail/contrib/search_promotions/locale/zh_Hant/LC_MESSAGES/django.po +1 -4
  545. wagtail/contrib/search_promotions/models.py +1 -7
  546. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/queries/chooser/results.html +1 -1
  547. wagtail/contrib/search_promotions/tests.py +4 -5
  548. wagtail/contrib/search_promotions/views/settings.py +1 -2
  549. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +1 -1
  550. wagtail/contrib/settings/registry.py +1 -11
  551. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  552. wagtail/contrib/simple_translation/locale/hu/LC_MESSAGES/django.mo +0 -0
  553. wagtail/contrib/simple_translation/locale/hu/LC_MESSAGES/django.po +5 -2
  554. wagtail/contrib/styleguide/locale/af/LC_MESSAGES/django.po +1 -1
  555. wagtail/contrib/styleguide/locale/ar/LC_MESSAGES/django.po +1 -1
  556. wagtail/contrib/styleguide/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  557. wagtail/contrib/styleguide/locale/be/LC_MESSAGES/django.mo +0 -0
  558. wagtail/contrib/styleguide/locale/be/LC_MESSAGES/django.po +3 -2
  559. wagtail/contrib/styleguide/locale/bg/LC_MESSAGES/django.po +1 -1
  560. wagtail/contrib/styleguide/locale/bn/LC_MESSAGES/django.po +1 -1
  561. wagtail/contrib/styleguide/locale/ca/LC_MESSAGES/django.po +1 -1
  562. wagtail/contrib/styleguide/locale/cs/LC_MESSAGES/django.po +1 -1
  563. wagtail/contrib/styleguide/locale/cy/LC_MESSAGES/django.po +2 -1
  564. wagtail/contrib/styleguide/locale/da/LC_MESSAGES/django.po +1 -1
  565. wagtail/contrib/styleguide/locale/de/LC_MESSAGES/django.po +1 -1
  566. wagtail/contrib/styleguide/locale/dv/LC_MESSAGES/django.po +2 -1
  567. wagtail/contrib/styleguide/locale/el/LC_MESSAGES/django.po +2 -1
  568. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  569. wagtail/contrib/styleguide/locale/en_IN/LC_MESSAGES/django.po +1 -1
  570. wagtail/contrib/styleguide/locale/es/LC_MESSAGES/django.po +1 -1
  571. wagtail/contrib/styleguide/locale/es_419/LC_MESSAGES/django.po +1 -1
  572. wagtail/contrib/styleguide/locale/es_VE/LC_MESSAGES/django.po +1 -1
  573. wagtail/contrib/styleguide/locale/et/LC_MESSAGES/django.po +1 -1
  574. wagtail/contrib/styleguide/locale/fa/LC_MESSAGES/django.po +1 -1
  575. wagtail/contrib/styleguide/locale/fi/LC_MESSAGES/django.po +1 -1
  576. wagtail/contrib/styleguide/locale/fr/LC_MESSAGES/django.po +1 -1
  577. wagtail/contrib/styleguide/locale/gl/LC_MESSAGES/django.po +1 -1
  578. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +1 -1
  579. wagtail/contrib/styleguide/locale/hi/LC_MESSAGES/django.po +1 -1
  580. wagtail/contrib/styleguide/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  581. wagtail/contrib/styleguide/locale/ht/LC_MESSAGES/django.po +1 -1
  582. wagtail/contrib/styleguide/locale/hu/LC_MESSAGES/django.po +1 -1
  583. wagtail/contrib/styleguide/locale/id_ID/LC_MESSAGES/django.po +1 -1
  584. wagtail/contrib/styleguide/locale/is_IS/LC_MESSAGES/django.po +1 -1
  585. wagtail/contrib/styleguide/locale/it/LC_MESSAGES/django.po +1 -1
  586. wagtail/contrib/styleguide/locale/ja/LC_MESSAGES/django.po +1 -1
  587. wagtail/contrib/styleguide/locale/ka/LC_MESSAGES/django.po +1 -1
  588. wagtail/contrib/styleguide/locale/ko/LC_MESSAGES/django.po +1 -1
  589. wagtail/contrib/styleguide/locale/lt/LC_MESSAGES/django.po +1 -1
  590. wagtail/contrib/styleguide/locale/lv/LC_MESSAGES/django.po +1 -1
  591. wagtail/contrib/styleguide/locale/mi/LC_MESSAGES/django.po +1 -1
  592. wagtail/contrib/styleguide/locale/mn/LC_MESSAGES/django.po +1 -1
  593. wagtail/contrib/styleguide/locale/my/LC_MESSAGES/django.po +1 -1
  594. wagtail/contrib/styleguide/locale/nb/LC_MESSAGES/django.po +1 -1
  595. wagtail/contrib/styleguide/locale/nl/LC_MESSAGES/django.po +1 -1
  596. wagtail/contrib/styleguide/locale/pl/LC_MESSAGES/django.po +1 -1
  597. wagtail/contrib/styleguide/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  598. wagtail/contrib/styleguide/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  599. wagtail/contrib/styleguide/locale/ro/LC_MESSAGES/django.po +1 -1
  600. wagtail/contrib/styleguide/locale/ru/LC_MESSAGES/django.po +1 -1
  601. wagtail/contrib/styleguide/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  602. wagtail/contrib/styleguide/locale/sk_SK/LC_MESSAGES/django.po +2 -2
  603. wagtail/contrib/styleguide/locale/sl/LC_MESSAGES/django.po +1 -1
  604. wagtail/contrib/styleguide/locale/sv/LC_MESSAGES/django.po +1 -1
  605. wagtail/contrib/styleguide/locale/ta/LC_MESSAGES/django.po +1 -1
  606. wagtail/contrib/styleguide/locale/tet/LC_MESSAGES/django.po +1 -1
  607. wagtail/contrib/styleguide/locale/th/LC_MESSAGES/django.po +1 -1
  608. wagtail/contrib/styleguide/locale/tr/LC_MESSAGES/django.po +1 -1
  609. wagtail/contrib/styleguide/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  610. wagtail/contrib/styleguide/locale/ug/LC_MESSAGES/django.po +1 -1
  611. wagtail/contrib/styleguide/locale/uk/LC_MESSAGES/django.po +1 -1
  612. wagtail/contrib/styleguide/locale/vi/LC_MESSAGES/django.po +1 -1
  613. wagtail/contrib/styleguide/locale/zh/LC_MESSAGES/django.po +1 -1
  614. wagtail/contrib/styleguide/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  615. wagtail/contrib/styleguide/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  616. wagtail/contrib/styleguide/views.py +2 -1
  617. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  618. wagtail/contrib/typed_table_block/blocks.py +5 -0
  619. wagtail/contrib/typed_table_block/locale/ar/LC_MESSAGES/django.po +1 -1
  620. wagtail/contrib/typed_table_block/locale/be/LC_MESSAGES/django.po +1 -1
  621. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +1 -1
  622. wagtail/contrib/typed_table_block/locale/cy/LC_MESSAGES/django.po +1 -1
  623. wagtail/contrib/typed_table_block/locale/de/LC_MESSAGES/django.po +1 -1
  624. wagtail/contrib/typed_table_block/locale/dv/LC_MESSAGES/django.po +1 -1
  625. wagtail/contrib/typed_table_block/locale/el/LC_MESSAGES/django.po +1 -1
  626. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  627. wagtail/contrib/typed_table_block/locale/es/LC_MESSAGES/django.po +1 -1
  628. wagtail/contrib/typed_table_block/locale/fa/LC_MESSAGES/django.po +1 -1
  629. wagtail/contrib/typed_table_block/locale/fi/LC_MESSAGES/django.po +1 -1
  630. wagtail/contrib/typed_table_block/locale/fr/LC_MESSAGES/django.po +1 -1
  631. wagtail/contrib/typed_table_block/locale/gl/LC_MESSAGES/django.po +1 -1
  632. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +1 -1
  633. wagtail/contrib/typed_table_block/locale/is_IS/LC_MESSAGES/django.po +1 -1
  634. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +1 -1
  635. wagtail/contrib/typed_table_block/locale/ko/LC_MESSAGES/django.po +1 -1
  636. wagtail/contrib/typed_table_block/locale/lt/LC_MESSAGES/django.po +1 -1
  637. wagtail/contrib/typed_table_block/locale/nl/LC_MESSAGES/django.po +1 -1
  638. wagtail/contrib/typed_table_block/locale/pl/LC_MESSAGES/django.po +1 -1
  639. wagtail/contrib/typed_table_block/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  640. wagtail/contrib/typed_table_block/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  641. wagtail/contrib/typed_table_block/locale/ro/LC_MESSAGES/django.po +1 -1
  642. wagtail/contrib/typed_table_block/locale/ru/LC_MESSAGES/django.po +1 -1
  643. wagtail/contrib/typed_table_block/locale/sl/LC_MESSAGES/django.po +1 -1
  644. wagtail/contrib/typed_table_block/locale/sv/LC_MESSAGES/django.po +1 -1
  645. wagtail/contrib/typed_table_block/locale/th/LC_MESSAGES/django.po +1 -1
  646. wagtail/contrib/typed_table_block/locale/ug/LC_MESSAGES/django.po +1 -1
  647. wagtail/contrib/typed_table_block/locale/uk/LC_MESSAGES/django.po +1 -1
  648. wagtail/contrib/typed_table_block/locale/zh/LC_MESSAGES/django.po +1 -1
  649. wagtail/contrib/typed_table_block/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  650. wagtail/contrib/typed_table_block/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  651. wagtail/contrib/typed_table_block/tests.py +27 -0
  652. wagtail/coreutils.py +0 -19
  653. wagtail/documents/locale/af/LC_MESSAGES/django.po +1 -1
  654. wagtail/documents/locale/ar/LC_MESSAGES/django.mo +0 -0
  655. wagtail/documents/locale/ar/LC_MESSAGES/django.po +3 -2
  656. wagtail/documents/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  657. wagtail/documents/locale/be/LC_MESSAGES/django.po +1 -1
  658. wagtail/documents/locale/bg/LC_MESSAGES/django.po +1 -1
  659. wagtail/documents/locale/bn/LC_MESSAGES/django.po +1 -1
  660. wagtail/documents/locale/ca/LC_MESSAGES/django.mo +0 -0
  661. wagtail/documents/locale/ca/LC_MESSAGES/django.po +2 -2
  662. wagtail/documents/locale/cs/LC_MESSAGES/django.po +1 -1
  663. wagtail/documents/locale/cy/LC_MESSAGES/django.po +1 -1
  664. wagtail/documents/locale/da/LC_MESSAGES/django.po +1 -1
  665. wagtail/documents/locale/de/LC_MESSAGES/django.mo +0 -0
  666. wagtail/documents/locale/de/LC_MESSAGES/django.po +3 -3
  667. wagtail/documents/locale/dv/LC_MESSAGES/django.po +2 -1
  668. wagtail/documents/locale/el/LC_MESSAGES/django.po +2 -1
  669. wagtail/documents/locale/en/LC_MESSAGES/django.po +4 -4
  670. wagtail/documents/locale/es/LC_MESSAGES/django.mo +0 -0
  671. wagtail/documents/locale/es/LC_MESSAGES/django.po +3 -2
  672. wagtail/documents/locale/es_419/LC_MESSAGES/django.po +1 -1
  673. wagtail/documents/locale/et/LC_MESSAGES/django.po +1 -1
  674. wagtail/documents/locale/eu/LC_MESSAGES/django.po +1 -1
  675. wagtail/documents/locale/fa/LC_MESSAGES/django.po +1 -1
  676. wagtail/documents/locale/fi/LC_MESSAGES/django.mo +0 -0
  677. wagtail/documents/locale/fi/LC_MESSAGES/django.po +2 -2
  678. wagtail/documents/locale/fr/LC_MESSAGES/django.po +2 -1
  679. wagtail/documents/locale/gl/LC_MESSAGES/django.po +1 -1
  680. wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +1 -1
  681. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  682. wagtail/documents/locale/ht/LC_MESSAGES/django.po +1 -1
  683. wagtail/documents/locale/hu/LC_MESSAGES/django.mo +0 -0
  684. wagtail/documents/locale/hu/LC_MESSAGES/django.po +18 -3
  685. wagtail/documents/locale/id_ID/LC_MESSAGES/django.po +1 -1
  686. wagtail/documents/locale/is_IS/LC_MESSAGES/django.po +1 -1
  687. wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
  688. wagtail/documents/locale/it/LC_MESSAGES/django.po +2 -2
  689. wagtail/documents/locale/ja/LC_MESSAGES/django.po +1 -1
  690. wagtail/documents/locale/ka/LC_MESSAGES/django.po +1 -1
  691. wagtail/documents/locale/ko/LC_MESSAGES/django.mo +0 -0
  692. wagtail/documents/locale/ko/LC_MESSAGES/django.po +14 -2
  693. wagtail/documents/locale/lt/LC_MESSAGES/django.po +1 -1
  694. wagtail/documents/locale/lv/LC_MESSAGES/django.po +1 -1
  695. wagtail/documents/locale/mi/LC_MESSAGES/django.po +1 -1
  696. wagtail/documents/locale/mn/LC_MESSAGES/django.po +1 -1
  697. wagtail/documents/locale/my/LC_MESSAGES/django.po +1 -1
  698. wagtail/documents/locale/nb/LC_MESSAGES/django.mo +0 -0
  699. wagtail/documents/locale/nb/LC_MESSAGES/django.po +3 -2
  700. wagtail/documents/locale/nl/LC_MESSAGES/django.mo +0 -0
  701. wagtail/documents/locale/nl/LC_MESSAGES/django.po +2 -2
  702. wagtail/documents/locale/pl/LC_MESSAGES/django.mo +0 -0
  703. wagtail/documents/locale/pl/LC_MESSAGES/django.po +2 -2
  704. wagtail/documents/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  705. wagtail/documents/locale/pt_BR/LC_MESSAGES/django.po +2 -2
  706. wagtail/documents/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  707. wagtail/documents/locale/ro/LC_MESSAGES/django.mo +0 -0
  708. wagtail/documents/locale/ro/LC_MESSAGES/django.po +2 -2
  709. wagtail/documents/locale/ru/LC_MESSAGES/django.mo +0 -0
  710. wagtail/documents/locale/ru/LC_MESSAGES/django.po +5 -2
  711. wagtail/documents/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  712. wagtail/documents/locale/sk_SK/LC_MESSAGES/django.po +2 -2
  713. wagtail/documents/locale/sl/LC_MESSAGES/django.mo +0 -0
  714. wagtail/documents/locale/sl/LC_MESSAGES/django.po +2 -2
  715. wagtail/documents/locale/sv/LC_MESSAGES/django.po +1 -1
  716. wagtail/documents/locale/tet/LC_MESSAGES/django.po +1 -1
  717. wagtail/documents/locale/th/LC_MESSAGES/django.po +1 -1
  718. wagtail/documents/locale/tr/LC_MESSAGES/django.po +1 -1
  719. wagtail/documents/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  720. wagtail/documents/locale/ug/LC_MESSAGES/django.po +1 -1
  721. wagtail/documents/locale/uk/LC_MESSAGES/django.po +1 -1
  722. wagtail/documents/locale/vi/LC_MESSAGES/django.po +1 -1
  723. wagtail/documents/locale/zh/LC_MESSAGES/django.po +1 -1
  724. wagtail/documents/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  725. wagtail/documents/locale/zh_Hans/LC_MESSAGES/django.po +3 -2
  726. wagtail/documents/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  727. wagtail/documents/rich_text/contentstate.py +1 -0
  728. wagtail/documents/rich_text/editor_html.py +1 -0
  729. wagtail/documents/tests/test_collection_privacy.py +1 -1
  730. wagtail/documents/tests/test_serializers.py +0 -1
  731. wagtail/documents/views/serve.py +0 -15
  732. wagtail/documents/wagtail_hooks.py +2 -17
  733. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  734. wagtail/embeds/rich_text/contentstate.py +1 -0
  735. wagtail/embeds/rich_text/editor_html.py +1 -0
  736. wagtail/embeds/wagtail_hooks.py +1 -1
  737. wagtail/images/formats.py +0 -11
  738. wagtail/images/locale/ar/LC_MESSAGES/django.po +1 -1
  739. wagtail/images/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  740. wagtail/images/locale/be/LC_MESSAGES/django.po +1 -1
  741. wagtail/images/locale/bg/LC_MESSAGES/django.po +1 -1
  742. wagtail/images/locale/bn/LC_MESSAGES/django.po +1 -1
  743. wagtail/images/locale/ca/LC_MESSAGES/django.mo +0 -0
  744. wagtail/images/locale/ca/LC_MESSAGES/django.po +2 -2
  745. wagtail/images/locale/cs/LC_MESSAGES/django.mo +0 -0
  746. wagtail/images/locale/cs/LC_MESSAGES/django.po +3 -2
  747. wagtail/images/locale/cy/LC_MESSAGES/django.po +2 -1
  748. wagtail/images/locale/da/LC_MESSAGES/django.po +1 -1
  749. wagtail/images/locale/de/LC_MESSAGES/django.mo +0 -0
  750. wagtail/images/locale/de/LC_MESSAGES/django.po +3 -2
  751. wagtail/images/locale/dv/LC_MESSAGES/django.po +2 -1
  752. wagtail/images/locale/el/LC_MESSAGES/django.po +1 -1
  753. wagtail/images/locale/en/LC_MESSAGES/django.po +4 -4
  754. wagtail/images/locale/es/LC_MESSAGES/django.po +1 -1
  755. wagtail/images/locale/es_419/LC_MESSAGES/django.po +1 -1
  756. wagtail/images/locale/et/LC_MESSAGES/django.po +1 -1
  757. wagtail/images/locale/eu/LC_MESSAGES/django.po +1 -1
  758. wagtail/images/locale/fa/LC_MESSAGES/django.mo +0 -0
  759. wagtail/images/locale/fa/LC_MESSAGES/django.po +3 -2
  760. wagtail/images/locale/fi/LC_MESSAGES/django.mo +0 -0
  761. wagtail/images/locale/fi/LC_MESSAGES/django.po +2 -2
  762. wagtail/images/locale/fr/LC_MESSAGES/django.mo +0 -0
  763. wagtail/images/locale/fr/LC_MESSAGES/django.po +3 -2
  764. wagtail/images/locale/gl/LC_MESSAGES/django.mo +0 -0
  765. wagtail/images/locale/gl/LC_MESSAGES/django.po +2 -2
  766. wagtail/images/locale/he_IL/LC_MESSAGES/django.po +1 -1
  767. wagtail/images/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  768. wagtail/images/locale/ht/LC_MESSAGES/django.po +1 -1
  769. wagtail/images/locale/hu/LC_MESSAGES/django.mo +0 -0
  770. wagtail/images/locale/hu/LC_MESSAGES/django.po +23 -3
  771. wagtail/images/locale/id_ID/LC_MESSAGES/django.po +1 -1
  772. wagtail/images/locale/is_IS/LC_MESSAGES/django.po +1 -1
  773. wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
  774. wagtail/images/locale/it/LC_MESSAGES/django.po +2 -2
  775. wagtail/images/locale/ja/LC_MESSAGES/django.po +1 -1
  776. wagtail/images/locale/ka/LC_MESSAGES/django.po +1 -1
  777. wagtail/images/locale/ko/LC_MESSAGES/django.mo +0 -0
  778. wagtail/images/locale/ko/LC_MESSAGES/django.po +31 -2
  779. wagtail/images/locale/lt/LC_MESSAGES/django.po +1 -1
  780. wagtail/images/locale/lv/LC_MESSAGES/django.po +1 -1
  781. wagtail/images/locale/mi/LC_MESSAGES/django.po +1 -1
  782. wagtail/images/locale/mn/LC_MESSAGES/django.mo +0 -0
  783. wagtail/images/locale/mn/LC_MESSAGES/django.po +3 -2
  784. wagtail/images/locale/my/LC_MESSAGES/django.po +1 -1
  785. wagtail/images/locale/nb/LC_MESSAGES/django.mo +0 -0
  786. wagtail/images/locale/nb/LC_MESSAGES/django.po +3 -2
  787. wagtail/images/locale/nl/LC_MESSAGES/django.mo +0 -0
  788. wagtail/images/locale/nl/LC_MESSAGES/django.po +4 -5
  789. wagtail/images/locale/pl/LC_MESSAGES/django.mo +0 -0
  790. wagtail/images/locale/pl/LC_MESSAGES/django.po +2 -2
  791. wagtail/images/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  792. wagtail/images/locale/pt_BR/LC_MESSAGES/django.po +2 -2
  793. wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  794. wagtail/images/locale/ro/LC_MESSAGES/django.mo +0 -0
  795. wagtail/images/locale/ro/LC_MESSAGES/django.po +3 -2
  796. wagtail/images/locale/ru/LC_MESSAGES/django.mo +0 -0
  797. wagtail/images/locale/ru/LC_MESSAGES/django.po +5 -2
  798. wagtail/images/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  799. wagtail/images/locale/sk_SK/LC_MESSAGES/django.po +2 -2
  800. wagtail/images/locale/sl/LC_MESSAGES/django.mo +0 -0
  801. wagtail/images/locale/sl/LC_MESSAGES/django.po +2 -2
  802. wagtail/images/locale/sv/LC_MESSAGES/django.mo +0 -0
  803. wagtail/images/locale/sv/LC_MESSAGES/django.po +2 -2
  804. wagtail/images/locale/tet/LC_MESSAGES/django.po +1 -1
  805. wagtail/images/locale/th/LC_MESSAGES/django.po +1 -1
  806. wagtail/images/locale/tr/LC_MESSAGES/django.po +1 -1
  807. wagtail/images/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  808. wagtail/images/locale/ug/LC_MESSAGES/django.po +1 -1
  809. wagtail/images/locale/uk/LC_MESSAGES/django.mo +0 -0
  810. wagtail/images/locale/uk/LC_MESSAGES/django.po +5 -4
  811. wagtail/images/locale/vi/LC_MESSAGES/django.po +1 -1
  812. wagtail/images/locale/zh/LC_MESSAGES/django.po +1 -1
  813. wagtail/images/locale/zh_Hans/LC_MESSAGES/django.po +2 -1
  814. wagtail/images/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  815. wagtail/images/management/commands/wagtail_update_image_renditions.py +1 -1
  816. wagtail/images/models.py +23 -7
  817. wagtail/images/tests/test_admin_views.py +1 -1
  818. wagtail/images/tests/test_models.py +33 -0
  819. wagtail/images/tests/tests.py +0 -6
  820. wagtail/images/wagtail_hooks.py +2 -2
  821. wagtail/locale/af/LC_MESSAGES/django.po +1 -1
  822. wagtail/locale/ar/LC_MESSAGES/django.po +50 -50
  823. wagtail/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  824. wagtail/locale/be/LC_MESSAGES/django.mo +0 -0
  825. wagtail/locale/be/LC_MESSAGES/django.po +52 -51
  826. wagtail/locale/bg/LC_MESSAGES/django.po +4 -4
  827. wagtail/locale/bn/LC_MESSAGES/django.po +1 -1
  828. wagtail/locale/ca/LC_MESSAGES/django.mo +0 -0
  829. wagtail/locale/ca/LC_MESSAGES/django.po +234 -234
  830. wagtail/locale/cs/LC_MESSAGES/django.mo +0 -0
  831. wagtail/locale/cs/LC_MESSAGES/django.po +172 -172
  832. wagtail/locale/cy/LC_MESSAGES/django.po +12 -12
  833. wagtail/locale/da/LC_MESSAGES/django.po +7 -7
  834. wagtail/locale/de/LC_MESSAGES/django.mo +0 -0
  835. wagtail/locale/de/LC_MESSAGES/django.po +237 -236
  836. wagtail/locale/dv/LC_MESSAGES/django.po +216 -215
  837. wagtail/locale/el/LC_MESSAGES/django.po +76 -75
  838. wagtail/locale/en/LC_MESSAGES/django.po +339 -339
  839. wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
  840. wagtail/locale/es/LC_MESSAGES/django.po +192 -192
  841. wagtail/locale/es_419/LC_MESSAGES/django.po +1 -1
  842. wagtail/locale/et/LC_MESSAGES/django.mo +0 -0
  843. wagtail/locale/et/LC_MESSAGES/django.po +173 -173
  844. wagtail/locale/eu/LC_MESSAGES/django.po +1 -1
  845. wagtail/locale/fa/LC_MESSAGES/django.po +50 -50
  846. wagtail/locale/fi/LC_MESSAGES/django.mo +0 -0
  847. wagtail/locale/fi/LC_MESSAGES/django.po +187 -187
  848. wagtail/locale/fr/LC_MESSAGES/django.mo +0 -0
  849. wagtail/locale/fr/LC_MESSAGES/django.po +236 -235
  850. wagtail/locale/gl/LC_MESSAGES/django.mo +0 -0
  851. wagtail/locale/gl/LC_MESSAGES/django.po +235 -235
  852. wagtail/locale/he_IL/LC_MESSAGES/django.po +9 -9
  853. wagtail/locale/hr_HR/LC_MESSAGES/django.po +184 -184
  854. wagtail/locale/hu/LC_MESSAGES/django.mo +0 -0
  855. wagtail/locale/hu/LC_MESSAGES/django.po +251 -229
  856. wagtail/locale/id_ID/LC_MESSAGES/django.po +49 -49
  857. wagtail/locale/is_IS/LC_MESSAGES/django.po +232 -232
  858. wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
  859. wagtail/locale/it/LC_MESSAGES/django.po +224 -224
  860. wagtail/locale/ja/LC_MESSAGES/django.po +110 -110
  861. wagtail/locale/ka/LC_MESSAGES/django.po +4 -4
  862. wagtail/locale/ko/LC_MESSAGES/django.mo +0 -0
  863. wagtail/locale/ko/LC_MESSAGES/django.po +88 -53
  864. wagtail/locale/lt/LC_MESSAGES/django.po +53 -53
  865. wagtail/locale/lv/LC_MESSAGES/django.po +22 -22
  866. wagtail/locale/mi/LC_MESSAGES/django.po +167 -167
  867. wagtail/locale/mn/LC_MESSAGES/django.mo +0 -0
  868. wagtail/locale/mn/LC_MESSAGES/django.po +51 -50
  869. wagtail/locale/my/LC_MESSAGES/django.po +6 -6
  870. wagtail/locale/nb/LC_MESSAGES/django.po +50 -50
  871. wagtail/locale/nl/LC_MESSAGES/django.mo +0 -0
  872. wagtail/locale/nl/LC_MESSAGES/django.po +233 -233
  873. wagtail/locale/pl/LC_MESSAGES/django.mo +0 -0
  874. wagtail/locale/pl/LC_MESSAGES/django.po +232 -232
  875. wagtail/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  876. wagtail/locale/pt_BR/LC_MESSAGES/django.po +202 -202
  877. wagtail/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  878. wagtail/locale/pt_PT/LC_MESSAGES/django.po +180 -178
  879. wagtail/locale/ro/LC_MESSAGES/django.mo +0 -0
  880. wagtail/locale/ro/LC_MESSAGES/django.po +233 -232
  881. wagtail/locale/ru/LC_MESSAGES/django.mo +0 -0
  882. wagtail/locale/ru/LC_MESSAGES/django.po +237 -234
  883. wagtail/locale/sk_SK/LC_MESSAGES/django.po +47 -47
  884. wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
  885. wagtail/locale/sl/LC_MESSAGES/django.po +233 -233
  886. wagtail/locale/sv/LC_MESSAGES/django.mo +0 -0
  887. wagtail/locale/sv/LC_MESSAGES/django.po +207 -207
  888. wagtail/locale/tet/LC_MESSAGES/django.po +37 -37
  889. wagtail/locale/th/LC_MESSAGES/django.mo +0 -0
  890. wagtail/locale/th/LC_MESSAGES/django.po +54 -53
  891. wagtail/locale/tr/LC_MESSAGES/django.po +50 -50
  892. wagtail/locale/tr_TR/LC_MESSAGES/django.po +50 -50
  893. wagtail/locale/ug/LC_MESSAGES/django.po +232 -232
  894. wagtail/locale/uk/LC_MESSAGES/django.mo +0 -0
  895. wagtail/locale/uk/LC_MESSAGES/django.po +185 -185
  896. wagtail/locale/vi/LC_MESSAGES/django.mo +0 -0
  897. wagtail/locale/vi/LC_MESSAGES/django.po +20 -19
  898. wagtail/locale/zh/LC_MESSAGES/django.po +4 -4
  899. wagtail/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  900. wagtail/locale/zh_Hans/LC_MESSAGES/django.po +189 -189
  901. wagtail/locale/zh_Hant/LC_MESSAGES/django.po +161 -161
  902. wagtail/locales/locale/ar/LC_MESSAGES/django.po +1 -1
  903. wagtail/locales/locale/be/LC_MESSAGES/django.po +1 -1
  904. wagtail/locales/locale/bg/LC_MESSAGES/django.po +1 -1
  905. wagtail/locales/locale/ca/LC_MESSAGES/django.po +1 -1
  906. wagtail/locales/locale/cs/LC_MESSAGES/django.po +1 -1
  907. wagtail/locales/locale/cy/LC_MESSAGES/django.po +1 -1
  908. wagtail/locales/locale/da/LC_MESSAGES/django.po +1 -1
  909. wagtail/locales/locale/de/LC_MESSAGES/django.po +1 -1
  910. wagtail/locales/locale/dv/LC_MESSAGES/django.po +1 -1
  911. wagtail/locales/locale/el/LC_MESSAGES/django.po +1 -1
  912. wagtail/locales/locale/en/LC_MESSAGES/django.po +26 -14
  913. wagtail/locales/locale/es/LC_MESSAGES/django.po +1 -1
  914. wagtail/locales/locale/et/LC_MESSAGES/django.po +1 -1
  915. wagtail/locales/locale/fa/LC_MESSAGES/django.po +1 -1
  916. wagtail/locales/locale/fi/LC_MESSAGES/django.po +1 -1
  917. wagtail/locales/locale/fr/LC_MESSAGES/django.mo +0 -0
  918. wagtail/locales/locale/fr/LC_MESSAGES/django.po +14 -2
  919. wagtail/locales/locale/gl/LC_MESSAGES/django.mo +0 -0
  920. wagtail/locales/locale/gl/LC_MESSAGES/django.po +13 -3
  921. wagtail/locales/locale/he_IL/LC_MESSAGES/django.po +1 -1
  922. wagtail/locales/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  923. wagtail/locales/locale/hu/LC_MESSAGES/django.po +1 -1
  924. wagtail/locales/locale/id_ID/LC_MESSAGES/django.po +1 -1
  925. wagtail/locales/locale/is_IS/LC_MESSAGES/django.po +1 -1
  926. wagtail/locales/locale/it/LC_MESSAGES/django.po +1 -1
  927. wagtail/locales/locale/ja/LC_MESSAGES/django.po +1 -1
  928. wagtail/locales/locale/ko/LC_MESSAGES/django.po +1 -1
  929. wagtail/locales/locale/lt/LC_MESSAGES/django.po +1 -1
  930. wagtail/locales/locale/lv/LC_MESSAGES/django.po +1 -1
  931. wagtail/locales/locale/mi/LC_MESSAGES/django.po +1 -1
  932. wagtail/locales/locale/mn/LC_MESSAGES/django.po +1 -1
  933. wagtail/locales/locale/my/LC_MESSAGES/django.po +1 -1
  934. wagtail/locales/locale/nb/LC_MESSAGES/django.po +1 -1
  935. wagtail/locales/locale/nl/LC_MESSAGES/django.po +1 -1
  936. wagtail/locales/locale/pl/LC_MESSAGES/django.po +1 -1
  937. wagtail/locales/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  938. wagtail/locales/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  939. wagtail/locales/locale/ro/LC_MESSAGES/django.po +1 -1
  940. wagtail/locales/locale/ru/LC_MESSAGES/django.po +1 -1
  941. wagtail/locales/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  942. wagtail/locales/locale/sl/LC_MESSAGES/django.po +1 -1
  943. wagtail/locales/locale/sv/LC_MESSAGES/django.po +1 -1
  944. wagtail/locales/locale/tet/LC_MESSAGES/django.po +1 -1
  945. wagtail/locales/locale/th/LC_MESSAGES/django.po +1 -1
  946. wagtail/locales/locale/tr/LC_MESSAGES/django.po +1 -1
  947. wagtail/locales/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  948. wagtail/locales/locale/ug/LC_MESSAGES/django.po +1 -1
  949. wagtail/locales/locale/uk/LC_MESSAGES/django.po +1 -1
  950. wagtail/locales/locale/vi/LC_MESSAGES/django.po +1 -1
  951. wagtail/locales/locale/zh/LC_MESSAGES/django.po +1 -1
  952. wagtail/locales/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  953. wagtail/locales/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  954. wagtail/locales/tests.py +32 -1
  955. wagtail/locales/views.py +39 -7
  956. wagtail/models/__init__.py +67 -5002
  957. wagtail/models/audit_log.py +1 -1
  958. wagtail/models/content_types.py +11 -0
  959. wagtail/models/draft_state.py +197 -0
  960. wagtail/models/locking.py +82 -0
  961. wagtail/models/orderable.py +10 -0
  962. wagtail/models/pages.py +2754 -0
  963. wagtail/models/preview.py +281 -0
  964. wagtail/models/reference_index.py +1 -1
  965. wagtail/models/revisions.py +433 -0
  966. wagtail/models/view_restrictions.py +3 -3
  967. wagtail/models/workflows.py +1348 -0
  968. wagtail/project_template/home/apps.py +6 -0
  969. wagtail/project_template/manage.py-tpl +22 -0
  970. wagtail/project_template/project_name/settings/base.py +1 -0
  971. wagtail/project_template/requirements.txt +2 -2
  972. wagtail/search/backends/base.py +4 -0
  973. wagtail/search/backends/database/mysql/query.py +8 -4
  974. wagtail/search/backends/elasticsearch7.py +17 -7
  975. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  976. wagtail/search/tests/elasticsearch_common_tests.py +43 -0
  977. wagtail/search/tests/test_backends.py +43 -13
  978. wagtail/search/tests/test_mysql_backend.py +22 -0
  979. wagtail/search/tests/test_page_search.py +2 -1
  980. wagtail/search/tests/test_queries.py +2 -2
  981. wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
  982. wagtail/snippets/action_menu.py +9 -30
  983. wagtail/snippets/locale/af/LC_MESSAGES/django.po +1 -1
  984. wagtail/snippets/locale/ar/LC_MESSAGES/django.po +4 -4
  985. wagtail/snippets/locale/az_AZ/LC_MESSAGES/django.po +4 -4
  986. wagtail/snippets/locale/be/LC_MESSAGES/django.mo +0 -0
  987. wagtail/snippets/locale/be/LC_MESSAGES/django.po +6 -5
  988. wagtail/snippets/locale/bg/LC_MESSAGES/django.po +4 -4
  989. wagtail/snippets/locale/bn/LC_MESSAGES/django.po +4 -4
  990. wagtail/snippets/locale/ca/LC_MESSAGES/django.mo +0 -0
  991. wagtail/snippets/locale/ca/LC_MESSAGES/django.po +5 -5
  992. wagtail/snippets/locale/cs/LC_MESSAGES/django.po +5 -4
  993. wagtail/snippets/locale/cy/LC_MESSAGES/django.po +5 -4
  994. wagtail/snippets/locale/da/LC_MESSAGES/django.po +4 -4
  995. wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
  996. wagtail/snippets/locale/de/LC_MESSAGES/django.po +6 -5
  997. wagtail/snippets/locale/dv/LC_MESSAGES/django.po +5 -4
  998. wagtail/snippets/locale/el/LC_MESSAGES/django.po +5 -4
  999. wagtail/snippets/locale/en/LC_MESSAGES/django.po +31 -23
  1000. wagtail/snippets/locale/en_IN/LC_MESSAGES/django.po +1 -1
  1001. wagtail/snippets/locale/es/LC_MESSAGES/django.mo +0 -0
  1002. wagtail/snippets/locale/es/LC_MESSAGES/django.po +6 -5
  1003. wagtail/snippets/locale/es_419/LC_MESSAGES/django.po +4 -4
  1004. wagtail/snippets/locale/es_VE/LC_MESSAGES/django.po +1 -1
  1005. wagtail/snippets/locale/et/LC_MESSAGES/django.po +4 -4
  1006. wagtail/snippets/locale/eu/LC_MESSAGES/django.po +1 -1
  1007. wagtail/snippets/locale/fa/LC_MESSAGES/django.mo +0 -0
  1008. wagtail/snippets/locale/fa/LC_MESSAGES/django.po +6 -5
  1009. wagtail/snippets/locale/fi/LC_MESSAGES/django.mo +0 -0
  1010. wagtail/snippets/locale/fi/LC_MESSAGES/django.po +6 -5
  1011. wagtail/snippets/locale/fr/LC_MESSAGES/django.mo +0 -0
  1012. wagtail/snippets/locale/fr/LC_MESSAGES/django.po +13 -6
  1013. wagtail/snippets/locale/gl/LC_MESSAGES/django.mo +0 -0
  1014. wagtail/snippets/locale/gl/LC_MESSAGES/django.po +11 -5
  1015. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +4 -4
  1016. wagtail/snippets/locale/hi/LC_MESSAGES/django.po +1 -1
  1017. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +4 -4
  1018. wagtail/snippets/locale/ht/LC_MESSAGES/django.po +1 -1
  1019. wagtail/snippets/locale/hu/LC_MESSAGES/django.po +4 -4
  1020. wagtail/snippets/locale/id_ID/LC_MESSAGES/django.po +4 -4
  1021. wagtail/snippets/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  1022. wagtail/snippets/locale/is_IS/LC_MESSAGES/django.po +5 -6
  1023. wagtail/snippets/locale/it/LC_MESSAGES/django.mo +0 -0
  1024. wagtail/snippets/locale/it/LC_MESSAGES/django.po +5 -5
  1025. wagtail/snippets/locale/ja/LC_MESSAGES/django.mo +0 -0
  1026. wagtail/snippets/locale/ja/LC_MESSAGES/django.po +6 -5
  1027. wagtail/snippets/locale/ka/LC_MESSAGES/django.po +4 -4
  1028. wagtail/snippets/locale/ko/LC_MESSAGES/django.po +4 -4
  1029. wagtail/snippets/locale/lt/LC_MESSAGES/django.po +4 -4
  1030. wagtail/snippets/locale/lv/LC_MESSAGES/django.po +4 -4
  1031. wagtail/snippets/locale/mi/LC_MESSAGES/django.po +4 -4
  1032. wagtail/snippets/locale/mn/LC_MESSAGES/django.po +4 -4
  1033. wagtail/snippets/locale/my/LC_MESSAGES/django.po +4 -4
  1034. wagtail/snippets/locale/nb/LC_MESSAGES/django.po +5 -4
  1035. wagtail/snippets/locale/nl/LC_MESSAGES/django.mo +0 -0
  1036. wagtail/snippets/locale/nl/LC_MESSAGES/django.po +5 -5
  1037. wagtail/snippets/locale/pl/LC_MESSAGES/django.mo +0 -0
  1038. wagtail/snippets/locale/pl/LC_MESSAGES/django.po +5 -5
  1039. wagtail/snippets/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  1040. wagtail/snippets/locale/pt_BR/LC_MESSAGES/django.po +7 -5
  1041. wagtail/snippets/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  1042. wagtail/snippets/locale/pt_PT/LC_MESSAGES/django.po +7 -5
  1043. wagtail/snippets/locale/ro/LC_MESSAGES/django.mo +0 -0
  1044. wagtail/snippets/locale/ro/LC_MESSAGES/django.po +6 -5
  1045. wagtail/snippets/locale/ru/LC_MESSAGES/django.mo +0 -0
  1046. wagtail/snippets/locale/ru/LC_MESSAGES/django.po +6 -5
  1047. wagtail/snippets/locale/sk_SK/LC_MESSAGES/django.po +4 -4
  1048. wagtail/snippets/locale/sl/LC_MESSAGES/django.mo +0 -0
  1049. wagtail/snippets/locale/sl/LC_MESSAGES/django.po +5 -5
  1050. wagtail/snippets/locale/sr/LC_MESSAGES/django.po +1 -1
  1051. wagtail/snippets/locale/sv/LC_MESSAGES/django.mo +0 -0
  1052. wagtail/snippets/locale/sv/LC_MESSAGES/django.po +5 -5
  1053. wagtail/snippets/locale/ta/LC_MESSAGES/django.po +1 -1
  1054. wagtail/snippets/locale/tet/LC_MESSAGES/django.po +4 -4
  1055. wagtail/snippets/locale/th/LC_MESSAGES/django.mo +0 -0
  1056. wagtail/snippets/locale/th/LC_MESSAGES/django.po +6 -5
  1057. wagtail/snippets/locale/tr/LC_MESSAGES/django.po +4 -4
  1058. wagtail/snippets/locale/tr_TR/LC_MESSAGES/django.po +4 -4
  1059. wagtail/snippets/locale/ug/LC_MESSAGES/django.po +4 -4
  1060. wagtail/snippets/locale/uk/LC_MESSAGES/django.mo +0 -0
  1061. wagtail/snippets/locale/uk/LC_MESSAGES/django.po +6 -6
  1062. wagtail/snippets/locale/vi/LC_MESSAGES/django.po +4 -4
  1063. wagtail/snippets/locale/zh/LC_MESSAGES/django.po +4 -4
  1064. wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  1065. wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.po +6 -5
  1066. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +4 -4
  1067. wagtail/snippets/permissions.py +6 -4
  1068. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  1069. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  1070. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/publish.html +3 -5
  1071. wagtail/snippets/tests/test_preview.py +62 -38
  1072. wagtail/snippets/tests/test_snippets.py +313 -130
  1073. wagtail/snippets/tests/test_viewset.py +69 -6
  1074. wagtail/snippets/tests/test_workflows.py +0 -4
  1075. wagtail/snippets/views/snippets.py +29 -53
  1076. wagtail/snippets/wagtail_hooks.py +3 -7
  1077. wagtail/test/apps.py +5 -0
  1078. wagtail/test/context_processors.py +19 -0
  1079. wagtail/test/customuser/forms.py +19 -0
  1080. wagtail/test/customuser/viewsets.py +12 -0
  1081. wagtail/test/settings.py +8 -9
  1082. wagtail/test/testapp/migrations/0046_alter_custom_rendition_to_unique_constraint.py +24 -0
  1083. wagtail/test/testapp/migrations/{0046_advertwithcustomuuidprimarykey_page.py → 0047_advertwithcustomuuidprimarykey_page.py} +1 -1
  1084. wagtail/test/testapp/migrations/0048_requireddatepage.py +36 -0
  1085. wagtail/test/testapp/migrations/0049_promotionalpage.py +35 -0
  1086. wagtail/test/testapp/migrations/0050_headcountrelatedmodelusingpk_related_page.py +25 -0
  1087. wagtail/test/testapp/migrations/0051_userapprovaltaskstate_userapprovaltask.py +59 -0
  1088. wagtail/test/testapp/models.py +183 -26
  1089. wagtail/test/testapp/templates/tests/workflows/approve_with_style.html +6 -0
  1090. wagtail/test/testapp/views.py +7 -1
  1091. wagtail/test/testapp/wagtail_hooks.py +6 -0
  1092. wagtail/test/utils/form_data.py +1 -0
  1093. wagtail/tests/test_blocks.py +0 -18
  1094. wagtail/tests/test_management_commands.py +1 -1
  1095. wagtail/tests/test_page_model.py +27 -0
  1096. wagtail/tests/test_page_privacy.py +1 -1
  1097. wagtail/tests/test_reference_index.py +26 -0
  1098. wagtail/tests/test_streamfield.py +136 -0
  1099. wagtail/tests/test_utils.py +1 -23
  1100. wagtail/users/forms.py +3 -17
  1101. wagtail/users/locale/ar/LC_MESSAGES/django.po +1 -1
  1102. wagtail/users/locale/be/LC_MESSAGES/django.mo +0 -0
  1103. wagtail/users/locale/be/LC_MESSAGES/django.po +3 -2
  1104. wagtail/users/locale/bg/LC_MESSAGES/django.po +1 -1
  1105. wagtail/users/locale/bn/LC_MESSAGES/django.po +1 -1
  1106. wagtail/users/locale/ca/LC_MESSAGES/django.mo +0 -0
  1107. wagtail/users/locale/ca/LC_MESSAGES/django.po +2 -2
  1108. wagtail/users/locale/cs/LC_MESSAGES/django.po +2 -1
  1109. wagtail/users/locale/cy/LC_MESSAGES/django.po +2 -1
  1110. wagtail/users/locale/da/LC_MESSAGES/django.po +1 -1
  1111. wagtail/users/locale/de/LC_MESSAGES/django.mo +0 -0
  1112. wagtail/users/locale/de/LC_MESSAGES/django.po +3 -3
  1113. wagtail/users/locale/dv/LC_MESSAGES/django.po +2 -1
  1114. wagtail/users/locale/el/LC_MESSAGES/django.po +1 -1
  1115. wagtail/users/locale/en/LC_MESSAGES/django.po +71 -71
  1116. wagtail/users/locale/es/LC_MESSAGES/django.po +1 -1
  1117. wagtail/users/locale/es_419/LC_MESSAGES/django.po +1 -1
  1118. wagtail/users/locale/et/LC_MESSAGES/django.po +1 -1
  1119. wagtail/users/locale/eu/LC_MESSAGES/django.po +1 -1
  1120. wagtail/users/locale/fa/LC_MESSAGES/django.mo +0 -0
  1121. wagtail/users/locale/fa/LC_MESSAGES/django.po +3 -2
  1122. wagtail/users/locale/fi/LC_MESSAGES/django.mo +0 -0
  1123. wagtail/users/locale/fi/LC_MESSAGES/django.po +2 -2
  1124. wagtail/users/locale/fr/LC_MESSAGES/django.mo +0 -0
  1125. wagtail/users/locale/fr/LC_MESSAGES/django.po +4 -2
  1126. wagtail/users/locale/gl/LC_MESSAGES/django.mo +0 -0
  1127. wagtail/users/locale/gl/LC_MESSAGES/django.po +2 -2
  1128. wagtail/users/locale/he_IL/LC_MESSAGES/django.po +1 -1
  1129. wagtail/users/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  1130. wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  1131. wagtail/users/locale/hu/LC_MESSAGES/django.mo +0 -0
  1132. wagtail/users/locale/hu/LC_MESSAGES/django.po +45 -3
  1133. wagtail/users/locale/hy/LC_MESSAGES/django.po +1 -1
  1134. wagtail/users/locale/id_ID/LC_MESSAGES/django.po +1 -1
  1135. wagtail/users/locale/is_IS/LC_MESSAGES/django.po +1 -1
  1136. wagtail/users/locale/it/LC_MESSAGES/django.mo +0 -0
  1137. wagtail/users/locale/it/LC_MESSAGES/django.po +2 -2
  1138. wagtail/users/locale/ja/LC_MESSAGES/django.po +1 -1
  1139. wagtail/users/locale/ka/LC_MESSAGES/django.po +1 -1
  1140. wagtail/users/locale/ko/LC_MESSAGES/django.mo +0 -0
  1141. wagtail/users/locale/ko/LC_MESSAGES/django.po +47 -2
  1142. wagtail/users/locale/lt/LC_MESSAGES/django.po +1 -1
  1143. wagtail/users/locale/lv/LC_MESSAGES/django.po +1 -1
  1144. wagtail/users/locale/mi/LC_MESSAGES/django.po +1 -1
  1145. wagtail/users/locale/mn/LC_MESSAGES/django.mo +0 -0
  1146. wagtail/users/locale/mn/LC_MESSAGES/django.po +3 -2
  1147. wagtail/users/locale/my/LC_MESSAGES/django.po +1 -1
  1148. wagtail/users/locale/nb/LC_MESSAGES/django.po +2 -1
  1149. wagtail/users/locale/nl/LC_MESSAGES/django.mo +0 -0
  1150. wagtail/users/locale/nl/LC_MESSAGES/django.po +3 -2
  1151. wagtail/users/locale/pl/LC_MESSAGES/django.mo +0 -0
  1152. wagtail/users/locale/pl/LC_MESSAGES/django.po +2 -2
  1153. wagtail/users/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  1154. wagtail/users/locale/pt_BR/LC_MESSAGES/django.po +3 -2
  1155. wagtail/users/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  1156. wagtail/users/locale/pt_PT/LC_MESSAGES/django.po +3 -2
  1157. wagtail/users/locale/ro/LC_MESSAGES/django.mo +0 -0
  1158. wagtail/users/locale/ro/LC_MESSAGES/django.po +3 -2
  1159. wagtail/users/locale/ru/LC_MESSAGES/django.mo +0 -0
  1160. wagtail/users/locale/ru/LC_MESSAGES/django.po +4 -2
  1161. wagtail/users/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  1162. wagtail/users/locale/sk_SK/LC_MESSAGES/django.po +2 -2
  1163. wagtail/users/locale/sl/LC_MESSAGES/django.mo +0 -0
  1164. wagtail/users/locale/sl/LC_MESSAGES/django.po +2 -2
  1165. wagtail/users/locale/sv/LC_MESSAGES/django.mo +0 -0
  1166. wagtail/users/locale/sv/LC_MESSAGES/django.po +2 -2
  1167. wagtail/users/locale/tet/LC_MESSAGES/django.po +1 -1
  1168. wagtail/users/locale/th/LC_MESSAGES/django.mo +0 -0
  1169. wagtail/users/locale/th/LC_MESSAGES/django.po +3 -2
  1170. wagtail/users/locale/tr/LC_MESSAGES/django.po +1 -1
  1171. wagtail/users/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  1172. wagtail/users/locale/ug/LC_MESSAGES/django.po +1 -1
  1173. wagtail/users/locale/uk/LC_MESSAGES/django.mo +0 -0
  1174. wagtail/users/locale/uk/LC_MESSAGES/django.po +3 -2
  1175. wagtail/users/locale/vi/LC_MESSAGES/django.po +2 -1
  1176. wagtail/users/locale/zh/LC_MESSAGES/django.po +1 -1
  1177. wagtail/users/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  1178. wagtail/users/locale/zh_Hans/LC_MESSAGES/django.po +3 -2
  1179. wagtail/users/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  1180. wagtail/users/models.py +7 -1
  1181. wagtail/users/templatetags/wagtailusers_tags.py +0 -29
  1182. wagtail/users/tests/__init__.py +0 -6
  1183. wagtail/users/tests/test_admin_views.py +285 -611
  1184. wagtail/users/views/groups.py +1 -28
  1185. wagtail/users/views/users.py +3 -45
  1186. wagtail/utils/deprecation.py +3 -3
  1187. wagtail/whitelist.py +1 -0
  1188. wagtail/workflows.py +2 -2
  1189. wagtail-7.0rc1.dist-info/METADATA +224 -0
  1190. {wagtail-6.4.1.dist-info → wagtail-7.0rc1.dist-info}/RECORD +1194 -1174
  1191. {wagtail-6.4.1.dist-info → wagtail-7.0rc1.dist-info}/WHEEL +1 -1
  1192. wagtail/admin/templates/wagtailadmin/shared/ajax_pagination_nav.html +0 -25
  1193. wagtail/project_template/manage.py +0 -10
  1194. wagtail/utils/setup.py +0 -90
  1195. wagtail/utils/widgets.py +0 -46
  1196. wagtail-6.4.1.dist-info/METADATA +0 -77
  1197. {wagtail-6.4.1.dist-info → wagtail-7.0rc1.dist-info}/entry_points.txt +0 -0
  1198. {wagtail-6.4.1.dist-info → wagtail-7.0rc1.dist-info/licenses}/LICENSE +0 -0
  1199. {wagtail-6.4.1.dist-info → wagtail-7.0rc1.dist-info}/top_level.txt +0 -0
@@ -14,7 +14,7 @@ from django.core.files.base import ContentFile
14
14
  from django.core.files.uploadedfile import SimpleUploadedFile
15
15
  from django.core.handlers.wsgi import WSGIRequest
16
16
  from django.http import HttpRequest, HttpResponse
17
- from django.test import RequestFactory, TestCase, TransactionTestCase
17
+ from django.test import RequestFactory, SimpleTestCase, TestCase, TransactionTestCase
18
18
  from django.test.utils import override_settings
19
19
  from django.urls import reverse
20
20
  from django.utils.timezone import make_aware, now
@@ -34,11 +34,11 @@ from wagtail.models import Locale, ModelLogEntry, Revision
34
34
  from wagtail.signals import published, unpublished
35
35
  from wagtail.snippets.action_menu import (
36
36
  ActionMenuItem,
37
- DeleteMenuItem,
38
37
  get_base_snippet_action_menu_items,
39
38
  )
40
39
  from wagtail.snippets.blocks import SnippetChooserBlock
41
40
  from wagtail.snippets.models import SNIPPET_MODELS, register_snippet
41
+ from wagtail.snippets.views.snippets import get_snippet_models_for_index_view
42
42
  from wagtail.snippets.widgets import (
43
43
  AdminSnippetChooser,
44
44
  SnippetChooserAdapter,
@@ -78,10 +78,25 @@ from wagtail.test.testapp.models import (
78
78
  from wagtail.test.utils import WagtailTestUtils
79
79
  from wagtail.test.utils.template_tests import AdminTemplateTestUtils
80
80
  from wagtail.test.utils.timestamps import submittable_timestamp
81
- from wagtail.utils.deprecation import RemovedInWagtail70Warning
82
81
  from wagtail.utils.timestamps import render_timestamp
83
82
 
84
83
 
84
+ class TestGetSnippetModelsForIndexView(SimpleTestCase):
85
+ def test_default_lists_all_snippets_without_menu_items(self):
86
+ self.assertEqual(
87
+ get_snippet_models_for_index_view(),
88
+ [
89
+ model
90
+ for model in SNIPPET_MODELS
91
+ if not model.snippet_viewset.get_menu_item_is_registered()
92
+ ],
93
+ )
94
+
95
+ @override_settings(WAGTAILSNIPPETS_MENU_SHOW_ALL=True)
96
+ def test_setting_allows_listing_of_all_snippet_models(self):
97
+ self.assertEqual(get_snippet_models_for_index_view(), SNIPPET_MODELS)
98
+
99
+
85
100
  class TestSnippetIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
86
101
  def setUp(self):
87
102
  self.user = self.login()
@@ -346,26 +361,6 @@ class TestSnippetListView(WagtailTestUtils, TestCase):
346
361
  self.assertTemplateUsed(response, "wagtailadmin/shared/buttons.html")
347
362
  self.assertNotContains(response, delete_url)
348
363
 
349
- def test_construct_snippet_listing_buttons_hook_deprecated_context(self):
350
- advert = Advert.objects.create(text="My Lovely advert")
351
-
352
- def register_snippet_listing_button_item(buttons, snippet, user, context):
353
- self.assertEqual(snippet, advert)
354
- self.assertEqual(user, self.user)
355
- self.assertEqual(context, {})
356
-
357
- with hooks.register_temporarily(
358
- "construct_snippet_listing_buttons",
359
- register_snippet_listing_button_item,
360
- ), self.assertWarnsMessage(
361
- RemovedInWagtail70Warning,
362
- "construct_snippet_listing_buttons hook no longer accepts a context argument",
363
- ):
364
- response = self.get()
365
-
366
- self.assertEqual(response.status_code, 200)
367
- self.assertTemplateUsed(response, "wagtailadmin/shared/buttons.html")
368
-
369
364
  def test_dropdown_not_rendered_when_no_child_buttons_exist(self):
370
365
  Advert.objects.create(text="My Lovely advert")
371
366
 
@@ -411,13 +406,71 @@ class TestSnippetListView(WagtailTestUtils, TestCase):
411
406
  html=True,
412
407
  )
413
408
 
409
+ def test_use_fallback_for_blank_string_representation(self):
410
+ snippet = DraftStateModel.objects.create(text="", live=False)
411
+
412
+ response = self.client.get(
413
+ reverse("wagtailsnippets_tests_draftstatemodel:list"),
414
+ )
415
+
416
+ edit_url = reverse(
417
+ "wagtailsnippets_tests_draftstatemodel:edit",
418
+ args=[quote(snippet.pk)],
419
+ )
420
+ title = f"DraftStateModel object ({snippet.pk})"
421
+
422
+ self.assertContains(
423
+ response,
424
+ f"""
425
+ <a href="{edit_url}">
426
+ <span id="snippet_{quote(snippet.pk)}_title">
427
+ {title}
428
+ </span>
429
+ </a>
430
+ """,
431
+ html=True,
432
+ )
433
+
434
+ def test_use_fallback_for_blank_title_field(self):
435
+ # FullFeaturedSnippet's listing view uses the "text" field as the title column,
436
+ # rather than the str() representation. If this is blank, we show "(blank)" so that
437
+ # there is something to click on
438
+ snippet = FullFeaturedSnippet.objects.create(text="", live=False)
439
+ response = self.client.get(
440
+ reverse("some_namespace:list"),
441
+ )
442
+ edit_url = reverse(
443
+ "some_namespace:edit",
444
+ args=[quote(snippet.pk)],
445
+ )
446
+ self.assertContains(
447
+ response,
448
+ f"""
449
+ <a href="{edit_url}">
450
+ <span id="snippet_{quote(snippet.pk)}_title">
451
+ (blank)
452
+ </span>
453
+ </a>
454
+ """,
455
+ html=True,
456
+ )
457
+
414
458
 
415
459
  @override_settings(WAGTAIL_I18N_ENABLED=True)
416
- class TestLocaleSelectorOnList(WagtailTestUtils, TestCase):
460
+ class TestLocaleFeaturesOnList(WagtailTestUtils, TestCase):
461
+ @classmethod
462
+ def setUpTestData(cls):
463
+ cls.fr_locale = Locale.objects.create(language_code="fr")
464
+ cls.list_url = reverse("wagtailsnippets_snippetstests_translatablesnippet:list")
465
+ cls.add_url = reverse("wagtailsnippets_snippetstests_translatablesnippet:add")
466
+
417
467
  def setUp(self):
418
- self.fr_locale = Locale.objects.create(language_code="fr")
419
468
  self.user = self.login()
420
469
 
470
+ def _add_snippets(self):
471
+ TranslatableSnippet.objects.create(text="English snippet")
472
+ TranslatableSnippet.objects.create(text="French snippet", locale=self.fr_locale)
473
+
421
474
  @override_settings(
422
475
  WAGTAIL_CONTENT_LANGUAGES=[
423
476
  ("ar", "Arabic"),
@@ -426,9 +479,7 @@ class TestLocaleSelectorOnList(WagtailTestUtils, TestCase):
426
479
  ]
427
480
  )
428
481
  def test_locale_selector(self):
429
- response = self.client.get(
430
- reverse("wagtailsnippets_snippetstests_translatablesnippet:list")
431
- )
482
+ response = self.client.get(self.list_url)
432
483
  soup = self.get_soup(response.content)
433
484
 
434
485
  # Should only show languages that also have the corresponding Locale
@@ -440,10 +491,7 @@ class TestLocaleSelectorOnList(WagtailTestUtils, TestCase):
440
491
  self.assertIsNotNone(french_input)
441
492
 
442
493
  # Check that the add URLs include the locale
443
- add_url = (
444
- reverse("wagtailsnippets_snippetstests_translatablesnippet:add")
445
- + "?locale=en"
446
- )
494
+ add_url = f"{self.add_url}?locale=en"
447
495
  add_buttons = soup.select(f'a[href="{add_url}"]')
448
496
  self.assertEqual(len(add_buttons), 2)
449
497
  self.assertContains(
@@ -455,9 +503,7 @@ class TestLocaleSelectorOnList(WagtailTestUtils, TestCase):
455
503
 
456
504
  def test_no_locale_filter_when_only_one_locale(self):
457
505
  self.fr_locale.delete()
458
- response = self.client.get(
459
- reverse("wagtailsnippets_snippetstests_translatablesnippet:list")
460
- )
506
+ response = self.client.get(self.list_url)
461
507
  soup = self.get_soup(response.content)
462
508
 
463
509
  locale_input = soup.select_one('input[name="locale"]')
@@ -470,16 +516,14 @@ class TestLocaleSelectorOnList(WagtailTestUtils, TestCase):
470
516
 
471
517
  @override_settings(WAGTAIL_I18N_ENABLED=False)
472
518
  def test_locale_selector_not_present_when_i18n_disabled(self):
473
- response = self.client.get(
474
- reverse("wagtailsnippets_snippetstests_translatablesnippet:list")
475
- )
519
+ response = self.client.get(self.list_url)
476
520
  soup = self.get_soup(response.content)
477
521
 
478
522
  input_element = soup.select_one('input[name="locale"]')
479
523
  self.assertIsNone(input_element)
480
524
 
481
525
  # Check that the add URLs don't include the locale
482
- add_url = reverse("wagtailsnippets_snippetstests_translatablesnippet:add")
526
+ add_url = self.add_url
483
527
  soup = self.get_soup(response.content)
484
528
  add_buttons = soup.select(f'a[href="{add_url}"]')
485
529
  self.assertEqual(len(add_buttons), 2)
@@ -509,6 +553,32 @@ class TestLocaleSelectorOnList(WagtailTestUtils, TestCase):
509
553
  html=True,
510
554
  )
511
555
 
556
+ def test_locale_column(self):
557
+ self._add_snippets()
558
+ response = self.client.get(self.list_url)
559
+ soup = self.get_soup(response.content)
560
+ labels = soup.select("main table td .w-status--label")
561
+ self.assertEqual(len(labels), 2)
562
+ self.assertEqual(
563
+ sorted(label.text.strip() for label in labels),
564
+ ["English", "French"],
565
+ )
566
+
567
+ @override_settings(WAGTAIL_I18N_ENABLED=False)
568
+ def test_locale_column_not_present_with_i18n_disabled(self):
569
+ self._add_snippets()
570
+ response = self.client.get(self.list_url)
571
+ soup = self.get_soup(response.content)
572
+ labels = soup.select("main table td .w-status--label")
573
+ self.assertEqual(len(labels), 0)
574
+
575
+ def test_locale_column_not_present_for_non_translatable_snippet(self):
576
+ response = self.client.get(reverse("wagtailsnippets_tests_advert:list"))
577
+ Advert.objects.create(text="English text")
578
+ soup = self.get_soup(response.content)
579
+ labels = soup.select("main table td .w-status--label")
580
+ self.assertEqual(len(labels), 0)
581
+
512
582
 
513
583
  class TestModelOrdering(WagtailTestUtils, TestCase):
514
584
  def setUp(self):
@@ -536,8 +606,10 @@ class TestListViewOrdering(WagtailTestUtils, TestCase):
536
606
  @classmethod
537
607
  def setUpTestData(cls):
538
608
  for i in range(1, 10):
539
- advert = Advert.objects.create(text=f"{i*'a'}dvert {i}")
540
- draft = DraftStateModel.objects.create(text=f"{i*'d'}raft {i}", live=False)
609
+ advert = Advert.objects.create(text=f"{i * 'a'}dvert {i}")
610
+ draft = DraftStateModel.objects.create(
611
+ text=f"{i * 'd'}raft {i}", live=False
612
+ )
541
613
  if i % 2 == 0:
542
614
  ModelLogEntry.objects.create(
543
615
  content_type=ContentType.objects.get_for_model(Advert),
@@ -1242,7 +1314,7 @@ class TestCreateDraftStateSnippet(WagtailTestUtils, TestCase):
1242
1314
  # The publish button should have name="action-publish"
1243
1315
  self.assertContains(
1244
1316
  response,
1245
- '<button\n type="submit"\n name="action-publish"\n value="action-publish"\n class="button action-save button-longrunning"\n data-controller="w-progress w-kbd"\n data-action="w-progress#activate"\n data-w-kbd-key-value="mod+s"\n',
1317
+ '<button\n type="submit"\n name="action-publish"\n value="action-publish"\n class="button action-save button-longrunning"\n data-controller="w-progress"\n data-action="w-progress#activate"\n',
1246
1318
  )
1247
1319
  # The status side panel should be rendered so that the
1248
1320
  # publishing schedule can be configured
@@ -1320,6 +1392,64 @@ class TestCreateDraftStateSnippet(WagtailTestUtils, TestCase):
1320
1392
  # The revision content should contain the data
1321
1393
  self.assertEqual(snippet.latest_revision.content["text"], "Draft-enabled Foo")
1322
1394
 
1395
+ # A log entry should be created
1396
+ log_entry = ModelLogEntry.objects.for_instance(snippet).get(
1397
+ action="wagtail.create"
1398
+ )
1399
+ self.assertEqual(log_entry.revision, snippet.latest_revision)
1400
+ self.assertEqual(log_entry.label, "Draft-enabled Foo")
1401
+
1402
+ def test_create_skips_validation_when_saving_draft(self):
1403
+ response = self.post(post_data={"text": ""})
1404
+ snippet = DraftStateModel.objects.get(text="")
1405
+
1406
+ self.assertRedirects(
1407
+ response,
1408
+ reverse(
1409
+ "wagtailsnippets_tests_draftstatemodel:edit", args=[quote(snippet.pk)]
1410
+ ),
1411
+ )
1412
+
1413
+ self.assertFalse(snippet.live)
1414
+
1415
+ # A log entry should be created (with a fallback label)
1416
+ log_entry = ModelLogEntry.objects.for_instance(snippet).get(
1417
+ action="wagtail.create"
1418
+ )
1419
+ self.assertEqual(log_entry.revision, snippet.latest_revision)
1420
+ self.assertEqual(log_entry.label, f"DraftStateModel object ({snippet.pk})")
1421
+
1422
+ def test_required_asterisk_on_reshowing_form(self):
1423
+ """
1424
+ If a form is reshown due to a validation error elsewhere, fields whose validation
1425
+ was deferred should still show the required asterisk.
1426
+ """
1427
+ response = self.client.post(
1428
+ reverse("some_namespace:add"),
1429
+ {"text": "", "country_code": "UK", "some_number": "meef"},
1430
+ )
1431
+
1432
+ self.assertEqual(response.status_code, 200)
1433
+
1434
+ # The empty text should not cause a validation error, but the invalid number should
1435
+ self.assertNotContains(response, "This field is required.")
1436
+ self.assertContains(response, "Enter a whole number.", count=1)
1437
+
1438
+ soup = self.get_soup(response.content)
1439
+ self.assertTrue(soup.select_one('label[for="id_text"] > span.w-required-mark'))
1440
+
1441
+ def test_create_will_not_publish_invalid_snippet(self):
1442
+ response = self.post(
1443
+ post_data={"text": "", "action-publish": "Publish"},
1444
+ )
1445
+ self.assertEqual(response.status_code, 200)
1446
+ self.assertContains(
1447
+ response, "The draft state model could not be created due to errors."
1448
+ )
1449
+
1450
+ snippets = DraftStateModel.objects.filter(text="")
1451
+ self.assertEqual(snippets.count(), 0)
1452
+
1323
1453
  def test_publish(self):
1324
1454
  # Connect a mock signal handler to published signal
1325
1455
  mock_handler = mock.MagicMock()
@@ -1967,32 +2097,6 @@ class TestSnippetEditView(BaseTestSnippetEditView):
1967
2097
 
1968
2098
  self.assertNotContains(response, "<em>Save</em>")
1969
2099
 
1970
- def test_register_deprecated_delete_menu_item(self):
1971
- def hook_func(model):
1972
- return DeleteMenuItem(order=900)
1973
-
1974
- get_base_snippet_action_menu_items.cache_clear()
1975
- with self.register_hook(
1976
- "register_snippet_action_menu_item", hook_func
1977
- ), self.assertWarnsMessage(
1978
- RemovedInWagtail70Warning,
1979
- "DeleteMenuItem is deprecated. "
1980
- "The delete option is now provided via EditView.get_header_more_buttons().",
1981
- ):
1982
- response = self.get()
1983
-
1984
- get_base_snippet_action_menu_items.cache_clear()
1985
-
1986
- delete_url = reverse(
1987
- self.test_snippet.snippet_viewset.get_url_name("delete"),
1988
- args=(quote(self.test_snippet.pk),),
1989
- )
1990
- self.assertContains(
1991
- response,
1992
- f'<a class="button" href="{ delete_url }"><svg class="icon icon-bin icon" aria-hidden="true"><use href="#icon-bin"></use></svg>Delete</a>',
1993
- html=True,
1994
- )
1995
-
1996
2100
  def test_previewable_snippet(self):
1997
2101
  self.test_snippet = PreviewableModel.objects.create(
1998
2102
  text="Preview-enabled snippet"
@@ -2181,7 +2285,7 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
2181
2285
  # The publish button should have name="action-publish"
2182
2286
  self.assertContains(
2183
2287
  response,
2184
- '<button\n type="submit"\n name="action-publish"\n value="action-publish"\n class="button action-save button-longrunning"\n data-controller="w-progress w-kbd"\n data-action="w-progress#activate"\n data-w-kbd-key-value="mod+s"\n',
2288
+ '<button\n type="submit"\n name="action-publish"\n value="action-publish"\n class="button action-save button-longrunning"\n data-controller="w-progress"\n data-action="w-progress#activate"\n',
2185
2289
  )
2186
2290
 
2187
2291
  # The status side panel should show "No publishing schedule set" info
@@ -2232,6 +2336,108 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
2232
2336
  # The revision content should contain the new data
2233
2337
  self.assertEqual(latest_revision.content["text"], "Draft-enabled Bar")
2234
2338
 
2339
+ # A log entry should be created
2340
+ log_entry = (
2341
+ ModelLogEntry.objects.for_instance(self.test_snippet)
2342
+ .filter(action="wagtail.edit")
2343
+ .order_by("-timestamp")
2344
+ .first()
2345
+ )
2346
+ self.assertEqual(log_entry.revision, self.test_snippet.latest_revision)
2347
+ self.assertEqual(log_entry.label, "Draft-enabled Bar")
2348
+
2349
+ def test_skip_validation_on_save_draft(self):
2350
+ response = self.post(post_data={"text": ""})
2351
+ self.test_snippet.refresh_from_db()
2352
+ revisions = Revision.objects.for_instance(self.test_snippet)
2353
+ latest_revision = self.test_snippet.latest_revision
2354
+
2355
+ self.assertRedirects(response, self.get_edit_url())
2356
+
2357
+ # The instance should be updated, since it is still a draft
2358
+ self.assertEqual(self.test_snippet.text, "")
2359
+
2360
+ # The instance should be a draft
2361
+ self.assertFalse(self.test_snippet.live)
2362
+ self.assertTrue(self.test_snippet.has_unpublished_changes)
2363
+ self.assertIsNone(self.test_snippet.first_published_at)
2364
+ self.assertIsNone(self.test_snippet.last_published_at)
2365
+ self.assertIsNone(self.test_snippet.live_revision)
2366
+
2367
+ # The revision should be created and set as latest_revision
2368
+ self.assertEqual(revisions.count(), 1)
2369
+ self.assertEqual(latest_revision, revisions.first())
2370
+
2371
+ # The revision content should contain the new data
2372
+ self.assertEqual(latest_revision.content["text"], "")
2373
+
2374
+ # A log entry should be created (with a fallback label)
2375
+ log_entry = (
2376
+ ModelLogEntry.objects.for_instance(self.test_snippet)
2377
+ .filter(action="wagtail.edit")
2378
+ .order_by("-timestamp")
2379
+ .first()
2380
+ )
2381
+ self.assertEqual(log_entry.revision, self.test_snippet.latest_revision)
2382
+ self.assertEqual(
2383
+ log_entry.label,
2384
+ f"DraftStateCustomPrimaryKeyModel object ({self.test_snippet.pk})",
2385
+ )
2386
+
2387
+ def test_required_asterisk_on_reshowing_form(self):
2388
+ """
2389
+ If a form is reshown due to a validation error elsewhere, fields whose validation
2390
+ was deferred should still show the required asterisk.
2391
+ """
2392
+ snippet = FullFeaturedSnippet.objects.create(
2393
+ text="Hello world",
2394
+ country_code="UK",
2395
+ some_number=42,
2396
+ )
2397
+ response = self.client.post(
2398
+ reverse("some_namespace:edit", args=[snippet.pk]),
2399
+ {"text": "", "country_code": "UK", "some_number": "meef"},
2400
+ )
2401
+
2402
+ self.assertEqual(response.status_code, 200)
2403
+
2404
+ # The empty text should not cause a validation error, but the invalid number should
2405
+ self.assertNotContains(response, "This field is required.")
2406
+ self.assertContains(response, "Enter a whole number.", count=1)
2407
+
2408
+ soup = self.get_soup(response.content)
2409
+ self.assertTrue(soup.select_one('label[for="id_text"] > span.w-required-mark'))
2410
+
2411
+ def test_cannot_publish_invalid(self):
2412
+ # Connect a mock signal handler to published signal
2413
+ mock_handler = mock.MagicMock()
2414
+ published.connect(mock_handler)
2415
+
2416
+ try:
2417
+ response = self.post(
2418
+ post_data={
2419
+ "text": "",
2420
+ "action-publish": "action-publish",
2421
+ }
2422
+ )
2423
+
2424
+ self.test_snippet.refresh_from_db()
2425
+
2426
+ self.assertEqual(response.status_code, 200)
2427
+ self.assertContains(
2428
+ response,
2429
+ "The draft state custom primary key model could not be saved due to errors.",
2430
+ )
2431
+
2432
+ # The instance should be unchanged
2433
+ self.assertEqual(self.test_snippet.text, "Draft-enabled Foo")
2434
+ self.assertFalse(self.test_snippet.live)
2435
+
2436
+ # The published signal should not have been fired
2437
+ self.assertEqual(mock_handler.call_count, 0)
2438
+ finally:
2439
+ published.disconnect(mock_handler)
2440
+
2235
2441
  def test_publish(self):
2236
2442
  # Connect a mock signal handler to published signal
2237
2443
  mock_handler = mock.MagicMock()
@@ -2752,10 +2958,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
2752
2958
  # Get the edit page again
2753
2959
  response = self.get()
2754
2960
 
2755
- # Should show the draft go_live_at and expire_at under the "Once published" label
2961
+ # Should show the draft go_live_at and expire_at under the "Once scheduled" label
2756
2962
  self.assertContains(
2757
2963
  response,
2758
- '<div class="w-label-3 w-text-primary">Once published:</div>',
2964
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
2759
2965
  html=True,
2760
2966
  count=1,
2761
2967
  )
@@ -2867,10 +3073,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
2867
3073
  # No new revision should have been created
2868
3074
  self.assertEqual(self.test_snippet.latest_revision_id, latest_revision.pk)
2869
3075
 
2870
- # Should not show the draft go_live_at and expire_at under the "Once published" label
3076
+ # Should not show the draft go_live_at and expire_at under the "Once scheduled" label
2871
3077
  self.assertNotContains(
2872
3078
  response,
2873
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3079
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
2874
3080
  html=True,
2875
3081
  )
2876
3082
  self.assertNotContains(
@@ -2975,10 +3181,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
2975
3181
 
2976
3182
  response = self.get()
2977
3183
 
2978
- # Should show the go_live_at and expire_at without the "Once published" label
3184
+ # Should show the go_live_at and expire_at without the "Once scheduled" label
2979
3185
  self.assertNotContains(
2980
3186
  response,
2981
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3187
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
2982
3188
  html=True,
2983
3189
  )
2984
3190
  self.assertContains(
@@ -3118,10 +3324,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
3118
3324
 
3119
3325
  response = self.get()
3120
3326
 
3121
- # Should show the go_live_at and expire_at without the "Once published" label
3327
+ # Should show the go_live_at and expire_at without the "Once scheduled" label
3122
3328
  self.assertNotContains(
3123
3329
  response,
3124
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3330
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
3125
3331
  html=True,
3126
3332
  )
3127
3333
  self.assertContains(
@@ -3292,10 +3498,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
3292
3498
  count=1,
3293
3499
  )
3294
3500
 
3295
- # Should also show the draft go_live_at and expire_at under the "Once published" label
3501
+ # Should also show the draft go_live_at and expire_at under the "Once scheduled" label
3296
3502
  self.assertContains(
3297
3503
  response,
3298
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3504
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
3299
3505
  html=True,
3300
3506
  count=1,
3301
3507
  )
@@ -3389,10 +3595,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
3389
3595
  html=True,
3390
3596
  )
3391
3597
 
3392
- # Should show the go_live_at and expire_at without the "Once published" label
3598
+ # Should show the go_live_at and expire_at without the "Once scheduled" label
3393
3599
  self.assertNotContains(
3394
3600
  response,
3395
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3601
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
3396
3602
  html=True,
3397
3603
  )
3398
3604
  self.assertContains(
@@ -3488,10 +3694,10 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
3488
3694
  count=1,
3489
3695
  )
3490
3696
 
3491
- # Should show the go_live_at and expire_at without the "Once published" label
3697
+ # Should show the go_live_at and expire_at without the "Once scheduled" label
3492
3698
  self.assertNotContains(
3493
3699
  response,
3494
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3700
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
3495
3701
  html=True,
3496
3702
  )
3497
3703
  self.assertContains(
@@ -3508,6 +3714,25 @@ class TestEditDraftStateSnippet(BaseTestSnippetEditView):
3508
3714
  )
3509
3715
  self.assertSchedulingDialogRendered(response)
3510
3716
 
3717
+ def test_use_fallback_for_blank_string_representation(self):
3718
+ self.snippet = DraftStateModel.objects.create(text="", live=False)
3719
+
3720
+ response = self.client.get(
3721
+ reverse(
3722
+ "wagtailsnippets_tests_draftstatemodel:edit",
3723
+ args=[quote(self.snippet.pk)],
3724
+ ),
3725
+ )
3726
+
3727
+ title = f"DraftStateModel object ({self.snippet.pk})"
3728
+
3729
+ soup = self.get_soup(response.content)
3730
+ h2 = soup.select_one("#header-title")
3731
+ self.assertEqual(h2.text.strip(), title)
3732
+
3733
+ sublabel = soup.select_one(".w-breadcrumbs li:last-of-type")
3734
+ self.assertEqual(sublabel.get_text(strip=True), title)
3735
+
3511
3736
 
3512
3737
  class TestScheduledForPublishLock(BaseTestSnippetEditView):
3513
3738
  def setUp(self):
@@ -3544,10 +3769,10 @@ class TestScheduledForPublishLock(BaseTestSnippetEditView):
3544
3769
 
3545
3770
  response = self.get()
3546
3771
 
3547
- # Should show the go_live_at without the "Once published" label
3772
+ # Should show the go_live_at without the "Once scheduled" label
3548
3773
  self.assertNotContains(
3549
3774
  response,
3550
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3775
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
3551
3776
  html=True,
3552
3777
  )
3553
3778
 
@@ -3611,10 +3836,10 @@ class TestScheduledForPublishLock(BaseTestSnippetEditView):
3611
3836
 
3612
3837
  response = self.get()
3613
3838
 
3614
- # Should show the go_live_at without the "Once published" label
3839
+ # Should show the go_live_at without the "Once scheduled" label
3615
3840
  self.assertNotContains(
3616
3841
  response,
3617
- '<div class="w-label-3 w-text-primary">Once published:</div>',
3842
+ '<div class="w-label-3 w-text-primary">Once scheduled:</div>',
3618
3843
  html=True,
3619
3844
  )
3620
3845
 
@@ -4922,7 +5147,7 @@ class TestCompareRevisions(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
4922
5147
 
4923
5148
  self.assertBreadcrumbsItemsRendered(
4924
5149
  [
4925
- {"url": reverse("wagtailsnippets:index"), "label": "Snippets"},
5150
+ # "Snippets" index link is omitted as RevisableModel has its own menu item
4926
5151
  {"url": index_url, "label": "Revisable models"},
4927
5152
  {"url": edit_url, "label": str(self.snippet)},
4928
5153
  {"url": history_url, "label": "History"},
@@ -5770,48 +5995,6 @@ class TestSnippetViewWithCustomPrimaryKey(WagtailTestUtils, TestCase):
5770
5995
  + "?describe_on_delete=1",
5771
5996
  )
5772
5997
 
5773
- def test_redirect_to_edit(self):
5774
- with self.assertWarnsRegex(
5775
- RemovedInWagtail70Warning,
5776
- "`/<pk>/` edit view URL pattern has been deprecated in favour of /edit/<pk>/.",
5777
- ):
5778
- response = self.client.get(
5779
- "/admin/snippets/snippetstests/standardsnippetwithcustomprimarykey/snippet_2F01/"
5780
- )
5781
- self.assertRedirects(
5782
- response,
5783
- "/admin/snippets/snippetstests/standardsnippetwithcustomprimarykey/edit/snippet_2F01/",
5784
- status_code=301,
5785
- )
5786
-
5787
- def test_redirect_to_delete(self):
5788
- with self.assertWarnsRegex(
5789
- RemovedInWagtail70Warning,
5790
- "`/<pk>/delete/` delete view URL pattern has been deprecated in favour of /delete/<pk>/.",
5791
- ):
5792
- response = self.client.get(
5793
- "/admin/snippets/snippetstests/standardsnippetwithcustomprimarykey/snippet_2F01/delete/"
5794
- )
5795
- self.assertRedirects(
5796
- response,
5797
- "/admin/snippets/snippetstests/standardsnippetwithcustomprimarykey/delete/snippet_2F01/",
5798
- status_code=301,
5799
- )
5800
-
5801
- def test_redirect_to_usage(self):
5802
- with self.assertWarnsRegex(
5803
- RemovedInWagtail70Warning,
5804
- "`/<pk>/usage/` usage view URL pattern has been deprecated in favour of /usage/<pk>/.",
5805
- ):
5806
- response = self.client.get(
5807
- "/admin/snippets/snippetstests/standardsnippetwithcustomprimarykey/snippet_2F01/usage/"
5808
- )
5809
- self.assertRedirects(
5810
- response,
5811
- "/admin/snippets/snippetstests/standardsnippetwithcustomprimarykey/usage/snippet_2F01/",
5812
- status_code=301,
5813
- )
5814
-
5815
5998
 
5816
5999
  class TestSnippetChooserBlockWithCustomPrimaryKey(TestCase):
5817
6000
  fixtures = ["test.json"]