wagtail 7.2.2__py3-none-any.whl → 7.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1301) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_for_translation.py +4 -2
  3. wagtail/admin/action_menu.py +4 -1
  4. wagtail/admin/api/actions/convert_alias.py +2 -2
  5. wagtail/admin/api/actions/copy.py +2 -2
  6. wagtail/admin/api/actions/copy_for_translation.py +2 -2
  7. wagtail/admin/api/actions/create_alias.py +2 -2
  8. wagtail/admin/api/actions/delete.py +1 -1
  9. wagtail/admin/api/actions/move.py +1 -1
  10. wagtail/admin/api/actions/publish.py +2 -2
  11. wagtail/admin/api/actions/revert_to_page_revision.py +2 -2
  12. wagtail/admin/api/actions/unpublish.py +1 -1
  13. wagtail/admin/api/filters.py +2 -2
  14. wagtail/admin/compare.py +22 -0
  15. wagtail/admin/forms/account.py +52 -1
  16. wagtail/admin/forms/comments.py +53 -0
  17. wagtail/admin/forms/models.py +36 -0
  18. wagtail/admin/forms/pages.py +7 -0
  19. wagtail/admin/forms/workflows.py +5 -2
  20. wagtail/admin/icons.py +4 -3
  21. wagtail/admin/locale/af/LC_MESSAGES/djangojs.mo +0 -0
  22. wagtail/admin/locale/af/LC_MESSAGES/djangojs.po +8 -1
  23. wagtail/admin/locale/ar/LC_MESSAGES/django.mo +0 -0
  24. wagtail/admin/locale/ar/LC_MESSAGES/django.po +42 -16
  25. wagtail/admin/locale/ar/LC_MESSAGES/djangojs.mo +0 -0
  26. wagtail/admin/locale/ar/LC_MESSAGES/djangojs.po +20 -11
  27. wagtail/admin/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  28. wagtail/admin/locale/az_AZ/LC_MESSAGES/djangojs.mo +0 -0
  29. wagtail/admin/locale/az_AZ/LC_MESSAGES/djangojs.po +5 -2
  30. wagtail/admin/locale/be/LC_MESSAGES/django.po +1 -1
  31. wagtail/admin/locale/be/LC_MESSAGES/djangojs.mo +0 -0
  32. wagtail/admin/locale/be/LC_MESSAGES/djangojs.po +21 -3
  33. wagtail/admin/locale/bg/LC_MESSAGES/django.mo +0 -0
  34. wagtail/admin/locale/bg/LC_MESSAGES/django.po +299 -2
  35. wagtail/admin/locale/bg/LC_MESSAGES/djangojs.mo +0 -0
  36. wagtail/admin/locale/bg/LC_MESSAGES/djangojs.po +37 -3
  37. wagtail/admin/locale/bn/LC_MESSAGES/django.po +1 -1
  38. wagtail/admin/locale/bn/LC_MESSAGES/djangojs.mo +0 -0
  39. wagtail/admin/locale/bn/LC_MESSAGES/djangojs.po +9 -3
  40. wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
  41. wagtail/admin/locale/ca/LC_MESSAGES/django.po +36 -18
  42. wagtail/admin/locale/ca/LC_MESSAGES/djangojs.mo +0 -0
  43. wagtail/admin/locale/ca/LC_MESSAGES/djangojs.po +34 -12
  44. wagtail/admin/locale/cs/LC_MESSAGES/django.mo +0 -0
  45. wagtail/admin/locale/cs/LC_MESSAGES/django.po +1 -7
  46. wagtail/admin/locale/cs/LC_MESSAGES/djangojs.mo +0 -0
  47. wagtail/admin/locale/cs/LC_MESSAGES/djangojs.po +22 -4
  48. wagtail/admin/locale/cy/LC_MESSAGES/django.po +1 -1
  49. wagtail/admin/locale/cy/LC_MESSAGES/djangojs.mo +0 -0
  50. wagtail/admin/locale/cy/LC_MESSAGES/djangojs.po +15 -3
  51. wagtail/admin/locale/da/LC_MESSAGES/django.po +1 -1
  52. wagtail/admin/locale/da/LC_MESSAGES/djangojs.mo +0 -0
  53. wagtail/admin/locale/da/LC_MESSAGES/djangojs.po +19 -4
  54. wagtail/admin/locale/de/LC_MESSAGES/django.mo +0 -0
  55. wagtail/admin/locale/de/LC_MESSAGES/django.po +201 -21
  56. wagtail/admin/locale/de/LC_MESSAGES/djangojs.mo +0 -0
  57. wagtail/admin/locale/de/LC_MESSAGES/djangojs.po +53 -14
  58. wagtail/admin/locale/dv/LC_MESSAGES/django.mo +0 -0
  59. wagtail/admin/locale/dv/LC_MESSAGES/django.po +7 -16
  60. wagtail/admin/locale/dv/LC_MESSAGES/djangojs.mo +0 -0
  61. wagtail/admin/locale/dv/LC_MESSAGES/djangojs.po +20 -2
  62. wagtail/admin/locale/el/LC_MESSAGES/django.po +1 -1
  63. wagtail/admin/locale/el/LC_MESSAGES/djangojs.mo +0 -0
  64. wagtail/admin/locale/el/LC_MESSAGES/djangojs.po +22 -13
  65. wagtail/admin/locale/en/LC_MESSAGES/django.mo +0 -0
  66. wagtail/admin/locale/en/LC_MESSAGES/django.po +262 -234
  67. wagtail/admin/locale/en/LC_MESSAGES/djangojs.mo +0 -0
  68. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +72 -43
  69. wagtail/admin/locale/en_IN/LC_MESSAGES/djangojs.mo +0 -0
  70. wagtail/admin/locale/en_IN/LC_MESSAGES/djangojs.po +5 -2
  71. wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
  72. wagtail/admin/locale/es/LC_MESSAGES/django.po +1 -10
  73. wagtail/admin/locale/es/LC_MESSAGES/djangojs.mo +0 -0
  74. wagtail/admin/locale/es/LC_MESSAGES/djangojs.po +22 -13
  75. wagtail/admin/locale/es_419/LC_MESSAGES/django.po +1 -1
  76. wagtail/admin/locale/es_419/LC_MESSAGES/djangojs.mo +0 -0
  77. wagtail/admin/locale/es_419/LC_MESSAGES/djangojs.po +8 -2
  78. wagtail/admin/locale/es_VE/LC_MESSAGES/django.po +1 -1
  79. wagtail/admin/locale/es_VE/LC_MESSAGES/djangojs.mo +0 -0
  80. wagtail/admin/locale/es_VE/LC_MESSAGES/djangojs.po +5 -2
  81. wagtail/admin/locale/et/LC_MESSAGES/django.po +1 -1
  82. wagtail/admin/locale/et/LC_MESSAGES/djangojs.mo +0 -0
  83. wagtail/admin/locale/et/LC_MESSAGES/djangojs.po +17 -2
  84. wagtail/admin/locale/eu/LC_MESSAGES/django.po +1 -1
  85. wagtail/admin/locale/eu/LC_MESSAGES/djangojs.mo +0 -0
  86. wagtail/admin/locale/eu/LC_MESSAGES/djangojs.po +8 -2
  87. wagtail/admin/locale/fa/LC_MESSAGES/django.mo +0 -0
  88. wagtail/admin/locale/fa/LC_MESSAGES/django.po +5 -11
  89. wagtail/admin/locale/fa/LC_MESSAGES/djangojs.mo +0 -0
  90. wagtail/admin/locale/fa/LC_MESSAGES/djangojs.po +18 -3
  91. wagtail/admin/locale/fi/LC_MESSAGES/django.mo +0 -0
  92. wagtail/admin/locale/fi/LC_MESSAGES/django.po +1 -12
  93. wagtail/admin/locale/fi/LC_MESSAGES/djangojs.mo +0 -0
  94. wagtail/admin/locale/fi/LC_MESSAGES/djangojs.po +22 -12
  95. wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
  96. wagtail/admin/locale/fr/LC_MESSAGES/django.po +38 -21
  97. wagtail/admin/locale/fr/LC_MESSAGES/djangojs.mo +0 -0
  98. wagtail/admin/locale/fr/LC_MESSAGES/djangojs.po +35 -14
  99. wagtail/admin/locale/gl/LC_MESSAGES/django.mo +0 -0
  100. wagtail/admin/locale/gl/LC_MESSAGES/django.po +36 -18
  101. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.mo +0 -0
  102. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.po +34 -12
  103. wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +1 -1
  104. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.mo +0 -0
  105. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.po +20 -3
  106. wagtail/admin/locale/hi/LC_MESSAGES/djangojs.mo +0 -0
  107. wagtail/admin/locale/hi/LC_MESSAGES/djangojs.po +5 -2
  108. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  109. wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.mo +0 -0
  110. wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.po +17 -2
  111. wagtail/admin/locale/ht/LC_MESSAGES/django.po +1 -1
  112. wagtail/admin/locale/ht/LC_MESSAGES/djangojs.mo +0 -0
  113. wagtail/admin/locale/ht/LC_MESSAGES/djangojs.po +5 -2
  114. wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
  115. wagtail/admin/locale/hu/LC_MESSAGES/django.po +7 -18
  116. wagtail/admin/locale/hu/LC_MESSAGES/djangojs.mo +0 -0
  117. wagtail/admin/locale/hu/LC_MESSAGES/djangojs.po +21 -11
  118. wagtail/admin/locale/id_ID/LC_MESSAGES/django.po +1 -1
  119. wagtail/admin/locale/id_ID/LC_MESSAGES/djangojs.mo +0 -0
  120. wagtail/admin/locale/id_ID/LC_MESSAGES/djangojs.po +18 -3
  121. wagtail/admin/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  122. wagtail/admin/locale/is_IS/LC_MESSAGES/django.po +7 -17
  123. wagtail/admin/locale/is_IS/LC_MESSAGES/djangojs.mo +0 -0
  124. wagtail/admin/locale/is_IS/LC_MESSAGES/djangojs.po +21 -12
  125. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  126. wagtail/admin/locale/it/LC_MESSAGES/django.po +599 -19
  127. wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
  128. wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +73 -13
  129. wagtail/admin/locale/ja/LC_MESSAGES/django.po +1 -1
  130. wagtail/admin/locale/ja/LC_MESSAGES/djangojs.mo +0 -0
  131. wagtail/admin/locale/ja/LC_MESSAGES/djangojs.po +23 -3
  132. wagtail/admin/locale/ka/LC_MESSAGES/django.po +1 -1
  133. wagtail/admin/locale/ka/LC_MESSAGES/djangojs.mo +0 -0
  134. wagtail/admin/locale/ka/LC_MESSAGES/djangojs.po +5 -2
  135. wagtail/admin/locale/ko/LC_MESSAGES/django.mo +0 -0
  136. wagtail/admin/locale/ko/LC_MESSAGES/django.po +1 -11
  137. wagtail/admin/locale/ko/LC_MESSAGES/djangojs.mo +0 -0
  138. wagtail/admin/locale/ko/LC_MESSAGES/djangojs.po +23 -13
  139. wagtail/admin/locale/lt/LC_MESSAGES/django.po +1 -1
  140. wagtail/admin/locale/lt/LC_MESSAGES/djangojs.mo +0 -0
  141. wagtail/admin/locale/lt/LC_MESSAGES/djangojs.po +21 -12
  142. wagtail/admin/locale/lv/LC_MESSAGES/django.po +1 -1
  143. wagtail/admin/locale/lv/LC_MESSAGES/djangojs.mo +0 -0
  144. wagtail/admin/locale/lv/LC_MESSAGES/djangojs.po +22 -4
  145. wagtail/admin/locale/mi/LC_MESSAGES/django.po +1 -1
  146. wagtail/admin/locale/mi/LC_MESSAGES/djangojs.mo +0 -0
  147. wagtail/admin/locale/mi/LC_MESSAGES/djangojs.po +14 -2
  148. wagtail/admin/locale/mn/LC_MESSAGES/django.po +1 -1
  149. wagtail/admin/locale/mn/LC_MESSAGES/djangojs.mo +0 -0
  150. wagtail/admin/locale/mn/LC_MESSAGES/djangojs.po +17 -2
  151. wagtail/admin/locale/my/LC_MESSAGES/django.po +1 -1
  152. wagtail/admin/locale/my/LC_MESSAGES/djangojs.mo +0 -0
  153. wagtail/admin/locale/my/LC_MESSAGES/djangojs.po +8 -2
  154. wagtail/admin/locale/nb/LC_MESSAGES/django.po +1 -1
  155. wagtail/admin/locale/nb/LC_MESSAGES/djangojs.mo +0 -0
  156. wagtail/admin/locale/nb/LC_MESSAGES/djangojs.po +18 -3
  157. wagtail/admin/locale/nl/LC_MESSAGES/django.mo +0 -0
  158. wagtail/admin/locale/nl/LC_MESSAGES/django.po +38 -21
  159. wagtail/admin/locale/nl/LC_MESSAGES/djangojs.mo +0 -0
  160. wagtail/admin/locale/nl/LC_MESSAGES/djangojs.po +36 -13
  161. wagtail/admin/locale/pl/LC_MESSAGES/django.mo +0 -0
  162. wagtail/admin/locale/pl/LC_MESSAGES/django.po +1 -10
  163. wagtail/admin/locale/pl/LC_MESSAGES/djangojs.mo +0 -0
  164. wagtail/admin/locale/pl/LC_MESSAGES/djangojs.po +21 -12
  165. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  166. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.po +7 -16
  167. wagtail/admin/locale/pt_BR/LC_MESSAGES/djangojs.mo +0 -0
  168. wagtail/admin/locale/pt_BR/LC_MESSAGES/djangojs.po +21 -13
  169. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  170. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +1 -7
  171. wagtail/admin/locale/pt_PT/LC_MESSAGES/djangojs.mo +0 -0
  172. wagtail/admin/locale/pt_PT/LC_MESSAGES/djangojs.po +18 -12
  173. wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
  174. wagtail/admin/locale/ro/LC_MESSAGES/django.po +7 -16
  175. wagtail/admin/locale/ro/LC_MESSAGES/djangojs.mo +0 -0
  176. wagtail/admin/locale/ro/LC_MESSAGES/djangojs.po +20 -11
  177. wagtail/admin/locale/ru/LC_MESSAGES/django.mo +0 -0
  178. wagtail/admin/locale/ru/LC_MESSAGES/django.po +186 -22
  179. wagtail/admin/locale/ru/LC_MESSAGES/djangojs.mo +0 -0
  180. wagtail/admin/locale/ru/LC_MESSAGES/djangojs.po +53 -14
  181. wagtail/admin/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  182. wagtail/admin/locale/sk_SK/LC_MESSAGES/djangojs.mo +0 -0
  183. wagtail/admin/locale/sk_SK/LC_MESSAGES/djangojs.po +20 -3
  184. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  185. wagtail/admin/locale/sl/LC_MESSAGES/django.po +7 -16
  186. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.mo +0 -0
  187. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.po +21 -12
  188. wagtail/admin/locale/sr/LC_MESSAGES/djangojs.mo +0 -0
  189. wagtail/admin/locale/sr/LC_MESSAGES/djangojs.po +15 -0
  190. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  191. wagtail/admin/locale/sv/LC_MESSAGES/django.po +329 -23
  192. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.mo +0 -0
  193. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.po +23 -13
  194. wagtail/admin/locale/ta/LC_MESSAGES/djangojs.mo +0 -0
  195. wagtail/admin/locale/ta/LC_MESSAGES/djangojs.po +5 -2
  196. wagtail/admin/locale/tet/LC_MESSAGES/django.po +1 -1
  197. wagtail/admin/locale/tet/LC_MESSAGES/djangojs.mo +0 -0
  198. wagtail/admin/locale/tet/LC_MESSAGES/djangojs.po +19 -4
  199. wagtail/admin/locale/th/LC_MESSAGES/django.mo +0 -0
  200. wagtail/admin/locale/th/LC_MESSAGES/django.po +1 -4
  201. wagtail/admin/locale/th/LC_MESSAGES/djangojs.mo +0 -0
  202. wagtail/admin/locale/th/LC_MESSAGES/djangojs.po +22 -3
  203. wagtail/admin/locale/tr/LC_MESSAGES/django.mo +0 -0
  204. wagtail/admin/locale/tr/LC_MESSAGES/django.po +4 -10
  205. wagtail/admin/locale/tr/LC_MESSAGES/djangojs.mo +0 -0
  206. wagtail/admin/locale/tr/LC_MESSAGES/djangojs.po +23 -5
  207. wagtail/admin/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  208. wagtail/admin/locale/tr_TR/LC_MESSAGES/djangojs.mo +0 -0
  209. wagtail/admin/locale/tr_TR/LC_MESSAGES/djangojs.po +19 -4
  210. wagtail/admin/locale/ug/LC_MESSAGES/django.mo +0 -0
  211. wagtail/admin/locale/ug/LC_MESSAGES/django.po +7 -16
  212. wagtail/admin/locale/ug/LC_MESSAGES/djangojs.mo +0 -0
  213. wagtail/admin/locale/ug/LC_MESSAGES/djangojs.po +20 -11
  214. wagtail/admin/locale/uk/LC_MESSAGES/django.mo +0 -0
  215. wagtail/admin/locale/uk/LC_MESSAGES/django.po +5 -11
  216. wagtail/admin/locale/uk/LC_MESSAGES/djangojs.mo +0 -0
  217. wagtail/admin/locale/uk/LC_MESSAGES/djangojs.po +22 -14
  218. wagtail/admin/locale/vi/LC_MESSAGES/django.po +1 -1
  219. wagtail/admin/locale/vi/LC_MESSAGES/djangojs.mo +0 -0
  220. wagtail/admin/locale/vi/LC_MESSAGES/djangojs.po +9 -2
  221. wagtail/admin/locale/zh/LC_MESSAGES/django.po +1 -1
  222. wagtail/admin/locale/zh/LC_MESSAGES/djangojs.mo +0 -0
  223. wagtail/admin/locale/zh/LC_MESSAGES/djangojs.po +20 -5
  224. wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  225. wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.po +1 -7
  226. wagtail/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo +0 -0
  227. wagtail/admin/locale/zh_Hans/LC_MESSAGES/djangojs.po +23 -13
  228. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  229. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +1 -7
  230. wagtail/admin/locale/zh_Hant/LC_MESSAGES/djangojs.mo +0 -0
  231. wagtail/admin/locale/zh_Hant/LC_MESSAGES/djangojs.po +21 -3
  232. wagtail/admin/panels/comment_panel.py +1 -51
  233. wagtail/admin/panels/title_field_panel.py +3 -1
  234. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  235. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  236. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  237. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  238. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -1
  239. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  240. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  241. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  242. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  243. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  244. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +1 -1
  245. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  246. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  247. wagtail/admin/templates/wagtailadmin/base.html +1 -1
  248. wagtail/admin/templates/wagtailadmin/generic/edit_partials.html +100 -0
  249. wagtail/admin/templates/wagtailadmin/generic/form.html +26 -5
  250. wagtail/admin/templates/wagtailadmin/generic/includes/_loaded_revision_inputs.html +3 -0
  251. wagtail/admin/templates/wagtailadmin/generic/listing_results.html +1 -17
  252. wagtail/admin/templates/wagtailadmin/pages/create.html +14 -4
  253. wagtail/admin/templates/wagtailadmin/pages/edit.html +16 -3
  254. wagtail/admin/templates/wagtailadmin/pages/edit_partials.html +19 -0
  255. wagtail/admin/templates/wagtailadmin/pages/index_results.html +1 -9
  256. wagtail/admin/templates/wagtailadmin/shared/autosave/indicator.html +36 -0
  257. wagtail/admin/templates/wagtailadmin/shared/breadcrumbs.html +1 -1
  258. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/list.html +2 -2
  259. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/module.html +19 -3
  260. wagtail/admin/templates/wagtailadmin/shared/headers/_actions.html +5 -0
  261. wagtail/admin/templates/wagtailadmin/shared/headers/_history_icon_link.html +2 -2
  262. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +8 -9
  263. wagtail/admin/templates/wagtailadmin/shared/listing/filter_partials.html +19 -0
  264. wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +3 -3
  265. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/side_panel.html +3 -0
  266. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/privacy.html +18 -6
  267. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/usage.html +11 -4
  268. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/workflow.html +22 -1
  269. wagtail/admin/templates/wagtailadmin/shared/side_panels/preview.html +1 -0
  270. wagtail/admin/templates/wagtailadmin/shared/side_panels.html +1 -2
  271. wagtail/admin/templates/wagtailadmin/shared/unsaved_changes_warning.html +20 -20
  272. wagtail/admin/templates/wagtailadmin/userbar/base.html +2 -0
  273. wagtail/admin/templates/wagtailadmin/userbar/item_accessibility.html +1 -1
  274. wagtail/admin/templatetags/wagtailadmin_tags.py +6 -14
  275. wagtail/admin/tests/pages/test_create_page.py +359 -1
  276. wagtail/admin/tests/pages/test_custom_listing.py +48 -2
  277. wagtail/admin/tests/pages/test_edit_page.py +987 -10
  278. wagtail/admin/tests/pages/test_explorer_view.py +9 -5
  279. wagtail/admin/tests/pages/test_page_search.py +15 -0
  280. wagtail/admin/tests/pages/test_revisions.py +4 -0
  281. wagtail/admin/tests/test_account_management.py +88 -2
  282. wagtail/admin/tests/test_collections_views.py +15 -15
  283. wagtail/admin/tests/test_compare.py +34 -0
  284. wagtail/admin/tests/test_editing_sessions.py +230 -8
  285. wagtail/admin/tests/test_forms.py +192 -1
  286. wagtail/admin/tests/test_icon_sprite.py +22 -2
  287. wagtail/admin/tests/test_page_chooser.py +13 -13
  288. wagtail/admin/tests/test_reports_views.py +4 -1
  289. wagtail/admin/tests/test_userbar.py +69 -5
  290. wagtail/admin/tests/test_views_generic.py +5 -5
  291. wagtail/admin/tests/test_workflows.py +14 -12
  292. wagtail/admin/tests/viewsets/test_model_viewset.py +13 -0
  293. wagtail/admin/ui/autosave.py +5 -0
  294. wagtail/admin/ui/editing_sessions.py +3 -0
  295. wagtail/admin/ui/side_panels.py +19 -20
  296. wagtail/admin/userbar.py +48 -27
  297. wagtail/admin/views/bulk_action/dispatcher.py +2 -2
  298. wagtail/admin/views/chooser.py +6 -6
  299. wagtail/admin/views/editing_sessions.py +20 -7
  300. wagtail/admin/views/generic/__init__.py +1 -0
  301. wagtail/admin/views/generic/chooser.py +5 -5
  302. wagtail/admin/views/generic/mixins.py +143 -26
  303. wagtail/admin/views/generic/models.py +157 -27
  304. wagtail/admin/views/generic/ordering.py +1 -1
  305. wagtail/admin/views/generic/preview.py +4 -4
  306. wagtail/admin/views/home.py +3 -1
  307. wagtail/admin/views/pages/create.py +78 -29
  308. wagtail/admin/views/pages/edit.py +162 -34
  309. wagtail/admin/views/pages/preview.py +4 -4
  310. wagtail/admin/views/pages/revisions.py +3 -0
  311. wagtail/admin/views/pages/search.py +4 -4
  312. wagtail/admin/views/pages/usage.py +2 -2
  313. wagtail/admin/views/tags.py +2 -2
  314. wagtail/admin/views/workflows.py +73 -54
  315. wagtail/admin/viewsets/model.py +34 -8
  316. wagtail/admin/widgets/button.py +11 -4
  317. wagtail/admin/widgets/chooser.py +6 -4
  318. wagtail/admin/widgets/slug.py +1 -1
  319. wagtail/api/v2/filters.py +27 -21
  320. wagtail/api/v2/pagination.py +4 -4
  321. wagtail/api/v2/views.py +7 -7
  322. wagtail/blocks/list_block.py +0 -8
  323. wagtail/blocks/migrations/migrate_operation.py +8 -1
  324. wagtail/blocks/stream_block.py +2 -10
  325. wagtail/blocks/struct_block.py +192 -12
  326. wagtail/compat.py +2 -2
  327. wagtail/contrib/forms/locale/af/LC_MESSAGES/django.mo +0 -0
  328. wagtail/contrib/forms/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  329. wagtail/contrib/forms/locale/bg/LC_MESSAGES/django.mo +0 -0
  330. wagtail/contrib/forms/locale/bg/LC_MESSAGES/django.po +4 -1
  331. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.mo +0 -0
  332. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +1 -1
  333. wagtail/contrib/forms/locale/eu/LC_MESSAGES/django.mo +0 -0
  334. wagtail/contrib/forms/locale/ht/LC_MESSAGES/django.mo +0 -0
  335. wagtail/contrib/forms/locale/hy/LC_MESSAGES/django.mo +0 -0
  336. wagtail/contrib/forms/locale/it/LC_MESSAGES/django.mo +0 -0
  337. wagtail/contrib/forms/locale/it/LC_MESSAGES/django.po +40 -2
  338. wagtail/contrib/forms/locale/ka/LC_MESSAGES/django.mo +0 -0
  339. wagtail/contrib/frontend_cache/backends/azure.py +6 -6
  340. wagtail/contrib/frontend_cache/backends/cloudfront.py +2 -2
  341. wagtail/contrib/frontend_cache/utils.py +1 -1
  342. wagtail/contrib/redirects/forms.py +1 -1
  343. wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.po +1 -1
  344. wagtail/contrib/redirects/locale/be/LC_MESSAGES/django.po +1 -1
  345. wagtail/contrib/redirects/locale/bg/LC_MESSAGES/django.mo +0 -0
  346. wagtail/contrib/redirects/locale/bg/LC_MESSAGES/django.po +7 -1
  347. wagtail/contrib/redirects/locale/bn/LC_MESSAGES/django.mo +0 -0
  348. wagtail/contrib/redirects/locale/bn/LC_MESSAGES/django.po +1 -1
  349. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +1 -1
  350. wagtail/contrib/redirects/locale/cs/LC_MESSAGES/django.po +1 -1
  351. wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.po +1 -1
  352. wagtail/contrib/redirects/locale/da/LC_MESSAGES/django.po +1 -1
  353. wagtail/contrib/redirects/locale/de/LC_MESSAGES/django.mo +0 -0
  354. wagtail/contrib/redirects/locale/de/LC_MESSAGES/django.po +15 -3
  355. wagtail/contrib/redirects/locale/dv/LC_MESSAGES/django.po +1 -1
  356. wagtail/contrib/redirects/locale/el/LC_MESSAGES/django.po +1 -1
  357. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.mo +0 -0
  358. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +14 -14
  359. wagtail/contrib/redirects/locale/en_IN/LC_MESSAGES/django.mo +0 -0
  360. wagtail/contrib/redirects/locale/en_IN/LC_MESSAGES/django.po +1 -1
  361. wagtail/contrib/redirects/locale/es/LC_MESSAGES/django.po +1 -1
  362. wagtail/contrib/redirects/locale/es_419/LC_MESSAGES/django.mo +0 -0
  363. wagtail/contrib/redirects/locale/es_419/LC_MESSAGES/django.po +1 -1
  364. wagtail/contrib/redirects/locale/es_VE/LC_MESSAGES/django.mo +0 -0
  365. wagtail/contrib/redirects/locale/es_VE/LC_MESSAGES/django.po +1 -1
  366. wagtail/contrib/redirects/locale/et/LC_MESSAGES/django.po +1 -1
  367. wagtail/contrib/redirects/locale/eu/LC_MESSAGES/django.mo +0 -0
  368. wagtail/contrib/redirects/locale/eu/LC_MESSAGES/django.po +1 -1
  369. wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.po +1 -1
  370. wagtail/contrib/redirects/locale/fi/LC_MESSAGES/django.po +1 -1
  371. wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +1 -1
  372. wagtail/contrib/redirects/locale/gl/LC_MESSAGES/django.po +1 -1
  373. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +1 -1
  374. wagtail/contrib/redirects/locale/hi/LC_MESSAGES/django.mo +0 -0
  375. wagtail/contrib/redirects/locale/hi/LC_MESSAGES/django.po +1 -1
  376. wagtail/contrib/redirects/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  377. wagtail/contrib/redirects/locale/ht/LC_MESSAGES/django.mo +0 -0
  378. wagtail/contrib/redirects/locale/ht/LC_MESSAGES/django.po +1 -1
  379. wagtail/contrib/redirects/locale/hu/LC_MESSAGES/django.po +1 -1
  380. wagtail/contrib/redirects/locale/hy/LC_MESSAGES/django.mo +0 -0
  381. wagtail/contrib/redirects/locale/hy/LC_MESSAGES/django.po +1 -1
  382. wagtail/contrib/redirects/locale/id_ID/LC_MESSAGES/django.po +1 -1
  383. wagtail/contrib/redirects/locale/is_IS/LC_MESSAGES/django.po +1 -1
  384. wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.mo +0 -0
  385. wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.po +17 -4
  386. wagtail/contrib/redirects/locale/ja/LC_MESSAGES/django.po +1 -1
  387. wagtail/contrib/redirects/locale/ka/LC_MESSAGES/django.mo +0 -0
  388. wagtail/contrib/redirects/locale/ka/LC_MESSAGES/django.po +1 -1
  389. wagtail/contrib/redirects/locale/ko/LC_MESSAGES/django.po +1 -1
  390. wagtail/contrib/redirects/locale/lt/LC_MESSAGES/django.po +1 -1
  391. wagtail/contrib/redirects/locale/lv/LC_MESSAGES/django.po +1 -1
  392. wagtail/contrib/redirects/locale/mi/LC_MESSAGES/django.po +1 -1
  393. wagtail/contrib/redirects/locale/mn/LC_MESSAGES/django.po +1 -1
  394. wagtail/contrib/redirects/locale/my/LC_MESSAGES/django.po +1 -1
  395. wagtail/contrib/redirects/locale/nb/LC_MESSAGES/django.po +1 -1
  396. wagtail/contrib/redirects/locale/nl/LC_MESSAGES/django.po +1 -1
  397. wagtail/contrib/redirects/locale/pl/LC_MESSAGES/django.po +1 -1
  398. wagtail/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  399. wagtail/contrib/redirects/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  400. wagtail/contrib/redirects/locale/ro/LC_MESSAGES/django.po +1 -1
  401. wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.mo +0 -0
  402. wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.po +15 -2
  403. wagtail/contrib/redirects/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  404. wagtail/contrib/redirects/locale/sl/LC_MESSAGES/django.po +1 -1
  405. wagtail/contrib/redirects/locale/sr/LC_MESSAGES/django.mo +0 -0
  406. wagtail/contrib/redirects/locale/sr/LC_MESSAGES/django.po +1 -1
  407. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.mo +0 -0
  408. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.po +17 -4
  409. wagtail/contrib/redirects/locale/ta/LC_MESSAGES/django.mo +0 -0
  410. wagtail/contrib/redirects/locale/ta/LC_MESSAGES/django.po +1 -1
  411. wagtail/contrib/redirects/locale/tet/LC_MESSAGES/django.po +1 -1
  412. wagtail/contrib/redirects/locale/th/LC_MESSAGES/django.po +1 -1
  413. wagtail/contrib/redirects/locale/tr/LC_MESSAGES/django.po +1 -1
  414. wagtail/contrib/redirects/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  415. wagtail/contrib/redirects/locale/ug/LC_MESSAGES/django.po +1 -1
  416. wagtail/contrib/redirects/locale/uk/LC_MESSAGES/django.po +1 -1
  417. wagtail/contrib/redirects/locale/vi/LC_MESSAGES/django.po +1 -1
  418. wagtail/contrib/redirects/locale/zh/LC_MESSAGES/django.po +1 -1
  419. wagtail/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  420. wagtail/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  421. wagtail/contrib/redirects/middleware.py +11 -7
  422. wagtail/contrib/redirects/models.py +17 -1
  423. wagtail/contrib/redirects/tests/test_import_admin_views.py +3 -3
  424. wagtail/contrib/redirects/tests/test_redirects.py +56 -8
  425. wagtail/contrib/search_promotions/locale/af/LC_MESSAGES/django.mo +0 -0
  426. wagtail/contrib/search_promotions/locale/af/LC_MESSAGES/django.po +1 -1
  427. wagtail/contrib/search_promotions/locale/ar/LC_MESSAGES/django.po +1 -1
  428. wagtail/contrib/search_promotions/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  429. wagtail/contrib/search_promotions/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  430. wagtail/contrib/search_promotions/locale/be/LC_MESSAGES/django.po +1 -1
  431. wagtail/contrib/search_promotions/locale/bg/LC_MESSAGES/django.po +1 -1
  432. wagtail/contrib/search_promotions/locale/bn/LC_MESSAGES/django.mo +0 -0
  433. wagtail/contrib/search_promotions/locale/bn/LC_MESSAGES/django.po +1 -1
  434. wagtail/contrib/search_promotions/locale/ca/LC_MESSAGES/django.po +1 -1
  435. wagtail/contrib/search_promotions/locale/cs/LC_MESSAGES/django.po +1 -1
  436. wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.po +1 -1
  437. wagtail/contrib/search_promotions/locale/da/LC_MESSAGES/django.po +1 -1
  438. wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.mo +0 -0
  439. wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.po +9 -3
  440. wagtail/contrib/search_promotions/locale/dv/LC_MESSAGES/django.po +1 -1
  441. wagtail/contrib/search_promotions/locale/el/LC_MESSAGES/django.po +1 -1
  442. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.mo +0 -0
  443. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +6 -6
  444. wagtail/contrib/search_promotions/locale/es/LC_MESSAGES/django.po +1 -1
  445. wagtail/contrib/search_promotions/locale/es_419/LC_MESSAGES/django.mo +0 -0
  446. wagtail/contrib/search_promotions/locale/es_419/LC_MESSAGES/django.po +1 -1
  447. wagtail/contrib/search_promotions/locale/et/LC_MESSAGES/django.po +1 -1
  448. wagtail/contrib/search_promotions/locale/eu/LC_MESSAGES/django.po +1 -1
  449. wagtail/contrib/search_promotions/locale/fa/LC_MESSAGES/django.po +1 -1
  450. wagtail/contrib/search_promotions/locale/fi/LC_MESSAGES/django.po +1 -1
  451. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +1 -1
  452. wagtail/contrib/search_promotions/locale/gl/LC_MESSAGES/django.po +1 -1
  453. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +1 -1
  454. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  455. wagtail/contrib/search_promotions/locale/ht/LC_MESSAGES/django.po +1 -1
  456. wagtail/contrib/search_promotions/locale/hu/LC_MESSAGES/django.po +1 -1
  457. wagtail/contrib/search_promotions/locale/id_ID/LC_MESSAGES/django.po +1 -1
  458. wagtail/contrib/search_promotions/locale/is_IS/LC_MESSAGES/django.po +1 -1
  459. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
  460. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +44 -3
  461. wagtail/contrib/search_promotions/locale/ja/LC_MESSAGES/django.po +1 -1
  462. wagtail/contrib/search_promotions/locale/ka/LC_MESSAGES/django.po +1 -1
  463. wagtail/contrib/search_promotions/locale/ko/LC_MESSAGES/django.po +1 -1
  464. wagtail/contrib/search_promotions/locale/lt/LC_MESSAGES/django.po +1 -1
  465. wagtail/contrib/search_promotions/locale/lv/LC_MESSAGES/django.po +1 -1
  466. wagtail/contrib/search_promotions/locale/mi/LC_MESSAGES/django.po +1 -1
  467. wagtail/contrib/search_promotions/locale/mn/LC_MESSAGES/django.po +1 -1
  468. wagtail/contrib/search_promotions/locale/my/LC_MESSAGES/django.po +1 -1
  469. wagtail/contrib/search_promotions/locale/nb/LC_MESSAGES/django.po +1 -1
  470. wagtail/contrib/search_promotions/locale/nl/LC_MESSAGES/django.po +1 -1
  471. wagtail/contrib/search_promotions/locale/pl/LC_MESSAGES/django.po +1 -1
  472. wagtail/contrib/search_promotions/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  473. wagtail/contrib/search_promotions/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  474. wagtail/contrib/search_promotions/locale/ro/LC_MESSAGES/django.po +1 -1
  475. wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.mo +0 -0
  476. wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.po +9 -3
  477. wagtail/contrib/search_promotions/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  478. wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.po +1 -1
  479. wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.po +1 -1
  480. wagtail/contrib/search_promotions/locale/tet/LC_MESSAGES/django.po +1 -1
  481. wagtail/contrib/search_promotions/locale/th/LC_MESSAGES/django.po +1 -1
  482. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.po +1 -1
  483. wagtail/contrib/search_promotions/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  484. wagtail/contrib/search_promotions/locale/ug/LC_MESSAGES/django.po +1 -1
  485. wagtail/contrib/search_promotions/locale/uk/LC_MESSAGES/django.po +1 -1
  486. wagtail/contrib/search_promotions/locale/vi/LC_MESSAGES/django.po +1 -1
  487. wagtail/contrib/search_promotions/locale/zh/LC_MESSAGES/django.po +1 -1
  488. wagtail/contrib/search_promotions/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  489. wagtail/contrib/search_promotions/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  490. wagtail/contrib/search_promotions/tests.py +1 -1
  491. wagtail/contrib/search_promotions/views/settings.py +24 -25
  492. wagtail/contrib/settings/jinja2tags.py +2 -2
  493. wagtail/contrib/settings/locale/ar/LC_MESSAGES/django.po +1 -1
  494. wagtail/contrib/settings/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  495. wagtail/contrib/settings/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  496. wagtail/contrib/settings/locale/be/LC_MESSAGES/django.po +1 -1
  497. wagtail/contrib/settings/locale/bg/LC_MESSAGES/django.mo +0 -0
  498. wagtail/{locale/af → contrib/settings/locale/bg}/LC_MESSAGES/django.po +7 -16
  499. wagtail/contrib/settings/locale/bn/LC_MESSAGES/django.po +1 -1
  500. wagtail/contrib/settings/locale/ca/LC_MESSAGES/django.po +1 -1
  501. wagtail/contrib/settings/locale/cs/LC_MESSAGES/django.po +1 -1
  502. wagtail/contrib/settings/locale/cy/LC_MESSAGES/django.po +1 -1
  503. wagtail/contrib/settings/locale/da/LC_MESSAGES/django.po +1 -1
  504. wagtail/contrib/settings/locale/de/LC_MESSAGES/django.mo +0 -0
  505. wagtail/contrib/settings/locale/de/LC_MESSAGES/django.po +7 -3
  506. wagtail/contrib/settings/locale/dv/LC_MESSAGES/django.po +1 -1
  507. wagtail/contrib/settings/locale/el/LC_MESSAGES/django.po +1 -1
  508. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.mo +0 -0
  509. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +2 -2
  510. wagtail/contrib/settings/locale/en_IN/LC_MESSAGES/django.mo +0 -0
  511. wagtail/contrib/settings/locale/en_IN/LC_MESSAGES/django.po +1 -1
  512. wagtail/contrib/settings/locale/es/LC_MESSAGES/django.po +1 -1
  513. wagtail/contrib/settings/locale/es_419/LC_MESSAGES/django.po +1 -1
  514. wagtail/contrib/settings/locale/es_VE/LC_MESSAGES/django.po +1 -1
  515. wagtail/contrib/settings/locale/et/LC_MESSAGES/django.po +1 -1
  516. wagtail/contrib/settings/locale/fa/LC_MESSAGES/django.po +1 -1
  517. wagtail/contrib/settings/locale/fi/LC_MESSAGES/django.po +1 -1
  518. wagtail/contrib/settings/locale/fr/LC_MESSAGES/django.po +1 -1
  519. wagtail/contrib/settings/locale/gl/LC_MESSAGES/django.po +1 -1
  520. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.po +1 -1
  521. wagtail/contrib/settings/locale/hi/LC_MESSAGES/django.po +1 -1
  522. wagtail/contrib/settings/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  523. wagtail/contrib/settings/locale/ht/LC_MESSAGES/django.po +1 -1
  524. wagtail/contrib/settings/locale/hu/LC_MESSAGES/django.po +1 -1
  525. wagtail/contrib/settings/locale/id_ID/LC_MESSAGES/django.po +1 -1
  526. wagtail/contrib/settings/locale/is_IS/LC_MESSAGES/django.po +1 -1
  527. wagtail/contrib/settings/locale/it/LC_MESSAGES/django.mo +0 -0
  528. wagtail/contrib/settings/locale/it/LC_MESSAGES/django.po +7 -3
  529. wagtail/contrib/settings/locale/ja/LC_MESSAGES/django.po +1 -1
  530. wagtail/contrib/settings/locale/ka/LC_MESSAGES/django.mo +0 -0
  531. wagtail/contrib/settings/locale/ka/LC_MESSAGES/django.po +1 -1
  532. wagtail/contrib/settings/locale/ko/LC_MESSAGES/django.po +1 -1
  533. wagtail/contrib/settings/locale/lt/LC_MESSAGES/django.po +1 -1
  534. wagtail/contrib/settings/locale/lv/LC_MESSAGES/django.po +1 -1
  535. wagtail/contrib/settings/locale/mi/LC_MESSAGES/django.po +1 -1
  536. wagtail/contrib/settings/locale/mn/LC_MESSAGES/django.po +1 -1
  537. wagtail/contrib/settings/locale/my/LC_MESSAGES/django.po +1 -1
  538. wagtail/contrib/settings/locale/nb/LC_MESSAGES/django.po +1 -1
  539. wagtail/contrib/settings/locale/nl/LC_MESSAGES/django.po +1 -1
  540. wagtail/contrib/settings/locale/pl/LC_MESSAGES/django.po +1 -1
  541. wagtail/contrib/settings/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  542. wagtail/contrib/settings/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  543. wagtail/contrib/settings/locale/ro/LC_MESSAGES/django.po +1 -1
  544. wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.po +1 -1
  545. wagtail/contrib/settings/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  546. wagtail/contrib/settings/locale/sl/LC_MESSAGES/django.po +1 -1
  547. wagtail/contrib/settings/locale/sr/LC_MESSAGES/django.mo +0 -0
  548. wagtail/contrib/settings/locale/sr/LC_MESSAGES/django.po +1 -1
  549. wagtail/contrib/settings/locale/sv/LC_MESSAGES/django.mo +0 -0
  550. wagtail/contrib/settings/locale/sv/LC_MESSAGES/django.po +4 -3
  551. wagtail/contrib/settings/locale/ta/LC_MESSAGES/django.po +1 -1
  552. wagtail/contrib/settings/locale/tet/LC_MESSAGES/django.po +1 -1
  553. wagtail/contrib/settings/locale/th/LC_MESSAGES/django.po +1 -1
  554. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.po +1 -1
  555. wagtail/contrib/settings/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  556. wagtail/contrib/settings/locale/ug/LC_MESSAGES/django.po +1 -1
  557. wagtail/contrib/settings/locale/uk/LC_MESSAGES/django.po +1 -1
  558. wagtail/contrib/settings/locale/vi/LC_MESSAGES/django.po +1 -1
  559. wagtail/contrib/settings/locale/zh/LC_MESSAGES/django.mo +0 -0
  560. wagtail/contrib/settings/locale/zh/LC_MESSAGES/django.po +1 -1
  561. wagtail/contrib/settings/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  562. wagtail/contrib/settings/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  563. wagtail/contrib/settings/tests/generic/test_admin.py +118 -2
  564. wagtail/contrib/settings/tests/site_specific/test_admin.py +78 -15
  565. wagtail/contrib/settings/tests/site_specific/test_model.py +2 -2
  566. wagtail/contrib/settings/views.py +7 -0
  567. wagtail/contrib/simple_translation/locale/bg/LC_MESSAGES/django.mo +0 -0
  568. wagtail/contrib/simple_translation/locale/bg/LC_MESSAGES/django.po +26 -0
  569. wagtail/contrib/simple_translation/locale/el/LC_MESSAGES/django.mo +0 -0
  570. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.mo +0 -0
  571. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  572. wagtail/contrib/simple_translation/locale/es_419/LC_MESSAGES/django.mo +0 -0
  573. wagtail/contrib/simple_translation/locale/fa/LC_MESSAGES/django.mo +0 -0
  574. wagtail/contrib/simple_translation/locale/it/LC_MESSAGES/django.mo +0 -0
  575. wagtail/contrib/simple_translation/locale/it/LC_MESSAGES/django.po +5 -2
  576. wagtail/contrib/simple_translation/locale/mi/LC_MESSAGES/django.mo +0 -0
  577. wagtail/contrib/simple_translation/locale/mn/LC_MESSAGES/django.mo +0 -0
  578. wagtail/contrib/simple_translation/locale/nb/LC_MESSAGES/django.mo +0 -0
  579. wagtail/contrib/simple_translation/locale/vi/LC_MESSAGES/django.mo +0 -0
  580. wagtail/contrib/simple_translation/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  581. wagtail/contrib/styleguide/locale/af/LC_MESSAGES/django.mo +0 -0
  582. wagtail/contrib/styleguide/locale/af/LC_MESSAGES/django.po +1 -1
  583. wagtail/contrib/styleguide/locale/ar/LC_MESSAGES/django.po +1 -1
  584. wagtail/contrib/styleguide/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  585. wagtail/contrib/styleguide/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  586. wagtail/contrib/styleguide/locale/be/LC_MESSAGES/django.po +1 -1
  587. wagtail/contrib/styleguide/locale/bg/LC_MESSAGES/django.mo +0 -0
  588. wagtail/contrib/styleguide/locale/bg/LC_MESSAGES/django.po +1 -1
  589. wagtail/contrib/styleguide/locale/bn/LC_MESSAGES/django.mo +0 -0
  590. wagtail/contrib/styleguide/locale/bn/LC_MESSAGES/django.po +1 -1
  591. wagtail/contrib/styleguide/locale/ca/LC_MESSAGES/django.po +1 -1
  592. wagtail/contrib/styleguide/locale/cs/LC_MESSAGES/django.po +1 -1
  593. wagtail/contrib/styleguide/locale/cy/LC_MESSAGES/django.po +1 -1
  594. wagtail/contrib/styleguide/locale/da/LC_MESSAGES/django.mo +0 -0
  595. wagtail/contrib/styleguide/locale/da/LC_MESSAGES/django.po +1 -1
  596. wagtail/contrib/styleguide/locale/de/LC_MESSAGES/django.po +1 -1
  597. wagtail/contrib/styleguide/locale/dv/LC_MESSAGES/django.po +1 -1
  598. wagtail/contrib/styleguide/locale/el/LC_MESSAGES/django.po +1 -1
  599. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.mo +0 -0
  600. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  601. wagtail/contrib/styleguide/locale/en_IN/LC_MESSAGES/django.mo +0 -0
  602. wagtail/contrib/styleguide/locale/en_IN/LC_MESSAGES/django.po +1 -1
  603. wagtail/contrib/styleguide/locale/es/LC_MESSAGES/django.po +1 -1
  604. wagtail/contrib/styleguide/locale/es_419/LC_MESSAGES/django.mo +0 -0
  605. wagtail/contrib/styleguide/locale/es_419/LC_MESSAGES/django.po +1 -1
  606. wagtail/contrib/styleguide/locale/es_VE/LC_MESSAGES/django.mo +0 -0
  607. wagtail/contrib/styleguide/locale/es_VE/LC_MESSAGES/django.po +1 -1
  608. wagtail/contrib/styleguide/locale/et/LC_MESSAGES/django.po +1 -1
  609. wagtail/contrib/styleguide/locale/fa/LC_MESSAGES/django.po +1 -1
  610. wagtail/contrib/styleguide/locale/fi/LC_MESSAGES/django.po +1 -1
  611. wagtail/contrib/styleguide/locale/fr/LC_MESSAGES/django.po +1 -1
  612. wagtail/contrib/styleguide/locale/gl/LC_MESSAGES/django.po +1 -1
  613. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  614. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +1 -1
  615. wagtail/contrib/styleguide/locale/hi/LC_MESSAGES/django.mo +0 -0
  616. wagtail/contrib/styleguide/locale/hi/LC_MESSAGES/django.po +1 -1
  617. wagtail/contrib/styleguide/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  618. wagtail/contrib/styleguide/locale/ht/LC_MESSAGES/django.po +1 -1
  619. wagtail/contrib/styleguide/locale/hu/LC_MESSAGES/django.po +1 -1
  620. wagtail/contrib/styleguide/locale/id_ID/LC_MESSAGES/django.po +1 -1
  621. wagtail/contrib/styleguide/locale/is_IS/LC_MESSAGES/django.po +1 -1
  622. wagtail/contrib/styleguide/locale/it/LC_MESSAGES/django.po +1 -1
  623. wagtail/contrib/styleguide/locale/ja/LC_MESSAGES/django.po +1 -1
  624. wagtail/contrib/styleguide/locale/ka/LC_MESSAGES/django.mo +0 -0
  625. wagtail/contrib/styleguide/locale/ka/LC_MESSAGES/django.po +1 -1
  626. wagtail/contrib/styleguide/locale/ko/LC_MESSAGES/django.po +1 -1
  627. wagtail/contrib/styleguide/locale/lt/LC_MESSAGES/django.po +1 -1
  628. wagtail/contrib/styleguide/locale/lv/LC_MESSAGES/django.po +1 -1
  629. wagtail/contrib/styleguide/locale/mi/LC_MESSAGES/django.po +1 -1
  630. wagtail/contrib/styleguide/locale/mn/LC_MESSAGES/django.po +1 -1
  631. wagtail/contrib/styleguide/locale/my/LC_MESSAGES/django.po +1 -1
  632. wagtail/contrib/styleguide/locale/nb/LC_MESSAGES/django.po +1 -1
  633. wagtail/contrib/styleguide/locale/nl/LC_MESSAGES/django.po +1 -1
  634. wagtail/contrib/styleguide/locale/pl/LC_MESSAGES/django.po +1 -1
  635. wagtail/contrib/styleguide/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  636. wagtail/contrib/styleguide/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  637. wagtail/contrib/styleguide/locale/ro/LC_MESSAGES/django.po +1 -1
  638. wagtail/contrib/styleguide/locale/ru/LC_MESSAGES/django.po +1 -1
  639. wagtail/contrib/styleguide/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  640. wagtail/contrib/styleguide/locale/sl/LC_MESSAGES/django.po +1 -1
  641. wagtail/contrib/styleguide/locale/sv/LC_MESSAGES/django.po +1 -1
  642. wagtail/contrib/styleguide/locale/ta/LC_MESSAGES/django.mo +0 -0
  643. wagtail/contrib/styleguide/locale/ta/LC_MESSAGES/django.po +1 -1
  644. wagtail/contrib/styleguide/locale/tet/LC_MESSAGES/django.po +1 -1
  645. wagtail/contrib/styleguide/locale/th/LC_MESSAGES/django.po +1 -1
  646. wagtail/contrib/styleguide/locale/tr/LC_MESSAGES/django.po +1 -1
  647. wagtail/contrib/styleguide/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  648. wagtail/contrib/styleguide/locale/ug/LC_MESSAGES/django.po +1 -1
  649. wagtail/contrib/styleguide/locale/uk/LC_MESSAGES/django.po +1 -1
  650. wagtail/contrib/styleguide/locale/vi/LC_MESSAGES/django.po +1 -1
  651. wagtail/contrib/styleguide/locale/zh/LC_MESSAGES/django.mo +0 -0
  652. wagtail/contrib/styleguide/locale/zh/LC_MESSAGES/django.po +1 -1
  653. wagtail/contrib/styleguide/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  654. wagtail/contrib/styleguide/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  655. wagtail/contrib/styleguide/tests.py +2 -0
  656. wagtail/contrib/styleguide/views.py +4 -5
  657. wagtail/contrib/table_block/locale/ar/LC_MESSAGES/django.mo +0 -0
  658. wagtail/contrib/table_block/locale/ar/LC_MESSAGES/django.po +5 -1
  659. wagtail/contrib/table_block/locale/de/LC_MESSAGES/django.mo +0 -0
  660. wagtail/contrib/table_block/locale/de/LC_MESSAGES/django.po +6 -3
  661. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.mo +0 -0
  662. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  663. wagtail/contrib/table_block/locale/en_IN/LC_MESSAGES/django.mo +0 -0
  664. wagtail/contrib/table_block/locale/et/LC_MESSAGES/django.mo +0 -0
  665. wagtail/contrib/table_block/locale/fa/LC_MESSAGES/django.mo +0 -0
  666. wagtail/contrib/table_block/locale/ht/LC_MESSAGES/django.mo +0 -0
  667. wagtail/contrib/table_block/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  668. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  669. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +5 -2
  670. wagtail/contrib/table_block/locale/ja/LC_MESSAGES/django.mo +0 -0
  671. wagtail/contrib/table_block/locale/lv/LC_MESSAGES/django.mo +0 -0
  672. wagtail/contrib/table_block/locale/mi/LC_MESSAGES/django.mo +0 -0
  673. wagtail/contrib/table_block/locale/mn/LC_MESSAGES/django.mo +0 -0
  674. wagtail/contrib/table_block/locale/my/LC_MESSAGES/django.mo +0 -0
  675. wagtail/contrib/table_block/locale/nb/LC_MESSAGES/django.mo +0 -0
  676. wagtail/contrib/table_block/locale/ru/LC_MESSAGES/django.mo +0 -0
  677. wagtail/contrib/table_block/locale/ru/LC_MESSAGES/django.po +6 -3
  678. wagtail/contrib/table_block/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  679. wagtail/contrib/table_block/locale/tet/LC_MESSAGES/django.mo +0 -0
  680. wagtail/contrib/table_block/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  681. wagtail/contrib/table_block/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  682. wagtail/contrib/typed_table_block/blocks.py +37 -0
  683. wagtail/contrib/typed_table_block/locale/ar/LC_MESSAGES/django.po +1 -1
  684. wagtail/contrib/typed_table_block/locale/be/LC_MESSAGES/django.po +1 -1
  685. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +1 -1
  686. wagtail/contrib/typed_table_block/locale/cy/LC_MESSAGES/django.po +1 -1
  687. wagtail/contrib/typed_table_block/locale/de/LC_MESSAGES/django.po +1 -1
  688. wagtail/contrib/typed_table_block/locale/dv/LC_MESSAGES/django.mo +0 -0
  689. wagtail/contrib/typed_table_block/locale/dv/LC_MESSAGES/django.po +1 -1
  690. wagtail/contrib/typed_table_block/locale/el/LC_MESSAGES/django.po +1 -1
  691. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.mo +0 -0
  692. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  693. wagtail/contrib/typed_table_block/locale/es/LC_MESSAGES/django.po +1 -1
  694. wagtail/contrib/typed_table_block/locale/fa/LC_MESSAGES/django.po +1 -1
  695. wagtail/contrib/typed_table_block/locale/fi/LC_MESSAGES/django.po +1 -1
  696. wagtail/contrib/typed_table_block/locale/fr/LC_MESSAGES/django.po +1 -1
  697. wagtail/contrib/typed_table_block/locale/gl/LC_MESSAGES/django.po +1 -1
  698. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +1 -1
  699. wagtail/contrib/typed_table_block/locale/is_IS/LC_MESSAGES/django.po +1 -1
  700. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +1 -1
  701. wagtail/contrib/typed_table_block/locale/ko/LC_MESSAGES/django.po +1 -1
  702. wagtail/contrib/typed_table_block/locale/lt/LC_MESSAGES/django.po +1 -1
  703. wagtail/contrib/typed_table_block/locale/nl/LC_MESSAGES/django.po +1 -1
  704. wagtail/contrib/typed_table_block/locale/pl/LC_MESSAGES/django.po +1 -1
  705. wagtail/contrib/typed_table_block/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  706. wagtail/contrib/typed_table_block/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  707. wagtail/contrib/typed_table_block/locale/ro/LC_MESSAGES/django.po +1 -1
  708. wagtail/contrib/typed_table_block/locale/ru/LC_MESSAGES/django.po +1 -1
  709. wagtail/contrib/typed_table_block/locale/sl/LC_MESSAGES/django.po +1 -1
  710. wagtail/contrib/typed_table_block/locale/sv/LC_MESSAGES/django.mo +0 -0
  711. wagtail/contrib/typed_table_block/locale/sv/LC_MESSAGES/django.po +5 -4
  712. wagtail/contrib/typed_table_block/locale/th/LC_MESSAGES/django.mo +0 -0
  713. wagtail/contrib/typed_table_block/locale/th/LC_MESSAGES/django.po +1 -1
  714. wagtail/contrib/typed_table_block/locale/tr/LC_MESSAGES/django.po +1 -1
  715. wagtail/contrib/typed_table_block/locale/ug/LC_MESSAGES/django.po +1 -1
  716. wagtail/contrib/typed_table_block/locale/uk/LC_MESSAGES/django.po +1 -1
  717. wagtail/contrib/typed_table_block/locale/zh/LC_MESSAGES/django.po +1 -1
  718. wagtail/contrib/typed_table_block/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  719. wagtail/contrib/typed_table_block/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  720. wagtail/contrib/typed_table_block/tests.py +108 -0
  721. wagtail/coreutils.py +4 -4
  722. wagtail/documents/__init__.py +4 -4
  723. wagtail/documents/locale/af/LC_MESSAGES/django.mo +0 -0
  724. wagtail/documents/locale/af/LC_MESSAGES/django.po +1 -1
  725. wagtail/documents/locale/ar/LC_MESSAGES/django.po +1 -1
  726. wagtail/documents/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  727. wagtail/documents/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  728. wagtail/documents/locale/be/LC_MESSAGES/django.po +1 -1
  729. wagtail/documents/locale/bg/LC_MESSAGES/django.mo +0 -0
  730. wagtail/documents/locale/bg/LC_MESSAGES/django.po +10 -1
  731. wagtail/documents/locale/bn/LC_MESSAGES/django.mo +0 -0
  732. wagtail/documents/locale/bn/LC_MESSAGES/django.po +1 -1
  733. wagtail/documents/locale/ca/LC_MESSAGES/django.po +1 -1
  734. wagtail/documents/locale/cs/LC_MESSAGES/django.po +1 -1
  735. wagtail/documents/locale/cy/LC_MESSAGES/django.po +1 -1
  736. wagtail/documents/locale/da/LC_MESSAGES/django.po +1 -1
  737. wagtail/documents/locale/de/LC_MESSAGES/django.mo +0 -0
  738. wagtail/documents/locale/de/LC_MESSAGES/django.po +18 -3
  739. wagtail/documents/locale/dv/LC_MESSAGES/django.po +1 -1
  740. wagtail/documents/locale/el/LC_MESSAGES/django.po +1 -1
  741. wagtail/documents/locale/en/LC_MESSAGES/django.mo +0 -0
  742. wagtail/documents/locale/en/LC_MESSAGES/django.po +15 -15
  743. wagtail/documents/locale/es/LC_MESSAGES/django.po +1 -1
  744. wagtail/documents/locale/es_419/LC_MESSAGES/django.po +1 -1
  745. wagtail/documents/locale/et/LC_MESSAGES/django.po +1 -1
  746. wagtail/documents/locale/eu/LC_MESSAGES/django.mo +0 -0
  747. wagtail/documents/locale/eu/LC_MESSAGES/django.po +1 -1
  748. wagtail/documents/locale/fa/LC_MESSAGES/django.po +1 -1
  749. wagtail/documents/locale/fi/LC_MESSAGES/django.po +1 -1
  750. wagtail/documents/locale/fr/LC_MESSAGES/django.po +1 -1
  751. wagtail/documents/locale/gl/LC_MESSAGES/django.po +1 -1
  752. wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +1 -1
  753. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  754. wagtail/documents/locale/ht/LC_MESSAGES/django.mo +0 -0
  755. wagtail/documents/locale/ht/LC_MESSAGES/django.po +1 -1
  756. wagtail/documents/locale/hu/LC_MESSAGES/django.po +1 -1
  757. wagtail/documents/locale/id_ID/LC_MESSAGES/django.po +1 -1
  758. wagtail/documents/locale/is_IS/LC_MESSAGES/django.po +1 -1
  759. wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
  760. wagtail/documents/locale/it/LC_MESSAGES/django.po +33 -3
  761. wagtail/documents/locale/ja/LC_MESSAGES/django.po +1 -1
  762. wagtail/documents/locale/ka/LC_MESSAGES/django.po +1 -1
  763. wagtail/documents/locale/ko/LC_MESSAGES/django.po +1 -1
  764. wagtail/documents/locale/lt/LC_MESSAGES/django.po +1 -1
  765. wagtail/documents/locale/lv/LC_MESSAGES/django.po +1 -1
  766. wagtail/documents/locale/mi/LC_MESSAGES/django.po +1 -1
  767. wagtail/documents/locale/mn/LC_MESSAGES/django.po +1 -1
  768. wagtail/documents/locale/my/LC_MESSAGES/django.po +1 -1
  769. wagtail/documents/locale/nb/LC_MESSAGES/django.po +1 -1
  770. wagtail/documents/locale/nl/LC_MESSAGES/django.po +1 -1
  771. wagtail/documents/locale/pl/LC_MESSAGES/django.po +1 -1
  772. wagtail/documents/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  773. wagtail/documents/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  774. wagtail/documents/locale/ro/LC_MESSAGES/django.po +1 -1
  775. wagtail/documents/locale/ru/LC_MESSAGES/django.mo +0 -0
  776. wagtail/documents/locale/ru/LC_MESSAGES/django.po +7 -3
  777. wagtail/documents/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  778. wagtail/documents/locale/sl/LC_MESSAGES/django.po +1 -1
  779. wagtail/documents/locale/sv/LC_MESSAGES/django.mo +0 -0
  780. wagtail/documents/locale/sv/LC_MESSAGES/django.po +33 -5
  781. wagtail/documents/locale/tet/LC_MESSAGES/django.po +1 -1
  782. wagtail/documents/locale/th/LC_MESSAGES/django.po +1 -1
  783. wagtail/documents/locale/tr/LC_MESSAGES/django.po +1 -1
  784. wagtail/documents/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  785. wagtail/documents/locale/ug/LC_MESSAGES/django.po +1 -1
  786. wagtail/documents/locale/uk/LC_MESSAGES/django.po +1 -1
  787. wagtail/documents/locale/vi/LC_MESSAGES/django.po +1 -1
  788. wagtail/documents/locale/zh/LC_MESSAGES/django.po +1 -1
  789. wagtail/documents/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  790. wagtail/documents/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  791. wagtail/documents/models.py +1 -1
  792. wagtail/documents/tests/test_admin_views.py +19 -4
  793. wagtail/documents/tests/test_search.py +0 -2
  794. wagtail/documents/tests/test_views.py +6 -4
  795. wagtail/documents/views/bulk_actions/add_tags.py +1 -1
  796. wagtail/embeds/finders/facebook.py +3 -3
  797. wagtail/embeds/finders/instagram.py +3 -3
  798. wagtail/embeds/finders/oembed.py +7 -2
  799. wagtail/embeds/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  800. wagtail/embeds/locale/bn/LC_MESSAGES/django.mo +0 -0
  801. wagtail/embeds/locale/da/LC_MESSAGES/django.mo +0 -0
  802. wagtail/embeds/locale/dv/LC_MESSAGES/django.mo +0 -0
  803. wagtail/embeds/locale/en/LC_MESSAGES/django.mo +0 -0
  804. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  805. wagtail/embeds/locale/es_419/LC_MESSAGES/django.mo +0 -0
  806. wagtail/embeds/locale/lv/LC_MESSAGES/django.mo +0 -0
  807. wagtail/embeds/locale/my/LC_MESSAGES/django.mo +0 -0
  808. wagtail/embeds/oembed_providers.py +8 -0
  809. wagtail/embeds/tests/test_embeds.py +35 -0
  810. wagtail/images/__init__.py +4 -4
  811. wagtail/images/admin_urls.py +3 -3
  812. wagtail/images/blocks.py +1 -1
  813. wagtail/images/formats.py +2 -2
  814. wagtail/images/image_operations.py +2 -2
  815. wagtail/images/locale/ar/LC_MESSAGES/django.po +1 -1
  816. wagtail/images/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  817. wagtail/images/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  818. wagtail/images/locale/be/LC_MESSAGES/django.po +1 -1
  819. wagtail/images/locale/bg/LC_MESSAGES/django.mo +0 -0
  820. wagtail/images/locale/bg/LC_MESSAGES/django.po +13 -1
  821. wagtail/images/locale/bn/LC_MESSAGES/django.po +1 -1
  822. wagtail/images/locale/ca/LC_MESSAGES/django.mo +0 -0
  823. wagtail/images/locale/ca/LC_MESSAGES/django.po +6 -3
  824. wagtail/images/locale/cs/LC_MESSAGES/django.po +1 -1
  825. wagtail/images/locale/cy/LC_MESSAGES/django.po +1 -1
  826. wagtail/images/locale/da/LC_MESSAGES/django.po +1 -1
  827. wagtail/images/locale/de/LC_MESSAGES/django.mo +0 -0
  828. wagtail/images/locale/de/LC_MESSAGES/django.po +30 -3
  829. wagtail/images/locale/dv/LC_MESSAGES/django.po +1 -1
  830. wagtail/images/locale/el/LC_MESSAGES/django.po +1 -1
  831. wagtail/images/locale/en/LC_MESSAGES/django.mo +0 -0
  832. wagtail/images/locale/en/LC_MESSAGES/django.po +44 -40
  833. wagtail/images/locale/es/LC_MESSAGES/django.po +1 -1
  834. wagtail/images/locale/es_419/LC_MESSAGES/django.po +1 -1
  835. wagtail/images/locale/et/LC_MESSAGES/django.po +1 -1
  836. wagtail/images/locale/eu/LC_MESSAGES/django.mo +0 -0
  837. wagtail/images/locale/eu/LC_MESSAGES/django.po +1 -1
  838. wagtail/images/locale/fa/LC_MESSAGES/django.po +1 -1
  839. wagtail/images/locale/fi/LC_MESSAGES/django.po +1 -1
  840. wagtail/images/locale/fr/LC_MESSAGES/django.mo +0 -0
  841. wagtail/images/locale/fr/LC_MESSAGES/django.po +6 -3
  842. wagtail/images/locale/gl/LC_MESSAGES/django.mo +0 -0
  843. wagtail/images/locale/gl/LC_MESSAGES/django.po +6 -3
  844. wagtail/images/locale/he_IL/LC_MESSAGES/django.po +1 -1
  845. wagtail/images/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  846. wagtail/images/locale/ht/LC_MESSAGES/django.mo +0 -0
  847. wagtail/images/locale/ht/LC_MESSAGES/django.po +1 -1
  848. wagtail/images/locale/hu/LC_MESSAGES/django.po +1 -1
  849. wagtail/images/locale/id_ID/LC_MESSAGES/django.po +1 -1
  850. wagtail/images/locale/is_IS/LC_MESSAGES/django.po +1 -1
  851. wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
  852. wagtail/images/locale/it/LC_MESSAGES/django.po +54 -5
  853. wagtail/images/locale/ja/LC_MESSAGES/django.po +1 -1
  854. wagtail/images/locale/ka/LC_MESSAGES/django.po +1 -1
  855. wagtail/images/locale/ko/LC_MESSAGES/django.po +1 -1
  856. wagtail/images/locale/lt/LC_MESSAGES/django.po +1 -1
  857. wagtail/images/locale/lv/LC_MESSAGES/django.po +1 -1
  858. wagtail/images/locale/mi/LC_MESSAGES/django.po +1 -1
  859. wagtail/images/locale/mn/LC_MESSAGES/django.po +1 -1
  860. wagtail/images/locale/my/LC_MESSAGES/django.po +1 -1
  861. wagtail/images/locale/nb/LC_MESSAGES/django.po +1 -1
  862. wagtail/images/locale/nl/LC_MESSAGES/django.mo +0 -0
  863. wagtail/images/locale/nl/LC_MESSAGES/django.po +9 -6
  864. wagtail/images/locale/pl/LC_MESSAGES/django.po +1 -1
  865. wagtail/images/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  866. wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  867. wagtail/images/locale/ro/LC_MESSAGES/django.po +1 -1
  868. wagtail/images/locale/ru/LC_MESSAGES/django.mo +0 -0
  869. wagtail/images/locale/ru/LC_MESSAGES/django.po +15 -3
  870. wagtail/images/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  871. wagtail/images/locale/sl/LC_MESSAGES/django.po +1 -1
  872. wagtail/images/locale/sv/LC_MESSAGES/django.mo +0 -0
  873. wagtail/images/locale/sv/LC_MESSAGES/django.po +50 -7
  874. wagtail/images/locale/tet/LC_MESSAGES/django.po +1 -1
  875. wagtail/images/locale/th/LC_MESSAGES/django.po +1 -1
  876. wagtail/images/locale/tr/LC_MESSAGES/django.po +1 -1
  877. wagtail/images/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  878. wagtail/images/locale/ug/LC_MESSAGES/django.po +1 -1
  879. wagtail/images/locale/uk/LC_MESSAGES/django.po +1 -1
  880. wagtail/images/locale/vi/LC_MESSAGES/django.po +1 -1
  881. wagtail/images/locale/zh/LC_MESSAGES/django.po +1 -1
  882. wagtail/images/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  883. wagtail/images/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  884. wagtail/images/models.py +11 -10
  885. wagtail/images/templates/wagtailimages/images/index_results.html +1 -1
  886. wagtail/images/templates/wagtailimages/images/url_generator.html +17 -38
  887. wagtail/images/templates/wagtailimages/images/url_generator_output.html +28 -0
  888. wagtail/images/templatetags/wagtailimages_tags.py +4 -4
  889. wagtail/images/tests/test_admin_views.py +432 -59
  890. wagtail/images/tests/test_image_operations.py +2 -2
  891. wagtail/images/tests/test_models.py +0 -2
  892. wagtail/images/views/bulk_actions/add_tags.py +1 -1
  893. wagtail/images/views/images.py +72 -39
  894. wagtail/locale/ar/LC_MESSAGES/django.mo +0 -0
  895. wagtail/locale/ar/LC_MESSAGES/django.po +10 -19
  896. wagtail/locale/az_AZ/LC_MESSAGES/django.mo +0 -0
  897. wagtail/locale/az_AZ/LC_MESSAGES/django.po +4 -4
  898. wagtail/locale/be/LC_MESSAGES/django.mo +0 -0
  899. wagtail/locale/be/LC_MESSAGES/django.po +7 -19
  900. wagtail/locale/bg/LC_MESSAGES/django.mo +0 -0
  901. wagtail/locale/bg/LC_MESSAGES/django.po +35 -11
  902. wagtail/locale/bn/LC_MESSAGES/django.po +4 -4
  903. wagtail/locale/ca/LC_MESSAGES/django.mo +0 -0
  904. wagtail/locale/ca/LC_MESSAGES/django.po +24 -21
  905. wagtail/locale/cs/LC_MESSAGES/django.mo +0 -0
  906. wagtail/locale/cs/LC_MESSAGES/django.po +7 -19
  907. wagtail/locale/cy/LC_MESSAGES/django.mo +0 -0
  908. wagtail/locale/cy/LC_MESSAGES/django.po +10 -13
  909. wagtail/locale/da/LC_MESSAGES/django.mo +0 -0
  910. wagtail/locale/da/LC_MESSAGES/django.po +7 -16
  911. wagtail/locale/de/LC_MESSAGES/django.mo +0 -0
  912. wagtail/locale/de/LC_MESSAGES/django.po +41 -21
  913. wagtail/locale/dv/LC_MESSAGES/django.mo +0 -0
  914. wagtail/locale/dv/LC_MESSAGES/django.po +7 -19
  915. wagtail/locale/el/LC_MESSAGES/django.mo +0 -0
  916. wagtail/locale/el/LC_MESSAGES/django.po +10 -19
  917. wagtail/locale/en/LC_MESSAGES/django.mo +0 -0
  918. wagtail/locale/en/LC_MESSAGES/django.po +103 -105
  919. wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
  920. wagtail/locale/es/LC_MESSAGES/django.po +10 -19
  921. wagtail/locale/es_419/LC_MESSAGES/django.po +6 -6
  922. wagtail/locale/et/LC_MESSAGES/django.mo +0 -0
  923. wagtail/locale/et/LC_MESSAGES/django.po +7 -16
  924. wagtail/locale/eu/LC_MESSAGES/django.mo +0 -0
  925. wagtail/locale/eu/LC_MESSAGES/django.po +4 -10
  926. wagtail/locale/fa/LC_MESSAGES/django.mo +0 -0
  927. wagtail/locale/fa/LC_MESSAGES/django.po +10 -16
  928. wagtail/locale/fi/LC_MESSAGES/django.mo +0 -0
  929. wagtail/locale/fi/LC_MESSAGES/django.po +10 -19
  930. wagtail/locale/fr/LC_MESSAGES/django.mo +0 -0
  931. wagtail/locale/fr/LC_MESSAGES/django.po +24 -21
  932. wagtail/locale/gl/LC_MESSAGES/django.mo +0 -0
  933. wagtail/locale/gl/LC_MESSAGES/django.po +24 -21
  934. wagtail/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  935. wagtail/locale/he_IL/LC_MESSAGES/django.po +10 -16
  936. wagtail/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  937. wagtail/locale/hr_HR/LC_MESSAGES/django.po +7 -16
  938. wagtail/locale/hu/LC_MESSAGES/django.mo +0 -0
  939. wagtail/locale/hu/LC_MESSAGES/django.po +10 -19
  940. wagtail/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  941. wagtail/locale/id_ID/LC_MESSAGES/django.po +7 -16
  942. wagtail/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  943. wagtail/locale/is_IS/LC_MESSAGES/django.po +10 -19
  944. wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
  945. wagtail/locale/it/LC_MESSAGES/django.po +126 -21
  946. wagtail/locale/ja/LC_MESSAGES/django.mo +0 -0
  947. wagtail/locale/ja/LC_MESSAGES/django.po +10 -19
  948. wagtail/locale/ka/LC_MESSAGES/django.mo +0 -0
  949. wagtail/locale/ka/LC_MESSAGES/django.po +9 -6
  950. wagtail/locale/ko/LC_MESSAGES/django.mo +0 -0
  951. wagtail/locale/ko/LC_MESSAGES/django.po +10 -19
  952. wagtail/locale/lt/LC_MESSAGES/django.mo +0 -0
  953. wagtail/locale/lt/LC_MESSAGES/django.po +7 -19
  954. wagtail/locale/lv/LC_MESSAGES/django.mo +0 -0
  955. wagtail/locale/lv/LC_MESSAGES/django.po +10 -19
  956. wagtail/locale/mi/LC_MESSAGES/django.mo +0 -0
  957. wagtail/locale/mi/LC_MESSAGES/django.po +7 -13
  958. wagtail/locale/mn/LC_MESSAGES/django.mo +0 -0
  959. wagtail/locale/mn/LC_MESSAGES/django.po +7 -16
  960. wagtail/locale/my/LC_MESSAGES/django.po +6 -6
  961. wagtail/locale/nb/LC_MESSAGES/django.mo +0 -0
  962. wagtail/locale/nb/LC_MESSAGES/django.po +10 -16
  963. wagtail/locale/nl/LC_MESSAGES/django.mo +0 -0
  964. wagtail/locale/nl/LC_MESSAGES/django.po +22 -21
  965. wagtail/locale/pl/LC_MESSAGES/django.mo +0 -0
  966. wagtail/locale/pl/LC_MESSAGES/django.po +10 -19
  967. wagtail/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  968. wagtail/locale/pt_BR/LC_MESSAGES/django.po +10 -19
  969. wagtail/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  970. wagtail/locale/pt_PT/LC_MESSAGES/django.po +10 -19
  971. wagtail/locale/ro/LC_MESSAGES/django.mo +0 -0
  972. wagtail/locale/ro/LC_MESSAGES/django.po +10 -19
  973. wagtail/locale/ru/LC_MESSAGES/django.mo +0 -0
  974. wagtail/locale/ru/LC_MESSAGES/django.po +32 -21
  975. wagtail/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  976. wagtail/locale/sk_SK/LC_MESSAGES/django.po +10 -16
  977. wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
  978. wagtail/locale/sl/LC_MESSAGES/django.po +10 -19
  979. wagtail/locale/sv/LC_MESSAGES/django.mo +0 -0
  980. wagtail/locale/sv/LC_MESSAGES/django.po +105 -31
  981. wagtail/locale/tet/LC_MESSAGES/django.mo +0 -0
  982. wagtail/locale/tet/LC_MESSAGES/django.po +7 -16
  983. wagtail/locale/th/LC_MESSAGES/django.mo +0 -0
  984. wagtail/locale/th/LC_MESSAGES/django.po +7 -19
  985. wagtail/locale/tr/LC_MESSAGES/django.mo +0 -0
  986. wagtail/locale/tr/LC_MESSAGES/django.po +10 -19
  987. wagtail/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  988. wagtail/locale/tr_TR/LC_MESSAGES/django.po +10 -16
  989. wagtail/locale/ug/LC_MESSAGES/django.mo +0 -0
  990. wagtail/locale/ug/LC_MESSAGES/django.po +10 -19
  991. wagtail/locale/uk/LC_MESSAGES/django.mo +0 -0
  992. wagtail/locale/uk/LC_MESSAGES/django.po +7 -19
  993. wagtail/locale/vi/LC_MESSAGES/django.po +7 -7
  994. wagtail/locale/zh/LC_MESSAGES/django.mo +0 -0
  995. wagtail/locale/zh/LC_MESSAGES/django.po +6 -15
  996. wagtail/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  997. wagtail/locale/zh_Hans/LC_MESSAGES/django.po +10 -19
  998. wagtail/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  999. wagtail/locale/zh_Hant/LC_MESSAGES/django.po +7 -19
  1000. wagtail/locales/locale/bg/LC_MESSAGES/django.mo +0 -0
  1001. wagtail/locales/locale/bg/LC_MESSAGES/django.po +9 -2
  1002. wagtail/locales/locale/da/LC_MESSAGES/django.mo +0 -0
  1003. wagtail/locales/locale/el/LC_MESSAGES/django.mo +0 -0
  1004. wagtail/locales/locale/en/LC_MESSAGES/django.mo +0 -0
  1005. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  1006. wagtail/locales/locale/et/LC_MESSAGES/django.mo +0 -0
  1007. wagtail/locales/locale/fa/LC_MESSAGES/django.mo +0 -0
  1008. wagtail/locales/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  1009. wagtail/locales/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  1010. wagtail/locales/locale/it/LC_MESSAGES/django.mo +0 -0
  1011. wagtail/locales/locale/it/LC_MESSAGES/django.po +13 -2
  1012. wagtail/locales/locale/ja/LC_MESSAGES/django.mo +0 -0
  1013. wagtail/locales/locale/lv/LC_MESSAGES/django.mo +0 -0
  1014. wagtail/locales/locale/mn/LC_MESSAGES/django.mo +0 -0
  1015. wagtail/locales/locale/my/LC_MESSAGES/django.mo +0 -0
  1016. wagtail/locales/locale/nb/LC_MESSAGES/django.mo +0 -0
  1017. wagtail/locales/locale/ru/LC_MESSAGES/django.mo +0 -0
  1018. wagtail/locales/locale/ru/LC_MESSAGES/django.po +7 -2
  1019. wagtail/locales/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  1020. wagtail/locales/locale/sv/LC_MESSAGES/django.mo +0 -0
  1021. wagtail/locales/locale/sv/LC_MESSAGES/django.po +4 -3
  1022. wagtail/locales/locale/tet/LC_MESSAGES/django.mo +0 -0
  1023. wagtail/locales/locale/th/LC_MESSAGES/django.mo +0 -0
  1024. wagtail/locales/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  1025. wagtail/locales/locale/vi/LC_MESSAGES/django.mo +0 -0
  1026. wagtail/locales/locale/zh/LC_MESSAGES/django.mo +0 -0
  1027. wagtail/locales/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  1028. wagtail/locales/tests.py +5 -5
  1029. wagtail/models/i18n.py +4 -6
  1030. wagtail/models/media.py +18 -0
  1031. wagtail/models/pages.py +65 -11
  1032. wagtail/models/reference_index.py +15 -0
  1033. wagtail/models/revisions.py +40 -12
  1034. wagtail/models/workflows.py +0 -3
  1035. wagtail/permission_policies/base.py +2 -2
  1036. wagtail/permission_policies/collections.py +2 -2
  1037. wagtail/project_template/requirements.txt +2 -2
  1038. wagtail/search/locale/ar/LC_MESSAGES/django.mo +0 -0
  1039. wagtail/search/locale/be/LC_MESSAGES/django.mo +0 -0
  1040. wagtail/search/locale/ca/LC_MESSAGES/django.mo +0 -0
  1041. wagtail/search/locale/cs/LC_MESSAGES/django.mo +0 -0
  1042. wagtail/search/locale/cy/LC_MESSAGES/django.mo +0 -0
  1043. wagtail/search/locale/de/LC_MESSAGES/django.mo +0 -0
  1044. wagtail/search/locale/dv/LC_MESSAGES/django.mo +0 -0
  1045. wagtail/search/locale/en/LC_MESSAGES/django.mo +0 -0
  1046. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  1047. wagtail/search/locale/es/LC_MESSAGES/django.mo +0 -0
  1048. wagtail/search/locale/et/LC_MESSAGES/django.mo +0 -0
  1049. wagtail/search/locale/fa/LC_MESSAGES/django.mo +0 -0
  1050. wagtail/search/locale/fi/LC_MESSAGES/django.mo +0 -0
  1051. wagtail/search/locale/fr/LC_MESSAGES/django.mo +0 -0
  1052. wagtail/search/locale/gl/LC_MESSAGES/django.mo +0 -0
  1053. wagtail/search/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  1054. wagtail/search/locale/ht/LC_MESSAGES/django.mo +0 -0
  1055. wagtail/search/locale/hu/LC_MESSAGES/django.mo +0 -0
  1056. wagtail/search/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  1057. wagtail/search/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  1058. wagtail/search/locale/it/LC_MESSAGES/django.mo +0 -0
  1059. wagtail/search/locale/ja/LC_MESSAGES/django.mo +0 -0
  1060. wagtail/search/locale/ko/LC_MESSAGES/django.mo +0 -0
  1061. wagtail/search/locale/lt/LC_MESSAGES/django.mo +0 -0
  1062. wagtail/search/locale/mi/LC_MESSAGES/django.mo +0 -0
  1063. wagtail/search/locale/mn/LC_MESSAGES/django.mo +0 -0
  1064. wagtail/search/locale/my/LC_MESSAGES/django.mo +0 -0
  1065. wagtail/search/locale/nb/LC_MESSAGES/django.mo +0 -0
  1066. wagtail/search/locale/nl/LC_MESSAGES/django.mo +0 -0
  1067. wagtail/search/locale/pl/LC_MESSAGES/django.mo +0 -0
  1068. wagtail/search/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  1069. wagtail/search/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  1070. wagtail/search/locale/ro/LC_MESSAGES/django.mo +0 -0
  1071. wagtail/search/locale/ru/LC_MESSAGES/django.mo +0 -0
  1072. wagtail/search/locale/sl/LC_MESSAGES/django.mo +0 -0
  1073. wagtail/search/locale/sv/LC_MESSAGES/django.mo +0 -0
  1074. wagtail/search/locale/tet/LC_MESSAGES/django.mo +0 -0
  1075. wagtail/search/locale/th/LC_MESSAGES/django.mo +0 -0
  1076. wagtail/search/locale/tr/LC_MESSAGES/django.mo +0 -0
  1077. wagtail/search/locale/tr_TR/LC_MESSAGES/django.mo +0 -0
  1078. wagtail/search/locale/ug/LC_MESSAGES/django.mo +0 -0
  1079. wagtail/search/locale/uk/LC_MESSAGES/django.mo +0 -0
  1080. wagtail/search/locale/vi/LC_MESSAGES/django.mo +0 -0
  1081. wagtail/search/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  1082. wagtail/search/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  1083. wagtail/signal_handlers.py +1 -0
  1084. wagtail/sites/locale/bn/LC_MESSAGES/django.mo +0 -0
  1085. wagtail/sites/locale/da/LC_MESSAGES/django.mo +0 -0
  1086. wagtail/sites/locale/dv/LC_MESSAGES/django.mo +0 -0
  1087. wagtail/sites/locale/en/LC_MESSAGES/django.mo +0 -0
  1088. wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
  1089. wagtail/sites/locale/en_IN/LC_MESSAGES/django.mo +0 -0
  1090. wagtail/sites/locale/es_419/LC_MESSAGES/django.mo +0 -0
  1091. wagtail/sites/locale/es_VE/LC_MESSAGES/django.mo +0 -0
  1092. wagtail/sites/locale/hi/LC_MESSAGES/django.mo +0 -0
  1093. wagtail/sites/locale/ka/LC_MESSAGES/django.mo +0 -0
  1094. wagtail/sites/locale/sr/LC_MESSAGES/django.mo +0 -0
  1095. wagtail/sites/locale/sv/LC_MESSAGES/django.mo +0 -0
  1096. wagtail/sites/locale/sv/LC_MESSAGES/django.po +3 -2
  1097. wagtail/sites/locale/ta/LC_MESSAGES/django.mo +0 -0
  1098. wagtail/sites/tests.py +7 -7
  1099. wagtail/snippets/action_menu.py +2 -1
  1100. wagtail/snippets/locale/af/LC_MESSAGES/django.mo +0 -0
  1101. wagtail/snippets/locale/af/LC_MESSAGES/django.po +1 -1
  1102. wagtail/snippets/locale/ar/LC_MESSAGES/django.po +1 -1
  1103. wagtail/snippets/locale/az_AZ/LC_MESSAGES/django.po +1 -1
  1104. wagtail/snippets/locale/be/LC_MESSAGES/django.po +1 -1
  1105. wagtail/snippets/locale/bg/LC_MESSAGES/django.mo +0 -0
  1106. wagtail/snippets/locale/bg/LC_MESSAGES/django.po +10 -1
  1107. wagtail/snippets/locale/bn/LC_MESSAGES/django.po +1 -1
  1108. wagtail/snippets/locale/ca/LC_MESSAGES/django.mo +0 -0
  1109. wagtail/snippets/locale/ca/LC_MESSAGES/django.po +11 -3
  1110. wagtail/snippets/locale/cs/LC_MESSAGES/django.po +1 -1
  1111. wagtail/snippets/locale/cy/LC_MESSAGES/django.po +1 -1
  1112. wagtail/snippets/locale/da/LC_MESSAGES/django.po +1 -1
  1113. wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
  1114. wagtail/snippets/locale/de/LC_MESSAGES/django.po +15 -3
  1115. wagtail/snippets/locale/dv/LC_MESSAGES/django.po +1 -1
  1116. wagtail/snippets/locale/el/LC_MESSAGES/django.po +1 -1
  1117. wagtail/snippets/locale/en/LC_MESSAGES/django.mo +0 -0
  1118. wagtail/snippets/locale/en/LC_MESSAGES/django.po +23 -13
  1119. wagtail/snippets/locale/en_IN/LC_MESSAGES/django.mo +0 -0
  1120. wagtail/snippets/locale/en_IN/LC_MESSAGES/django.po +1 -1
  1121. wagtail/snippets/locale/es/LC_MESSAGES/django.po +1 -1
  1122. wagtail/snippets/locale/es_419/LC_MESSAGES/django.po +1 -1
  1123. wagtail/snippets/locale/es_VE/LC_MESSAGES/django.po +1 -1
  1124. wagtail/snippets/locale/et/LC_MESSAGES/django.po +1 -1
  1125. wagtail/snippets/locale/eu/LC_MESSAGES/django.mo +0 -0
  1126. wagtail/snippets/locale/eu/LC_MESSAGES/django.po +1 -1
  1127. wagtail/snippets/locale/fa/LC_MESSAGES/django.po +1 -1
  1128. wagtail/snippets/locale/fi/LC_MESSAGES/django.po +1 -1
  1129. wagtail/snippets/locale/fr/LC_MESSAGES/django.mo +0 -0
  1130. wagtail/snippets/locale/fr/LC_MESSAGES/django.po +11 -3
  1131. wagtail/snippets/locale/gl/LC_MESSAGES/django.mo +0 -0
  1132. wagtail/snippets/locale/gl/LC_MESSAGES/django.po +9 -1
  1133. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +1 -1
  1134. wagtail/snippets/locale/hi/LC_MESSAGES/django.mo +0 -0
  1135. wagtail/snippets/locale/hi/LC_MESSAGES/django.po +1 -1
  1136. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  1137. wagtail/snippets/locale/ht/LC_MESSAGES/django.mo +0 -0
  1138. wagtail/snippets/locale/ht/LC_MESSAGES/django.po +1 -1
  1139. wagtail/snippets/locale/hu/LC_MESSAGES/django.po +1 -1
  1140. wagtail/snippets/locale/id_ID/LC_MESSAGES/django.po +1 -1
  1141. wagtail/snippets/locale/is_IS/LC_MESSAGES/django.po +1 -1
  1142. wagtail/snippets/locale/it/LC_MESSAGES/django.mo +0 -0
  1143. wagtail/snippets/locale/it/LC_MESSAGES/django.po +11 -1
  1144. wagtail/snippets/locale/ja/LC_MESSAGES/django.po +1 -1
  1145. wagtail/snippets/locale/ka/LC_MESSAGES/django.mo +0 -0
  1146. wagtail/snippets/locale/ka/LC_MESSAGES/django.po +1 -1
  1147. wagtail/snippets/locale/ko/LC_MESSAGES/django.po +1 -1
  1148. wagtail/snippets/locale/lt/LC_MESSAGES/django.po +1 -1
  1149. wagtail/snippets/locale/lv/LC_MESSAGES/django.po +1 -1
  1150. wagtail/snippets/locale/mi/LC_MESSAGES/django.po +1 -1
  1151. wagtail/snippets/locale/mn/LC_MESSAGES/django.po +1 -1
  1152. wagtail/snippets/locale/my/LC_MESSAGES/django.po +1 -1
  1153. wagtail/snippets/locale/nb/LC_MESSAGES/django.po +1 -1
  1154. wagtail/snippets/locale/nl/LC_MESSAGES/django.mo +0 -0
  1155. wagtail/snippets/locale/nl/LC_MESSAGES/django.po +11 -3
  1156. wagtail/snippets/locale/pl/LC_MESSAGES/django.po +1 -1
  1157. wagtail/snippets/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  1158. wagtail/snippets/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  1159. wagtail/snippets/locale/ro/LC_MESSAGES/django.po +1 -1
  1160. wagtail/snippets/locale/ru/LC_MESSAGES/django.mo +0 -0
  1161. wagtail/snippets/locale/ru/LC_MESSAGES/django.po +11 -3
  1162. wagtail/snippets/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  1163. wagtail/snippets/locale/sl/LC_MESSAGES/django.po +1 -1
  1164. wagtail/snippets/locale/sr/LC_MESSAGES/django.mo +0 -0
  1165. wagtail/snippets/locale/sr/LC_MESSAGES/django.po +1 -1
  1166. wagtail/snippets/locale/sv/LC_MESSAGES/django.mo +0 -0
  1167. wagtail/snippets/locale/sv/LC_MESSAGES/django.po +13 -2
  1168. wagtail/snippets/locale/ta/LC_MESSAGES/django.mo +0 -0
  1169. wagtail/snippets/locale/ta/LC_MESSAGES/django.po +1 -1
  1170. wagtail/snippets/locale/tet/LC_MESSAGES/django.po +1 -1
  1171. wagtail/snippets/locale/th/LC_MESSAGES/django.po +1 -1
  1172. wagtail/snippets/locale/tr/LC_MESSAGES/django.po +1 -1
  1173. wagtail/snippets/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  1174. wagtail/snippets/locale/ug/LC_MESSAGES/django.po +1 -1
  1175. wagtail/snippets/locale/uk/LC_MESSAGES/django.po +1 -1
  1176. wagtail/snippets/locale/vi/LC_MESSAGES/django.po +1 -1
  1177. wagtail/snippets/locale/zh/LC_MESSAGES/django.po +1 -1
  1178. wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  1179. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  1180. wagtail/snippets/tests/test_chooser_block.py +197 -0
  1181. wagtail/snippets/tests/test_chooser_panel.py +149 -0
  1182. wagtail/snippets/tests/test_chooser_views.py +375 -0
  1183. wagtail/snippets/tests/test_chooser_widget.py +22 -0
  1184. wagtail/snippets/tests/test_compare_revisions_view.py +167 -0
  1185. wagtail/snippets/tests/test_copy_view.py +38 -0
  1186. wagtail/snippets/tests/test_create_view.py +1163 -0
  1187. wagtail/snippets/tests/test_delete_view.py +225 -0
  1188. wagtail/snippets/tests/test_edit_view.py +3243 -0
  1189. wagtail/snippets/tests/test_history_view.py +182 -0
  1190. wagtail/snippets/tests/test_index_view.py +105 -0
  1191. wagtail/snippets/tests/test_list_view.py +786 -0
  1192. wagtail/snippets/tests/test_locking.py +28 -0
  1193. wagtail/snippets/tests/test_permissions.py +167 -0
  1194. wagtail/snippets/tests/test_preview.py +3 -3
  1195. wagtail/snippets/tests/test_revert_view.py +343 -0
  1196. wagtail/snippets/tests/test_snippet_models.py +112 -0
  1197. wagtail/snippets/tests/test_unpublish_view.py +228 -0
  1198. wagtail/snippets/tests/test_unschedule_view.py +151 -0
  1199. wagtail/snippets/tests/test_viewset.py +38 -5
  1200. wagtail/snippets/views/snippets.py +76 -30
  1201. wagtail/snippets/widgets.py +2 -2
  1202. wagtail/templatetags/wagtailcore_tags.py +2 -2
  1203. wagtail/test/dummy_external_storage.py +1 -1
  1204. wagtail/test/testapp/fixtures/test.json +22 -0
  1205. wagtail/test/testapp/fixtures/test_empty.json +2 -0
  1206. wagtail/test/testapp/fixtures/test_explorable_pages.json +10 -0
  1207. wagtail/test/testapp/fixtures/test_specific.json +9 -0
  1208. wagtail/test/testapp/migrations/0059_nopromotepage.py +25 -0
  1209. wagtail/test/testapp/models.py +7 -0
  1210. wagtail/test/testapp/views.py +5 -0
  1211. wagtail/test/utils/page_tests.py +7 -7
  1212. wagtail/test/utils/wagtail_factories/builder.py +2 -2
  1213. wagtail/tests/streamfield_migrations/test_migrations.py +35 -0
  1214. wagtail/tests/test_blocks.py +321 -61
  1215. wagtail/tests/test_collection_model.py +12 -0
  1216. wagtail/tests/test_page_model.py +190 -1
  1217. wagtail/tests/test_page_privacy.py +5 -0
  1218. wagtail/tests/test_reference_index.py +42 -0
  1219. wagtail/tests/test_revision_model.py +118 -1
  1220. wagtail/tests/test_utils.py +2 -2
  1221. wagtail/users/locale/ar/LC_MESSAGES/django.po +1 -1
  1222. wagtail/users/locale/be/LC_MESSAGES/django.po +1 -1
  1223. wagtail/users/locale/bg/LC_MESSAGES/django.mo +0 -0
  1224. wagtail/users/locale/bg/LC_MESSAGES/django.po +10 -1
  1225. wagtail/users/locale/bn/LC_MESSAGES/django.po +1 -1
  1226. wagtail/users/locale/ca/LC_MESSAGES/django.po +1 -1
  1227. wagtail/users/locale/cs/LC_MESSAGES/django.po +1 -1
  1228. wagtail/users/locale/cy/LC_MESSAGES/django.po +1 -1
  1229. wagtail/users/locale/da/LC_MESSAGES/django.po +1 -1
  1230. wagtail/users/locale/de/LC_MESSAGES/django.mo +0 -0
  1231. wagtail/users/locale/de/LC_MESSAGES/django.po +6 -3
  1232. wagtail/users/locale/dv/LC_MESSAGES/django.po +1 -1
  1233. wagtail/users/locale/el/LC_MESSAGES/django.po +1 -1
  1234. wagtail/users/locale/en/LC_MESSAGES/django.mo +0 -0
  1235. wagtail/users/locale/en/LC_MESSAGES/django.po +14 -14
  1236. wagtail/users/locale/es/LC_MESSAGES/django.po +1 -1
  1237. wagtail/users/locale/es_419/LC_MESSAGES/django.po +1 -1
  1238. wagtail/users/locale/et/LC_MESSAGES/django.po +1 -1
  1239. wagtail/users/locale/eu/LC_MESSAGES/django.mo +0 -0
  1240. wagtail/users/locale/eu/LC_MESSAGES/django.po +1 -1
  1241. wagtail/users/locale/fa/LC_MESSAGES/django.po +1 -1
  1242. wagtail/users/locale/fi/LC_MESSAGES/django.po +1 -1
  1243. wagtail/users/locale/fr/LC_MESSAGES/django.po +1 -1
  1244. wagtail/users/locale/gl/LC_MESSAGES/django.po +1 -1
  1245. wagtail/users/locale/he_IL/LC_MESSAGES/django.po +1 -1
  1246. wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  1247. wagtail/users/locale/hu/LC_MESSAGES/django.po +1 -1
  1248. wagtail/users/locale/hy/LC_MESSAGES/django.po +1 -1
  1249. wagtail/users/locale/id_ID/LC_MESSAGES/django.mo +0 -0
  1250. wagtail/users/locale/id_ID/LC_MESSAGES/django.po +7 -3
  1251. wagtail/users/locale/is_IS/LC_MESSAGES/django.po +1 -1
  1252. wagtail/users/locale/it/LC_MESSAGES/django.mo +0 -0
  1253. wagtail/users/locale/it/LC_MESSAGES/django.po +15 -3
  1254. wagtail/users/locale/ja/LC_MESSAGES/django.po +1 -1
  1255. wagtail/users/locale/ka/LC_MESSAGES/django.po +1 -1
  1256. wagtail/users/locale/ko/LC_MESSAGES/django.po +1 -1
  1257. wagtail/users/locale/lt/LC_MESSAGES/django.po +1 -1
  1258. wagtail/users/locale/lv/LC_MESSAGES/django.po +1 -1
  1259. wagtail/users/locale/mi/LC_MESSAGES/django.po +1 -1
  1260. wagtail/users/locale/mn/LC_MESSAGES/django.po +1 -1
  1261. wagtail/users/locale/my/LC_MESSAGES/django.po +1 -1
  1262. wagtail/users/locale/nb/LC_MESSAGES/django.po +1 -1
  1263. wagtail/users/locale/nl/LC_MESSAGES/django.po +1 -1
  1264. wagtail/users/locale/pl/LC_MESSAGES/django.po +1 -1
  1265. wagtail/users/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  1266. wagtail/users/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  1267. wagtail/users/locale/ro/LC_MESSAGES/django.po +1 -1
  1268. wagtail/users/locale/ru/LC_MESSAGES/django.mo +0 -0
  1269. wagtail/users/locale/ru/LC_MESSAGES/django.po +4 -4
  1270. wagtail/users/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  1271. wagtail/users/locale/sl/LC_MESSAGES/django.po +1 -1
  1272. wagtail/users/locale/sv/LC_MESSAGES/django.mo +0 -0
  1273. wagtail/users/locale/sv/LC_MESSAGES/django.po +49 -18
  1274. wagtail/users/locale/tet/LC_MESSAGES/django.po +1 -1
  1275. wagtail/users/locale/th/LC_MESSAGES/django.po +1 -1
  1276. wagtail/users/locale/tr/LC_MESSAGES/django.po +1 -1
  1277. wagtail/users/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  1278. wagtail/users/locale/ug/LC_MESSAGES/django.po +1 -1
  1279. wagtail/users/locale/uk/LC_MESSAGES/django.po +1 -1
  1280. wagtail/users/locale/vi/LC_MESSAGES/django.po +1 -1
  1281. wagtail/users/locale/zh/LC_MESSAGES/django.po +1 -1
  1282. wagtail/users/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  1283. wagtail/users/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  1284. wagtail/users/tests/test_admin_views.py +39 -25
  1285. wagtail/users/utils.py +4 -1
  1286. wagtail/users/views/groups.py +19 -5
  1287. wagtail/users/wagtail_hooks.py +1 -1
  1288. wagtail/utils/loading.py +2 -2
  1289. wagtail-7.3.data/data/AGENTS.md +21 -0
  1290. wagtail-7.3.data/data/CHANGELOG.txt +4957 -0
  1291. wagtail-7.3.data/data/CODE_OF_CONDUCT.md +71 -0
  1292. wagtail-7.3.data/data/CONTRIBUTORS.md +1001 -0
  1293. wagtail-7.3.data/data/SPONSORS.md +55 -0
  1294. {wagtail-7.2.2.dist-info → wagtail-7.3.dist-info}/METADATA +6 -6
  1295. {wagtail-7.2.2.dist-info → wagtail-7.3.dist-info}/RECORD +1299 -1265
  1296. wagtail/images/static/wagtailimages/js/image-url-generator.js +0 -1
  1297. wagtail/snippets/tests/test_snippets.py +0 -6377
  1298. {wagtail-7.2.2.dist-info → wagtail-7.3.dist-info}/WHEEL +0 -0
  1299. {wagtail-7.2.2.dist-info → wagtail-7.3.dist-info}/entry_points.txt +0 -0
  1300. {wagtail-7.2.2.dist-info → wagtail-7.3.dist-info}/licenses/LICENSE +0 -0
  1301. {wagtail-7.2.2.dist-info → wagtail-7.3.dist-info}/top_level.txt +0 -0
@@ -22,13 +22,7 @@ class BaseSidePanel(Component):
22
22
  self.panel = panel
23
23
 
24
24
  def get_context_data(self, parent_context):
25
- # Inherit classes from fragments defined in slim_header.html
26
- inherit = {
27
- "nav_icon_button_classes",
28
- "nav_icon_classes",
29
- "nav_icon_counter_classes",
30
- }
31
- context = {key: parent_context.get(key) for key in inherit}
25
+ context = {}
32
26
  context["toggle"] = self
33
27
  context["panel"] = self.panel
34
28
  context["count"] = 0
@@ -98,16 +92,15 @@ class StatusSidePanel(BaseSidePanel):
98
92
  "wagtailadmin/shared/side_panels/includes/status/locale.html"
99
93
  )
100
94
 
101
- if self.object.pk:
102
- if self.locking_enabled:
103
- templates.append(
104
- "wagtailadmin/shared/side_panels/includes/status/locked.html"
105
- )
95
+ if self.locking_enabled:
96
+ templates.append(
97
+ "wagtailadmin/shared/side_panels/includes/status/locked.html"
98
+ )
106
99
 
107
- if self.usage_url:
108
- templates.append(
109
- "wagtailadmin/shared/side_panels/includes/status/usage.html"
110
- )
100
+ if self.usage_url is not None:
101
+ templates.append(
102
+ "wagtailadmin/shared/side_panels/includes/status/usage.html"
103
+ )
111
104
 
112
105
  return templates
113
106
 
@@ -211,10 +204,11 @@ class StatusSidePanel(BaseSidePanel):
211
204
  }
212
205
 
213
206
  def get_usage_context(self):
207
+ usage_count = 0
208
+ if self.object.pk:
209
+ usage_count = ReferenceIndex.get_grouped_references_to(self.object).count()
214
210
  return {
215
- "usage_count": ReferenceIndex.get_grouped_references_to(
216
- self.object
217
- ).count(),
211
+ "usage_count": usage_count,
218
212
  "usage_url": self.usage_url,
219
213
  }
220
214
 
@@ -229,9 +223,13 @@ class StatusSidePanel(BaseSidePanel):
229
223
  context["history_url"] = self.history_url
230
224
  context["status_templates"] = self.get_status_templates(context)
231
225
  context["last_updated_info"] = self.last_updated_info
226
+ context["is_partial"] = parent_context.get("is_partial", False)
227
+ context["hydrate_create_view"] = parent_context.get(
228
+ "hydrate_create_view", False
229
+ )
232
230
  context.update(self.get_scheduled_publishing_context(parent_context))
233
231
  context.update(self.get_lock_context(parent_context))
234
- if self.object.pk and self.usage_url:
232
+ if self.usage_url is not None:
235
233
  context.update(self.get_usage_context())
236
234
  return context
237
235
 
@@ -240,6 +238,7 @@ class PageStatusSidePanel(StatusSidePanel):
240
238
  def __init__(self, *args, **kwargs):
241
239
  self.parent_page = kwargs.pop("parent_page", None)
242
240
  super().__init__(*args, **kwargs)
241
+ self.usage_url = ""
243
242
  if self.object.pk:
244
243
  self.usage_url = reverse("wagtailadmin_pages:usage", args=(self.object.pk,))
245
244
 
wagtail/admin/userbar.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from warnings import warn
2
2
 
3
- from django.template.loader import render_to_string
3
+ from django.forms import Media
4
4
  from django.utils import translation
5
5
  from django.utils.translation import gettext_lazy as _
6
6
 
@@ -14,18 +14,18 @@ from wagtail.users.models import UserProfile
14
14
  from wagtail.utils.deprecation import RemovedInWagtail80Warning
15
15
 
16
16
 
17
- class BaseItem:
18
- template = "wagtailadmin/userbar/item_base.html"
17
+ class BaseItem(Component):
18
+ template_name = "wagtailadmin/userbar/item_base.html"
19
19
 
20
- def get_context_data(self, request):
21
- return {"self": self, "request": request}
22
-
23
- def render(self, request):
24
- return render_to_string(self.template, self.get_context_data(request))
20
+ def get_context_data(self, parent_context):
21
+ context = super().get_context_data(parent_context)
22
+ context["self"] = self
23
+ context["request"] = parent_context.get("request")
24
+ return context
25
25
 
26
26
 
27
27
  class AdminItem(BaseItem):
28
- template = "wagtailadmin/userbar/item_admin.html"
28
+ template_name = "wagtailadmin/userbar/item_admin.html"
29
29
 
30
30
 
31
31
  class AccessibilityItem(BaseItem):
@@ -37,7 +37,7 @@ class AccessibilityItem(BaseItem):
37
37
  """Whether the accessibility checker is being run in the page editor."""
38
38
 
39
39
  #: The template to use for rendering the item.
40
- template = "wagtailadmin/userbar/item_accessibility.html"
40
+ template_name = "wagtailadmin/userbar/item_accessibility.html"
41
41
 
42
42
  #: A list of CSS selector(s) to test specific parts of the page.
43
43
  #: For more details, see `Axe documentation <https://github.com/dequelabs/axe-core/blob/master/doc/context.md#the-include-property>`__.
@@ -212,21 +212,23 @@ class AccessibilityItem(BaseItem):
212
212
  "spec": self.get_axe_spec(request),
213
213
  }
214
214
 
215
- def get_context_data(self, request):
216
- return {
217
- **super().get_context_data(request),
218
- "axe_configuration": self.get_axe_configuration(request),
219
- }
215
+ def get_context_data(self, parent_context):
216
+ context = super().get_context_data(parent_context)
217
+ context["axe_configuration"] = self.get_axe_configuration(
218
+ parent_context.get("request")
219
+ )
220
+ return context
220
221
 
221
222
 
222
223
  class AddPageItem(BaseItem):
223
- template = "wagtailadmin/userbar/item_page_add.html"
224
+ template_name = "wagtailadmin/userbar/item_page_add.html"
224
225
 
225
226
  def __init__(self, page):
226
227
  self.page = page
227
228
  self.parent_page = page.get_parent()
228
229
 
229
- def render(self, request):
230
+ def render_html(self, parent_context):
231
+ request = parent_context.get("request")
230
232
  # Don't render if the page doesn't have an id
231
233
  if not self.page.id:
232
234
  return ""
@@ -236,17 +238,18 @@ class AddPageItem(BaseItem):
236
238
  if not permission_checker.can_add_subpage():
237
239
  return ""
238
240
 
239
- return super().render(request)
241
+ return super().render_html(parent_context)
240
242
 
241
243
 
242
244
  class ExplorePageItem(BaseItem):
243
- template = "wagtailadmin/userbar/item_page_explore.html"
245
+ template_name = "wagtailadmin/userbar/item_page_explore.html"
244
246
 
245
247
  def __init__(self, page):
246
248
  self.page = page
247
249
  self.parent_page = page.get_parent()
248
250
 
249
- def render(self, request):
251
+ def render_html(self, parent_context):
252
+ request = parent_context.get("request")
250
253
  # Don't render if the page doesn't have an id
251
254
  if not self.page.id:
252
255
  return ""
@@ -259,16 +262,17 @@ class ExplorePageItem(BaseItem):
259
262
  ):
260
263
  return ""
261
264
 
262
- return super().render(request)
265
+ return super().render_html(parent_context)
263
266
 
264
267
 
265
268
  class EditPageItem(BaseItem):
266
- template = "wagtailadmin/userbar/item_page_edit.html"
269
+ template_name = "wagtailadmin/userbar/item_page_edit.html"
267
270
 
268
271
  def __init__(self, page):
269
272
  self.page = page
270
273
 
271
- def render(self, request):
274
+ def render_html(self, parent_context):
275
+ request = parent_context.get("request")
272
276
  # Don't render if the page doesn't have an id
273
277
  if not self.page.id:
274
278
  return ""
@@ -286,7 +290,7 @@ class EditPageItem(BaseItem):
286
290
  if not permission_checker.can_edit():
287
291
  return ""
288
292
 
289
- return super().render(request)
293
+ return super().render_html(parent_context)
290
294
 
291
295
 
292
296
  def apply_userbar_hooks(request, items, page):
@@ -359,10 +363,26 @@ class Userbar(Component):
359
363
  apply_userbar_hooks(request, items, self.object)
360
364
 
361
365
  # Render the items
362
- rendered_items = [item.render(request) for item in items]
366
+ rendered_items = []
367
+ media = Media()
368
+ for item in items:
369
+ # Backwards compatibility for legacy items with a render method.
370
+ if hasattr(item, "render"):
371
+ warn(
372
+ "Userbar items now use the `render_html(parent_context)` method instead of `render(request)` -"
373
+ f" view the `construct_wagtail_userbar` docs to update {item.__class__.__name__}",
374
+ RemovedInWagtail80Warning,
375
+ )
376
+
377
+ content = item.render(request)
378
+ else:
379
+ content = item.render_html(parent_context)
380
+ if content:
381
+ rendered_items.append(content)
363
382
 
364
- # Remove any unrendered items
365
- rendered_items = [item for item in rendered_items if item]
383
+ # Always append media even if the item might render nothing.
384
+ if hasattr(item, "media"):
385
+ media += item.media
366
386
 
367
387
  if request:
368
388
  origin = f"{request.scheme}://{request.get_host()}"
@@ -374,6 +394,7 @@ class Userbar(Component):
374
394
  "request": request,
375
395
  "origin": origin,
376
396
  "items": rendered_items,
397
+ "media": media,
377
398
  "position": self.position,
378
399
  "page": self.object,
379
400
  "revision_id": revision_id,
@@ -7,8 +7,8 @@ from wagtail.admin.views.bulk_action.registry import bulk_action_registry as reg
7
7
  def index(request, app_label, model_name, action):
8
8
  try:
9
9
  model = apps.get_model(app_label, model_name)
10
- except LookupError:
11
- raise Http404
10
+ except LookupError as e:
11
+ raise Http404 from e
12
12
  action_class = registry.get_bulk_action_class(app_label, model_name, action)
13
13
  if action_class is not None:
14
14
  return action_class(request, model).dispatch(request)
@@ -243,8 +243,8 @@ class BrowseView(View):
243
243
 
244
244
  try:
245
245
  self.desired_classes = page_models_from_string(page_type_string)
246
- except (ValueError, LookupError):
247
- raise Http404
246
+ except (ValueError, LookupError) as e:
247
+ raise Http404 from e
248
248
 
249
249
  # Find parent page
250
250
  if parent_page_id:
@@ -350,8 +350,8 @@ class BrowseView(View):
350
350
  paginator = Paginator(pages, per_page=25)
351
351
  try:
352
352
  pages = paginator.page(request.GET.get("p", 1))
353
- except InvalidPage:
354
- raise Http404
353
+ except InvalidPage as e:
354
+ raise Http404 from e
355
355
 
356
356
  # Annotate each page with can_choose/can_descend flags
357
357
  for page in pages:
@@ -445,8 +445,8 @@ class SearchView(View):
445
445
 
446
446
  try:
447
447
  desired_classes = page_models_from_string(page_type_string)
448
- except (ValueError, LookupError):
449
- raise Http404
448
+ except (ValueError, LookupError) as e:
449
+ raise Http404 from e
450
450
 
451
451
  pages = Page.objects.all()
452
452
  if self.i18n_enabled:
@@ -1,3 +1,5 @@
1
+ from datetime import datetime
2
+
1
3
  from django.apps import apps
2
4
  from django.contrib.admin.utils import unquote
3
5
  from django.contrib.contenttypes.models import ContentType
@@ -18,8 +20,8 @@ from wagtail.models import Page, Revision, RevisionMixin, WorkflowMixin
18
20
  def ping(request, app_label, model_name, object_id, session_id):
19
21
  try:
20
22
  model = apps.get_model(app_label, model_name)
21
- except LookupError:
22
- raise Http404
23
+ except LookupError as e:
24
+ raise Http404 from e
23
25
 
24
26
  unquoted_object_id = unquote(object_id)
25
27
 
@@ -31,9 +33,9 @@ def ping(request, app_label, model_name, object_id, session_id):
31
33
  else:
32
34
  try:
33
35
  permission_policy = model.snippet_viewset.permission_policy
34
- except AttributeError:
36
+ except AttributeError as e:
35
37
  # model is neither a Page nor a snippet
36
- raise Http404
38
+ raise Http404 from e
37
39
 
38
40
  can_edit = permission_policy.user_has_permission_for_instance(
39
41
  request.user, "change", obj
@@ -108,11 +110,22 @@ def ping(request, app_label, model_name, object_id, session_id):
108
110
  all_revisions = obj.revisions.defer("content")
109
111
  try:
110
112
  original_revision = all_revisions.get(id=revision_id)
111
- except Revision.DoesNotExist:
112
- raise Http404
113
+ except Revision.DoesNotExist as e:
114
+ raise Http404 from e
113
115
 
116
+ try:
117
+ # The created_at of the latest revision when the session was created
118
+ created_at = datetime.fromisoformat(
119
+ request.POST.get("revision_created_at", "")
120
+ )
121
+ except ValueError:
122
+ # Invalid or missing, assume it's the same as the real created_at
123
+ created_at = original_revision.created_at
124
+
125
+ # The newest revision may have been updated via autosave after the
126
+ # session was created, so filter by created_at rather than the pk.
114
127
  newest_revision = (
115
- all_revisions.filter(created_at__gt=original_revision.created_at)
128
+ all_revisions.filter(created_at__gt=created_at)
116
129
  .order_by("-created_at", "-pk")
117
130
  .select_related("user")
118
131
  .first()
@@ -10,6 +10,7 @@ from .mixins import ( # noqa: F401
10
10
  CreateEditViewOptionalFeaturesMixin,
11
11
  HookResponseMixin,
12
12
  IndexViewOptionalFeaturesMixin,
13
+ JsonPostResponseMixin,
13
14
  LocaleMixin,
14
15
  PanelMixin,
15
16
  RevisionsRevertMixin,
@@ -257,8 +257,8 @@ class BaseChooseView(
257
257
  self.paginator = self.paginator_class(objects, per_page=self.per_page)
258
258
  try:
259
259
  return self.paginator.page(request.GET.get("p", 1))
260
- except InvalidPage:
261
- raise Http404
260
+ except InvalidPage as e:
261
+ raise Http404 from e
262
262
 
263
263
  def get(self, request):
264
264
  self.filter_form = self.get_filter_form()
@@ -516,9 +516,9 @@ class ChosenViewMixin(ModelLookupMixin):
516
516
 
517
517
  def get(self, request, pk):
518
518
  try:
519
- item = self.get_object(unquote(pk))
520
- except ObjectDoesNotExist:
521
- raise Http404
519
+ item = self.get_object(unquote(str(pk)))
520
+ except ObjectDoesNotExist as e:
521
+ raise Http404 from e
522
522
 
523
523
  return self.get_chosen_response(item)
524
524
 
@@ -3,8 +3,10 @@ import json
3
3
  from django.conf import settings
4
4
  from django.contrib.admin.utils import quote
5
5
  from django.contrib.contenttypes.models import ContentType
6
+ from django.core.exceptions import PermissionDenied
6
7
  from django.db import models, transaction
7
8
  from django.forms import Media
9
+ from django.http import JsonResponse
8
10
  from django.shortcuts import get_object_or_404
9
11
  from django.template.loader import render_to_string
10
12
  from django.urls import reverse
@@ -21,6 +23,7 @@ from wagtail.admin.forms.models import WagtailAdminModelForm
21
23
  from wagtail.admin.models import EditingSession
22
24
  from wagtail.admin.telepath import JSContext
23
25
  from wagtail.admin.templatetags.wagtailadmin_tags import user_display_name
26
+ from wagtail.admin.ui.autosave import AutosaveIndicator
24
27
  from wagtail.admin.ui.editing_sessions import EditingSessionsModule
25
28
  from wagtail.admin.ui.tables import LiveStatusTagColumn, TitleColumn
26
29
  from wagtail.admin.utils import get_latest_str, set_query_params
@@ -32,6 +35,7 @@ from wagtail.models import (
32
35
  Locale,
33
36
  LockableMixin,
34
37
  PreviewableMixin,
38
+ Revision,
35
39
  RevisionMixin,
36
40
  TranslatableMixin,
37
41
  WorkflowMixin,
@@ -279,6 +283,8 @@ class CreateEditViewOptionalFeaturesMixin:
279
283
  and issubclass(self.model, LockableMixin)
280
284
  and self.view_name != "create"
281
285
  )
286
+ self.autosave_interval = getattr(settings, "WAGTAIL_AUTOSAVE_INTERVAL", 500)
287
+ self.autosave_enabled = self.revision_enabled and self.autosave_interval > 0
282
288
 
283
289
  # Set the object before super().setup() as LocaleMixin.setup() needs it
284
290
  self.object = self.get_object()
@@ -446,16 +452,6 @@ class CreateEditViewOptionalFeaturesMixin:
446
452
  self.confirm_workflow_cancellation_url_name, args=[quote(self.object.pk)]
447
453
  )
448
454
 
449
- def get_error_message(self):
450
- if self.action == "cancel-workflow":
451
- return None
452
- if self.locked_for_user:
453
- return capfirst(
454
- _("The %(model_name)s could not be saved as it is locked")
455
- % {"model_name": self.model._meta.verbose_name}
456
- )
457
- return super().get_error_message()
458
-
459
455
  def get_success_message(self, instance=None):
460
456
  object = instance or self.object
461
457
 
@@ -547,8 +543,23 @@ class CreateEditViewOptionalFeaturesMixin:
547
543
  # Save revision if the model inherits from RevisionMixin
548
544
  self.new_revision = None
549
545
  if self.revision_enabled:
546
+ overwrite_revision_id = self.request.POST.get("overwrite_revision_id")
547
+ if overwrite_revision_id:
548
+ try:
549
+ overwrite_revision = instance.revisions.get(
550
+ pk=overwrite_revision_id
551
+ )
552
+ except Revision.DoesNotExist as e:
553
+ raise PermissionDenied(
554
+ "Cannot overwrite a revision that does not exist"
555
+ ) from e
556
+ else:
557
+ overwrite_revision = None
558
+
550
559
  self.new_revision = instance.save_revision(
551
- user=self.request.user, clean=not self.saving_as_draft
560
+ user=self.request.user,
561
+ clean=not self.saving_as_draft,
562
+ overwrite_revision=overwrite_revision,
552
563
  )
553
564
 
554
565
  log(
@@ -617,8 +628,14 @@ class CreateEditViewOptionalFeaturesMixin:
617
628
 
618
629
  def form_valid(self, form):
619
630
  self.form = form
620
- with transaction.atomic():
621
- self.object = self.save_instance()
631
+ try:
632
+ with transaction.atomic():
633
+ self.object = self.save_instance()
634
+ except PermissionDenied as e:
635
+ # The revision passed to overwrite_revision was not valid
636
+ self.produced_error_code = "invalid_revision"
637
+ self.produced_error_message = str(e)
638
+ return self.form_invalid(form)
622
639
 
623
640
  response = self.run_action_method()
624
641
  if response is not None:
@@ -632,9 +649,18 @@ class CreateEditViewOptionalFeaturesMixin:
632
649
 
633
650
  return response
634
651
 
652
+ def get_success_json(self):
653
+ data = super().get_success_json()
654
+ if self.revision_enabled and self.new_revision:
655
+ data["revision_id"] = self.new_revision.id
656
+ data["revision_created_at"] = self.new_revision.created_at.isoformat()
657
+ return data
658
+
635
659
  def form_invalid(self, form):
636
- # Even if the object is locked due to not having permissions,
637
- # the original submitter can still cancel the workflow
660
+ # Even if the form is invalid, a cancel-workflow action can still proceed. This accommodates
661
+ # the typical case for a lockable model, where the object is locked to the submitter at the
662
+ # point of submission (and thus the lock would make the form submission invalid) - but also
663
+ # applies to other error conditions such as actual validation errors.
638
664
  if self.action == "cancel-workflow":
639
665
  self.cancel_workflow_action()
640
666
  messages.success(
@@ -645,6 +671,10 @@ class CreateEditViewOptionalFeaturesMixin:
645
671
  # Refresh the lock object as now WorkflowLock no longer applies
646
672
  self.lock = self.get_lock()
647
673
  self.locked_for_user = self.lock and self.lock.for_user(self.request.user)
674
+ # Unset whichever error message was set by is_valid() (most likely "this X could not be
675
+ # saved as it is locked") so that we just show the success message.
676
+ self.produced_error_message = None
677
+
648
678
  return super().form_invalid(form)
649
679
 
650
680
  def get_last_updated_info(self):
@@ -743,7 +773,6 @@ class CreateEditViewOptionalFeaturesMixin:
743
773
  object_id=self.object.pk,
744
774
  last_seen_at=timezone.now(),
745
775
  )
746
- revision_id = self.object.latest_revision_id if self.revision_enabled else None
747
776
  return EditingSessionsModule(
748
777
  session,
749
778
  reverse(
@@ -760,15 +789,56 @@ class CreateEditViewOptionalFeaturesMixin:
760
789
  args=(session.id,),
761
790
  ),
762
791
  [],
763
- revision_id,
792
+ self.latest_revision and self.latest_revision.pk,
793
+ self.latest_revision_created_at,
764
794
  )
765
795
 
796
+ @cached_property
797
+ def latest_revision(self):
798
+ return self.revision_enabled and self.object and self.object.latest_revision
799
+
800
+ @cached_property
801
+ def latest_revision_created_at(self):
802
+ return self.latest_revision and self.latest_revision.created_at.isoformat()
803
+
804
+ @cached_property
805
+ def is_out_of_date(self):
806
+ if not self.latest_revision:
807
+ return False
808
+
809
+ latest_revision_id = str(self.latest_revision.pk)
810
+
811
+ # Two different sessions cannot have the same autosave revision, so if
812
+ # autosave revision is present, it is either the latest or it is not.
813
+ if overwrite_revision_id := self.request.POST.get("overwrite_revision_id"):
814
+ return overwrite_revision_id != latest_revision_id
815
+
816
+ # Client has not made an autosave revision, check the loaded revision.
817
+ if loaded_revision_id := self.request.POST.get("loaded_revision_id"):
818
+ # If the loaded revision is not the latest revision, it is outdated.
819
+ if loaded_revision_id != latest_revision_id:
820
+ return True
821
+
822
+ # It's pointing to the latest revision, but that revision may have
823
+ # been overwritten by another session (via autosave) since the editor
824
+ # loaded it. The created_at is strictly increasing, so assume the
825
+ # loaded revision outdated if it doesn't match the latest created_at.
826
+ return (
827
+ self.request.POST.get("loaded_revision_created_at", "")
828
+ != self.latest_revision_created_at
829
+ )
830
+
831
+ # Not enough information to deduce, assume it's up to date.
832
+ return False
833
+
766
834
  def get_context_data(self, **kwargs):
767
835
  context = super().get_context_data(**kwargs)
768
836
  context.update(self.get_lock_context())
769
837
  context["revision_enabled"] = self.revision_enabled
770
838
  context["draftstate_enabled"] = self.draftstate_enabled
771
839
  context["workflow_enabled"] = self.workflow_enabled
840
+ context["autosave_enabled"] = self.autosave_enabled
841
+ context["autosave_interval"] = self.autosave_interval
772
842
  context["workflow_history_url"] = self.get_workflow_history_url()
773
843
  context["confirm_workflow_cancellation_url"] = (
774
844
  self.get_confirm_workflow_cancellation_url()
@@ -778,27 +848,36 @@ class CreateEditViewOptionalFeaturesMixin:
778
848
  ) and bool(self.workflow_tasks)
779
849
  context["revisions_compare_url_name"] = self.revisions_compare_url_name
780
850
  context["editing_sessions"] = self.get_editing_sessions()
851
+ context["loaded_revision_created_at"] = self.latest_revision_created_at
852
+ if self.autosave_enabled:
853
+ context["autosave_indicator"] = AutosaveIndicator()
781
854
  return context
782
855
 
783
- def post(self, request, *args, **kwargs):
784
- form = self.get_form()
856
+ def is_valid(self, form):
857
+ # For autosave, we only want to save the page if there are no conflicts
858
+ if self.expects_json_response and self.is_out_of_date:
859
+ self.produced_error_code = "invalid_revision"
860
+ self.produced_error_message = _("Saving will overwrite a newer version.")
861
+ return False
785
862
 
786
863
  # Make sure object is not locked
787
864
  if self.locked_for_user:
788
- return self.form_invalid(form)
865
+ self.produced_error_code = "locked"
866
+ self.produced_error_message = capfirst(
867
+ _("The %(model_name)s could not be saved as it is locked")
868
+ % {"model_name": self.model._meta.verbose_name}
869
+ )
870
+ return False
789
871
 
790
872
  # If saving as draft, do not enforce full validation
791
873
  if self.saving_as_draft and isinstance(form, WagtailAdminModelForm):
792
874
  form.defer_required_fields()
793
- form_is_valid = form.is_valid()
875
+ result = super().is_valid(form)
794
876
  form.restore_required_fields()
795
877
  else:
796
- form_is_valid = form.is_valid()
878
+ result = super().is_valid(form)
797
879
 
798
- if form_is_valid:
799
- return self.form_valid(form)
800
- else:
801
- return self.form_invalid(form)
880
+ return result
802
881
 
803
882
 
804
883
  class RevisionsRevertMixin:
@@ -880,4 +959,42 @@ class RevisionsRevertMixin:
880
959
  context = super().get_context_data(**kwargs)
881
960
  context["revision"] = self.revision
882
961
  context["action_url"] = self.get_revisions_revert_url()
962
+ # Autosave does not make much sense in this view, we want the user to
963
+ # explicitly confirm they want to revert to the previous revision
964
+ context["autosave_enabled"] = False
883
965
  return context
966
+
967
+
968
+ class JsonPostResponseMixin:
969
+ """
970
+ Helper methods for create/edit views that return JSON responses when POSTed to with an
971
+ Accepts: application/json header, rather than the usual "redirect on success, HTML form
972
+ on failure" behaviour.
973
+ """
974
+
975
+ partials_template_name = None
976
+
977
+ @cached_property
978
+ def expects_json_response(self):
979
+ return not self.request.accepts("text/html")
980
+
981
+ def json_error_response(self, error_code, error_message):
982
+ return JsonResponse(
983
+ {
984
+ "success": False,
985
+ "error_code": error_code,
986
+ "error_message": error_message,
987
+ },
988
+ status=400,
989
+ )
990
+
991
+ @staticmethod
992
+ def response_is_json(response):
993
+ return response.headers.get("Content-Type") == "application/json"
994
+
995
+ def render_partials(self):
996
+ return render_to_string(
997
+ self.partials_template_name,
998
+ self.get_context_data(),
999
+ request=self.request,
1000
+ )