wagtail 6.1.2__py3-none-any.whl → 6.2rc1__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 (644) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_for_translation.py +15 -1
  3. wagtail/admin/checks.py +20 -30
  4. wagtail/admin/forms/pages.py +10 -0
  5. wagtail/admin/icons.py +43 -0
  6. wagtail/admin/locale/ar/LC_MESSAGES/django.po +2 -2
  7. wagtail/admin/locale/be/LC_MESSAGES/django.po +7 -7
  8. wagtail/admin/locale/be/LC_MESSAGES/djangojs.po +3 -3
  9. wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
  10. wagtail/admin/locale/ca/LC_MESSAGES/django.po +51 -50
  11. wagtail/admin/locale/cs/LC_MESSAGES/django.po +10 -8
  12. wagtail/admin/locale/de/LC_MESSAGES/django.po +49 -47
  13. wagtail/admin/locale/dv/LC_MESSAGES/django.po +8 -8
  14. wagtail/admin/locale/el/LC_MESSAGES/django.po +4 -4
  15. wagtail/admin/locale/en/LC_MESSAGES/django.po +405 -295
  16. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +21 -3
  17. wagtail/admin/locale/es/LC_MESSAGES/django.po +40 -39
  18. wagtail/admin/locale/es_419/LC_MESSAGES/django.po +8 -8
  19. wagtail/admin/locale/et/LC_MESSAGES/django.po +14 -12
  20. wagtail/admin/locale/fa/LC_MESSAGES/django.mo +0 -0
  21. wagtail/admin/locale/fa/LC_MESSAGES/django.po +93 -19
  22. wagtail/admin/locale/fa/LC_MESSAGES/djangojs.mo +0 -0
  23. wagtail/admin/locale/fa/LC_MESSAGES/djangojs.po +5 -1
  24. wagtail/admin/locale/fi/LC_MESSAGES/django.po +18 -18
  25. wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
  26. wagtail/admin/locale/fr/LC_MESSAGES/django.po +134 -46
  27. wagtail/admin/locale/gl/LC_MESSAGES/django.po +55 -54
  28. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +13 -12
  29. wagtail/admin/locale/hr_HR/LC_MESSAGES/djangojs.po +2 -2
  30. wagtail/admin/locale/hu/LC_MESSAGES/django.po +45 -42
  31. wagtail/admin/locale/id_ID/LC_MESSAGES/django.po +6 -6
  32. wagtail/admin/locale/is_IS/LC_MESSAGES/django.po +53 -51
  33. wagtail/admin/locale/it/LC_MESSAGES/django.po +56 -55
  34. wagtail/admin/locale/ja/LC_MESSAGES/django.po +2 -2
  35. wagtail/admin/locale/ko/LC_MESSAGES/django.po +18 -17
  36. wagtail/admin/locale/lt/LC_MESSAGES/django.po +4 -4
  37. wagtail/admin/locale/nb/LC_MESSAGES/django.po +22 -22
  38. wagtail/admin/locale/nl/LC_MESSAGES/django.po +44 -41
  39. wagtail/admin/locale/pl/LC_MESSAGES/django.po +49 -47
  40. wagtail/admin/locale/pl/LC_MESSAGES/djangojs.po +3 -3
  41. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  42. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.po +46 -26
  43. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +21 -20
  44. wagtail/admin/locale/ro/LC_MESSAGES/django.po +51 -50
  45. wagtail/admin/locale/ru/LC_MESSAGES/django.po +60 -59
  46. wagtail/admin/locale/ru/LC_MESSAGES/djangojs.po +3 -3
  47. wagtail/admin/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  48. wagtail/admin/locale/sk_SK/LC_MESSAGES/django.po +15 -5
  49. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  50. wagtail/admin/locale/sl/LC_MESSAGES/django.po +86 -39
  51. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.po +2 -2
  52. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  53. wagtail/admin/locale/sv/LC_MESSAGES/django.po +117 -41
  54. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.mo +0 -0
  55. wagtail/admin/locale/sv/LC_MESSAGES/djangojs.po +5 -2
  56. wagtail/admin/locale/tet/LC_MESSAGES/django.po +2 -2
  57. wagtail/admin/locale/th/LC_MESSAGES/django.po +4 -4
  58. wagtail/admin/locale/tr/LC_MESSAGES/django.po +4 -4
  59. wagtail/admin/locale/tr_TR/LC_MESSAGES/django.po +4 -4
  60. wagtail/admin/locale/uk/LC_MESSAGES/django.po +11 -10
  61. wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  62. wagtail/admin/locale/zh_Hans/LC_MESSAGES/django.po +84 -13
  63. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +2 -2
  64. wagtail/admin/menu.py +2 -2
  65. wagtail/admin/migrations/0004_editingsession.py +57 -0
  66. wagtail/admin/migrations/0005_editingsession_is_editing.py +18 -0
  67. wagtail/admin/models.py +36 -3
  68. wagtail/admin/rich_text/editors/draftail/__init__.py +2 -20
  69. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  70. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  71. wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
  72. wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
  73. wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
  74. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  75. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  76. wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
  77. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  78. wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
  79. wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
  80. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  81. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  82. wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
  83. wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
  84. wagtail/admin/static/wagtailadmin/js/preview-panel.js +2 -1
  85. wagtail/admin/static/wagtailadmin/js/preview-panel.js.LICENSE.txt +11 -0
  86. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  87. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  88. wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
  89. wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
  90. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  91. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  92. wagtail/admin/static/wagtailadmin/js/userbar.js +2 -1
  93. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +11 -0
  94. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  95. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +0 -12
  96. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  97. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  98. wagtail/admin/templates/wagtailadmin/collection_privacy/ancestor_privacy.html +2 -6
  99. wagtail/admin/templates/wagtailadmin/generic/index_results.html +1 -17
  100. wagtail/admin/templates/wagtailadmin/generic/listing_results.html +20 -1
  101. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +2 -11
  102. wagtail/admin/templates/wagtailadmin/page_privacy/ancestor_privacy.html +2 -6
  103. wagtail/admin/templates/wagtailadmin/page_privacy/no_privacy.html +2 -0
  104. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -1
  105. wagtail/admin/templates/wagtailadmin/pages/action_menu/menu.html +1 -1
  106. wagtail/admin/templates/wagtailadmin/reports/aging_pages_results.html +54 -0
  107. wagtail/admin/templates/wagtailadmin/reports/base_page_report.html +1 -17
  108. wagtail/admin/templates/wagtailadmin/reports/base_page_report_results.html +10 -0
  109. wagtail/admin/templates/wagtailadmin/reports/base_report.html +1 -40
  110. wagtail/admin/templates/wagtailadmin/reports/base_report_results.html +1 -0
  111. wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_report.html +21 -27
  112. wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_types_usage.html +48 -54
  113. wagtail/admin/templates/wagtailadmin/reports/{locked_pages.html → locked_pages_results.html} +3 -3
  114. wagtail/admin/templates/wagtailadmin/reports/page_types_usage_results.html +10 -0
  115. wagtail/admin/templates/wagtailadmin/reports/site_history_results.html +53 -0
  116. wagtail/admin/templates/wagtailadmin/reports/workflow_results.html +74 -0
  117. wagtail/admin/templates/wagtailadmin/reports/workflow_tasks_results.html +56 -0
  118. wagtail/admin/templates/wagtailadmin/shared/_workflow_init.html +8 -44
  119. wagtail/admin/templates/wagtailadmin/shared/avatar.html +11 -1
  120. wagtail/admin/templates/wagtailadmin/shared/dialog/dialog.html +5 -4
  121. wagtail/admin/templates/wagtailadmin/shared/dropdown/dropdown_button.html +2 -1
  122. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/list.html +132 -0
  123. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/module.html +44 -0
  124. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +7 -1
  125. wagtail/admin/templates/wagtailadmin/shared/page_status_tag_new.html +1 -1
  126. wagtail/admin/templates/wagtailadmin/shared/side_panels/checks.html +32 -16
  127. wagtail/admin/templates/wagtailadmin/skeleton.html +1 -1
  128. wagtail/admin/templates/wagtailadmin/userbar/item_accessibility.html +9 -11
  129. wagtail/admin/templatetags/wagtailadmin_tags.py +13 -2
  130. wagtail/admin/tests/formats/en/__init__.py +0 -0
  131. wagtail/admin/tests/formats/en/formats.py +1 -0
  132. wagtail/admin/tests/pages/test_create_page.py +47 -0
  133. wagtail/admin/tests/pages/test_edit_page.py +10 -8
  134. wagtail/admin/tests/pages/test_parent_page_chooser_view.py +45 -1
  135. wagtail/admin/tests/test_checks.py +53 -3
  136. wagtail/admin/tests/test_collections_views.py +62 -1
  137. wagtail/admin/tests/test_edit_handlers.py +37 -0
  138. wagtail/admin/tests/test_editing_sessions.py +1336 -0
  139. wagtail/admin/tests/test_icon_sprite.py +12 -21
  140. wagtail/admin/tests/test_page_chooser.py +309 -7
  141. wagtail/admin/tests/test_privacy.py +82 -0
  142. wagtail/admin/tests/test_reports_views.py +464 -70
  143. wagtail/admin/tests/test_userbar.py +93 -6
  144. wagtail/admin/tests/test_workflows.py +223 -33
  145. wagtail/admin/tests/viewsets/test_model_viewset.py +151 -2
  146. wagtail/admin/ui/editing_sessions.py +57 -0
  147. wagtail/admin/urls/__init__.py +9 -15
  148. wagtail/admin/urls/editing_sessions.py +17 -0
  149. wagtail/admin/urls/reports.py +33 -1
  150. wagtail/admin/userbar.py +77 -20
  151. wagtail/admin/views/chooser.py +49 -22
  152. wagtail/admin/views/collections.py +0 -11
  153. wagtail/admin/views/editing_sessions.py +193 -0
  154. wagtail/admin/views/generic/__init__.py +1 -0
  155. wagtail/admin/views/generic/base.py +3 -2
  156. wagtail/admin/views/generic/history.py +9 -3
  157. wagtail/admin/views/generic/mixins.py +44 -3
  158. wagtail/admin/views/generic/models.py +46 -72
  159. wagtail/admin/views/generic/permissions.py +20 -10
  160. wagtail/admin/views/home.py +2 -31
  161. wagtail/admin/views/page_privacy.py +20 -5
  162. wagtail/admin/views/pages/choose_parent.py +62 -0
  163. wagtail/admin/views/pages/edit.py +28 -0
  164. wagtail/admin/views/reports/aging_pages.py +6 -10
  165. wagtail/admin/views/reports/audit_logging.py +13 -42
  166. wagtail/admin/views/reports/base.py +31 -4
  167. wagtail/admin/views/reports/locked_pages.py +5 -8
  168. wagtail/admin/views/reports/page_types_usage.py +6 -10
  169. wagtail/admin/views/reports/workflows.py +36 -12
  170. wagtail/admin/viewsets/base.py +8 -3
  171. wagtail/admin/viewsets/chooser.py +1 -1
  172. wagtail/admin/viewsets/model.py +26 -1
  173. wagtail/admin/wagtail_hooks.py +2 -1
  174. wagtail/api/v2/filters.py +6 -0
  175. wagtail/api/v2/tests/test_documents.py +1 -1
  176. wagtail/api/v2/tests/test_images.py +1 -1
  177. wagtail/api/v2/tests/test_pages.py +11 -1
  178. wagtail/api/v2/utils.py +2 -2
  179. wagtail/blocks/base.py +35 -12
  180. wagtail/blocks/definition_lookup.py +85 -0
  181. wagtail/blocks/list_block.py +12 -0
  182. wagtail/blocks/migrations/migrate_operation.py +2 -0
  183. wagtail/blocks/stream_block.py +19 -0
  184. wagtail/blocks/struct_block.py +19 -0
  185. wagtail/contrib/forms/locale/be/LC_MESSAGES/django.po +3 -3
  186. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +1 -1
  187. wagtail/contrib/forms/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  188. wagtail/contrib/forms/locale/pl/LC_MESSAGES/django.po +3 -3
  189. wagtail/contrib/forms/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  190. wagtail/contrib/forms/locale/pt_BR/LC_MESSAGES/django.po +2 -2
  191. wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.po +3 -3
  192. wagtail/contrib/forms/locale/sl/LC_MESSAGES/django.po +2 -2
  193. wagtail/contrib/frontend_cache/backends/__init__.py +5 -0
  194. wagtail/contrib/frontend_cache/backends/azure.py +179 -0
  195. wagtail/contrib/frontend_cache/backends/base.py +28 -0
  196. wagtail/contrib/frontend_cache/backends/cloudflare.py +114 -0
  197. wagtail/contrib/frontend_cache/backends/cloudfront.py +99 -0
  198. wagtail/contrib/frontend_cache/backends/http.py +64 -0
  199. wagtail/contrib/frontend_cache/tests.py +59 -17
  200. wagtail/contrib/frontend_cache/utils.py +26 -8
  201. wagtail/contrib/redirects/filters.py +15 -1
  202. wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.po +4 -4
  203. wagtail/contrib/redirects/locale/be/LC_MESSAGES/django.po +3 -3
  204. wagtail/contrib/redirects/locale/bg/LC_MESSAGES/django.po +4 -4
  205. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +4 -4
  206. wagtail/contrib/redirects/locale/cs/LC_MESSAGES/django.po +4 -4
  207. wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.po +6 -6
  208. wagtail/contrib/redirects/locale/de/LC_MESSAGES/django.po +5 -4
  209. wagtail/contrib/redirects/locale/el/LC_MESSAGES/django.po +7 -7
  210. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +37 -72
  211. wagtail/contrib/redirects/locale/es/LC_MESSAGES/django.po +6 -6
  212. wagtail/contrib/redirects/locale/et/LC_MESSAGES/django.po +4 -4
  213. wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.mo +0 -0
  214. wagtail/contrib/redirects/locale/fa/LC_MESSAGES/django.po +18 -5
  215. wagtail/contrib/redirects/locale/fi/LC_MESSAGES/django.po +6 -6
  216. wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +4 -4
  217. wagtail/contrib/redirects/locale/gl/LC_MESSAGES/django.po +4 -4
  218. wagtail/contrib/redirects/locale/hr_HR/LC_MESSAGES/django.po +8 -8
  219. wagtail/contrib/redirects/locale/hu/LC_MESSAGES/django.po +6 -6
  220. wagtail/contrib/redirects/locale/id_ID/LC_MESSAGES/django.po +4 -4
  221. wagtail/contrib/redirects/locale/is_IS/LC_MESSAGES/django.po +6 -6
  222. wagtail/contrib/redirects/locale/it/LC_MESSAGES/django.po +4 -4
  223. wagtail/contrib/redirects/locale/ja/LC_MESSAGES/django.po +2 -2
  224. wagtail/contrib/redirects/locale/ko/LC_MESSAGES/django.po +4 -4
  225. wagtail/contrib/redirects/locale/lt/LC_MESSAGES/django.po +4 -4
  226. wagtail/contrib/redirects/locale/mn/LC_MESSAGES/django.po +4 -4
  227. wagtail/contrib/redirects/locale/nb/LC_MESSAGES/django.po +4 -4
  228. wagtail/contrib/redirects/locale/nl/LC_MESSAGES/django.po +4 -4
  229. wagtail/contrib/redirects/locale/pl/LC_MESSAGES/django.po +9 -9
  230. wagtail/contrib/redirects/locale/pt_BR/LC_MESSAGES/django.po +5 -5
  231. wagtail/contrib/redirects/locale/pt_PT/LC_MESSAGES/django.po +4 -4
  232. wagtail/contrib/redirects/locale/ro/LC_MESSAGES/django.po +4 -4
  233. wagtail/contrib/redirects/locale/ru/LC_MESSAGES/django.po +7 -7
  234. wagtail/contrib/redirects/locale/sk_SK/LC_MESSAGES/django.po +4 -4
  235. wagtail/contrib/redirects/locale/sl/LC_MESSAGES/django.po +6 -6
  236. wagtail/contrib/redirects/locale/sr/LC_MESSAGES/django.po +2 -2
  237. wagtail/contrib/redirects/locale/sv/LC_MESSAGES/django.po +4 -4
  238. wagtail/contrib/redirects/locale/tet/LC_MESSAGES/django.po +4 -4
  239. wagtail/contrib/redirects/locale/th/LC_MESSAGES/django.po +4 -4
  240. wagtail/contrib/redirects/locale/tr/LC_MESSAGES/django.po +4 -4
  241. wagtail/contrib/redirects/locale/tr_TR/LC_MESSAGES/django.po +4 -4
  242. wagtail/contrib/redirects/locale/uk/LC_MESSAGES/django.po +4 -4
  243. wagtail/contrib/redirects/locale/zh/LC_MESSAGES/django.po +4 -4
  244. wagtail/contrib/redirects/locale/zh_Hans/LC_MESSAGES/django.po +4 -4
  245. wagtail/contrib/redirects/locale/zh_Hant/LC_MESSAGES/django.po +4 -4
  246. wagtail/contrib/redirects/models.py +6 -5
  247. wagtail/contrib/redirects/templates/wagtailredirects/edit.html +1 -38
  248. wagtail/contrib/redirects/tests/test_redirects.py +141 -1
  249. wagtail/contrib/redirects/urls.py +1 -2
  250. wagtail/contrib/redirects/views.py +39 -80
  251. wagtail/contrib/routable_page/models.py +6 -4
  252. wagtail/contrib/routable_page/tests.py +11 -0
  253. wagtail/contrib/search_promotions/locale/ar/LC_MESSAGES/django.po +4 -4
  254. wagtail/contrib/search_promotions/locale/be/LC_MESSAGES/django.po +7 -7
  255. wagtail/contrib/search_promotions/locale/ca/LC_MESSAGES/django.po +8 -8
  256. wagtail/contrib/search_promotions/locale/cs/LC_MESSAGES/django.po +2 -2
  257. wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.po +4 -4
  258. wagtail/contrib/search_promotions/locale/de/LC_MESSAGES/django.po +6 -6
  259. wagtail/contrib/search_promotions/locale/el/LC_MESSAGES/django.po +4 -4
  260. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +1 -1
  261. wagtail/contrib/search_promotions/locale/es/LC_MESSAGES/django.po +6 -6
  262. wagtail/contrib/search_promotions/locale/et/LC_MESSAGES/django.po +4 -4
  263. wagtail/contrib/search_promotions/locale/fa/LC_MESSAGES/django.po +4 -4
  264. wagtail/contrib/search_promotions/locale/fi/LC_MESSAGES/django.po +6 -6
  265. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.mo +0 -0
  266. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +9 -6
  267. wagtail/contrib/search_promotions/locale/gl/LC_MESSAGES/django.po +6 -6
  268. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +8 -8
  269. wagtail/contrib/search_promotions/locale/hu/LC_MESSAGES/django.po +4 -4
  270. wagtail/contrib/search_promotions/locale/id_ID/LC_MESSAGES/django.po +4 -4
  271. wagtail/contrib/search_promotions/locale/is_IS/LC_MESSAGES/django.po +8 -8
  272. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +6 -6
  273. wagtail/contrib/search_promotions/locale/ja/LC_MESSAGES/django.po +4 -4
  274. wagtail/contrib/search_promotions/locale/ko/LC_MESSAGES/django.po +4 -4
  275. wagtail/contrib/search_promotions/locale/lt/LC_MESSAGES/django.po +6 -6
  276. wagtail/contrib/search_promotions/locale/nb/LC_MESSAGES/django.po +4 -4
  277. wagtail/contrib/search_promotions/locale/nl/LC_MESSAGES/django.po +6 -6
  278. wagtail/contrib/search_promotions/locale/pl/LC_MESSAGES/django.po +9 -9
  279. wagtail/contrib/search_promotions/locale/pt_BR/LC_MESSAGES/django.po +4 -4
  280. wagtail/contrib/search_promotions/locale/pt_PT/LC_MESSAGES/django.po +4 -4
  281. wagtail/contrib/search_promotions/locale/ro/LC_MESSAGES/django.po +4 -4
  282. wagtail/contrib/search_promotions/locale/ru/LC_MESSAGES/django.po +9 -9
  283. wagtail/contrib/search_promotions/locale/sk_SK/LC_MESSAGES/django.po +4 -4
  284. wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.mo +0 -0
  285. wagtail/contrib/search_promotions/locale/sl/LC_MESSAGES/django.po +62 -8
  286. wagtail/contrib/search_promotions/locale/sr/LC_MESSAGES/django.po +2 -2
  287. wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.mo +0 -0
  288. wagtail/contrib/search_promotions/locale/sv/LC_MESSAGES/django.po +9 -6
  289. wagtail/contrib/search_promotions/locale/th/LC_MESSAGES/django.po +4 -4
  290. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.po +4 -4
  291. wagtail/contrib/search_promotions/locale/tr_TR/LC_MESSAGES/django.po +4 -4
  292. wagtail/contrib/search_promotions/locale/uk/LC_MESSAGES/django.po +4 -4
  293. wagtail/contrib/search_promotions/locale/zh_Hans/LC_MESSAGES/django.po +2 -2
  294. wagtail/contrib/search_promotions/locale/zh_Hant/LC_MESSAGES/django.po +2 -2
  295. wagtail/contrib/settings/locale/be/LC_MESSAGES/django.po +3 -3
  296. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +4 -4
  297. wagtail/contrib/settings/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  298. wagtail/contrib/settings/locale/pl/LC_MESSAGES/django.po +3 -3
  299. wagtail/contrib/settings/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  300. wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.po +3 -3
  301. wagtail/contrib/settings/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  302. wagtail/contrib/settings/locale/sk_SK/LC_MESSAGES/django.po +10 -1
  303. wagtail/contrib/settings/locale/sl/LC_MESSAGES/django.po +2 -2
  304. wagtail/contrib/settings/locale/sr/LC_MESSAGES/django.po +2 -2
  305. wagtail/contrib/simple_translation/locale/be/LC_MESSAGES/django.po +3 -3
  306. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +5 -1
  307. wagtail/contrib/simple_translation/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  308. wagtail/contrib/simple_translation/locale/pl/LC_MESSAGES/django.po +3 -3
  309. wagtail/contrib/simple_translation/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  310. wagtail/contrib/simple_translation/locale/ru/LC_MESSAGES/django.po +3 -3
  311. wagtail/contrib/simple_translation/locale/sl/LC_MESSAGES/django.po +2 -2
  312. wagtail/contrib/simple_translation/models.py +2 -1
  313. wagtail/contrib/styleguide/locale/be/LC_MESSAGES/django.po +3 -3
  314. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  315. wagtail/contrib/styleguide/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  316. wagtail/contrib/styleguide/locale/pl/LC_MESSAGES/django.po +3 -3
  317. wagtail/contrib/styleguide/locale/ru/LC_MESSAGES/django.po +3 -3
  318. wagtail/contrib/styleguide/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  319. wagtail/contrib/styleguide/locale/sk_SK/LC_MESSAGES/django.po +5 -1
  320. wagtail/contrib/styleguide/locale/sl/LC_MESSAGES/django.po +2 -2
  321. wagtail/contrib/styleguide/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  322. wagtail/contrib/styleguide/locale/zh_Hans/LC_MESSAGES/django.po +3 -0
  323. wagtail/contrib/table_block/locale/be/LC_MESSAGES/django.po +3 -3
  324. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  325. wagtail/contrib/table_block/locale/fr/LC_MESSAGES/django.mo +0 -0
  326. wagtail/contrib/table_block/locale/fr/LC_MESSAGES/django.po +27 -1
  327. wagtail/contrib/table_block/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  328. wagtail/contrib/table_block/locale/pl/LC_MESSAGES/django.po +3 -3
  329. wagtail/contrib/table_block/locale/ru/LC_MESSAGES/django.po +3 -3
  330. wagtail/contrib/table_block/locale/sl/LC_MESSAGES/django.mo +0 -0
  331. wagtail/contrib/table_block/locale/sl/LC_MESSAGES/django.po +29 -3
  332. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  333. wagtail/contrib/typed_table_block/blocks.py +19 -0
  334. wagtail/contrib/typed_table_block/locale/be/LC_MESSAGES/django.po +3 -3
  335. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  336. wagtail/contrib/typed_table_block/locale/fr/LC_MESSAGES/django.mo +0 -0
  337. wagtail/contrib/typed_table_block/locale/fr/LC_MESSAGES/django.po +12 -1
  338. wagtail/contrib/typed_table_block/locale/pl/LC_MESSAGES/django.po +3 -3
  339. wagtail/contrib/typed_table_block/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  340. wagtail/contrib/typed_table_block/locale/ru/LC_MESSAGES/django.po +3 -3
  341. wagtail/contrib/typed_table_block/locale/sl/LC_MESSAGES/django.mo +0 -0
  342. wagtail/contrib/typed_table_block/locale/sl/LC_MESSAGES/django.po +14 -4
  343. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  344. wagtail/contrib/typed_table_block/tests.py +38 -0
  345. wagtail/coreutils.py +1 -1
  346. wagtail/documents/__init__.py +1 -1
  347. wagtail/documents/locale/ar/LC_MESSAGES/django.po +8 -8
  348. wagtail/documents/locale/be/LC_MESSAGES/django.po +11 -11
  349. wagtail/documents/locale/bg/LC_MESSAGES/django.po +4 -4
  350. wagtail/documents/locale/ca/LC_MESSAGES/django.mo +0 -0
  351. wagtail/documents/locale/ca/LC_MESSAGES/django.po +12 -11
  352. wagtail/documents/locale/cs/LC_MESSAGES/django.po +6 -6
  353. wagtail/documents/locale/de/LC_MESSAGES/django.po +10 -8
  354. wagtail/documents/locale/el/LC_MESSAGES/django.po +8 -8
  355. wagtail/documents/locale/en/LC_MESSAGES/django.po +8 -8
  356. wagtail/documents/locale/es/LC_MESSAGES/django.po +8 -8
  357. wagtail/documents/locale/et/LC_MESSAGES/django.po +6 -6
  358. wagtail/documents/locale/fa/LC_MESSAGES/django.mo +0 -0
  359. wagtail/documents/locale/fa/LC_MESSAGES/django.po +17 -8
  360. wagtail/documents/locale/fi/LC_MESSAGES/django.po +10 -10
  361. wagtail/documents/locale/fr/LC_MESSAGES/django.po +6 -6
  362. wagtail/documents/locale/gl/LC_MESSAGES/django.po +8 -8
  363. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +14 -14
  364. wagtail/documents/locale/hu/LC_MESSAGES/django.po +12 -12
  365. wagtail/documents/locale/id_ID/LC_MESSAGES/django.po +6 -6
  366. wagtail/documents/locale/is_IS/LC_MESSAGES/django.po +8 -8
  367. wagtail/documents/locale/it/LC_MESSAGES/django.po +8 -8
  368. wagtail/documents/locale/ja/LC_MESSAGES/django.po +8 -8
  369. wagtail/documents/locale/ko/LC_MESSAGES/django.po +8 -8
  370. wagtail/documents/locale/lt/LC_MESSAGES/django.po +8 -8
  371. wagtail/documents/locale/mi/LC_MESSAGES/django.po +10 -10
  372. wagtail/documents/locale/mn/LC_MESSAGES/django.po +5 -4
  373. wagtail/documents/locale/nb/LC_MESSAGES/django.po +6 -6
  374. wagtail/documents/locale/nl/LC_MESSAGES/django.po +8 -8
  375. wagtail/documents/locale/pl/LC_MESSAGES/django.po +11 -11
  376. wagtail/documents/locale/pt_BR/LC_MESSAGES/django.po +8 -8
  377. wagtail/documents/locale/pt_PT/LC_MESSAGES/django.po +8 -8
  378. wagtail/documents/locale/ro/LC_MESSAGES/django.po +8 -8
  379. wagtail/documents/locale/ru/LC_MESSAGES/django.po +9 -9
  380. wagtail/documents/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  381. wagtail/documents/locale/sk_SK/LC_MESSAGES/django.po +55 -12
  382. wagtail/documents/locale/sl/LC_MESSAGES/django.mo +0 -0
  383. wagtail/documents/locale/sl/LC_MESSAGES/django.po +30 -10
  384. wagtail/documents/locale/sr/LC_MESSAGES/django.po +2 -2
  385. wagtail/documents/locale/sv/LC_MESSAGES/django.po +6 -6
  386. wagtail/documents/locale/th/LC_MESSAGES/django.po +8 -8
  387. wagtail/documents/locale/tr/LC_MESSAGES/django.po +8 -8
  388. wagtail/documents/locale/tr_TR/LC_MESSAGES/django.po +8 -8
  389. wagtail/documents/locale/uk/LC_MESSAGES/django.po +8 -8
  390. wagtail/documents/locale/zh/LC_MESSAGES/django.po +2 -2
  391. wagtail/documents/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  392. wagtail/documents/locale/zh_Hans/LC_MESSAGES/django.po +11 -5
  393. wagtail/documents/locale/zh_Hant/LC_MESSAGES/django.po +4 -4
  394. wagtail/documents/models.py +5 -1
  395. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  396. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  397. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  398. wagtail/documents/tests/test_models.py +5 -1
  399. wagtail/embeds/apps.py +2 -0
  400. wagtail/embeds/embeds.py +12 -14
  401. wagtail/embeds/finders/__init__.py +2 -0
  402. wagtail/embeds/finders/facebook.py +17 -33
  403. wagtail/embeds/finders/instagram.py +19 -16
  404. wagtail/embeds/locale/be/LC_MESSAGES/django.po +3 -3
  405. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  406. wagtail/embeds/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  407. wagtail/embeds/locale/pl/LC_MESSAGES/django.po +3 -3
  408. wagtail/embeds/locale/ru/LC_MESSAGES/django.po +3 -3
  409. wagtail/embeds/locale/sl/LC_MESSAGES/django.po +2 -2
  410. wagtail/embeds/signal_handlers.py +13 -0
  411. wagtail/embeds/tests/test_embeds.py +7 -7
  412. wagtail/fields.py +58 -14
  413. wagtail/images/__init__.py +1 -1
  414. wagtail/images/locale/ar/LC_MESSAGES/django.po +6 -6
  415. wagtail/images/locale/be/LC_MESSAGES/django.po +3 -3
  416. wagtail/images/locale/ca/LC_MESSAGES/django.po +8 -8
  417. wagtail/images/locale/cs/LC_MESSAGES/django.po +8 -8
  418. wagtail/images/locale/cy/LC_MESSAGES/django.po +8 -8
  419. wagtail/images/locale/de/LC_MESSAGES/django.po +6 -6
  420. wagtail/images/locale/el/LC_MESSAGES/django.po +8 -8
  421. wagtail/images/locale/en/LC_MESSAGES/django.po +34 -34
  422. wagtail/images/locale/es/LC_MESSAGES/django.po +10 -10
  423. wagtail/images/locale/et/LC_MESSAGES/django.po +8 -8
  424. wagtail/images/locale/fa/LC_MESSAGES/django.mo +0 -0
  425. wagtail/images/locale/fa/LC_MESSAGES/django.po +28 -9
  426. wagtail/images/locale/fi/LC_MESSAGES/django.po +8 -8
  427. wagtail/images/locale/fr/LC_MESSAGES/django.po +6 -6
  428. wagtail/images/locale/gl/LC_MESSAGES/django.po +8 -8
  429. wagtail/images/locale/hr_HR/LC_MESSAGES/django.po +8 -8
  430. wagtail/images/locale/hu/LC_MESSAGES/django.po +8 -8
  431. wagtail/images/locale/id_ID/LC_MESSAGES/django.po +6 -6
  432. wagtail/images/locale/is_IS/LC_MESSAGES/django.po +8 -8
  433. wagtail/images/locale/it/LC_MESSAGES/django.po +8 -8
  434. wagtail/images/locale/ja/LC_MESSAGES/django.po +8 -8
  435. wagtail/images/locale/ko/LC_MESSAGES/django.po +6 -6
  436. wagtail/images/locale/lt/LC_MESSAGES/django.po +8 -8
  437. wagtail/images/locale/nb/LC_MESSAGES/django.po +8 -8
  438. wagtail/images/locale/nl/LC_MESSAGES/django.po +8 -8
  439. wagtail/images/locale/pl/LC_MESSAGES/django.po +11 -11
  440. wagtail/images/locale/pt_BR/LC_MESSAGES/django.po +8 -8
  441. wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +8 -8
  442. wagtail/images/locale/ro/LC_MESSAGES/django.po +8 -8
  443. wagtail/images/locale/ru/LC_MESSAGES/django.po +11 -11
  444. wagtail/images/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  445. wagtail/images/locale/sk_SK/LC_MESSAGES/django.po +23 -8
  446. wagtail/images/locale/sl/LC_MESSAGES/django.mo +0 -0
  447. wagtail/images/locale/sl/LC_MESSAGES/django.po +44 -12
  448. wagtail/images/locale/sv/LC_MESSAGES/django.mo +0 -0
  449. wagtail/images/locale/sv/LC_MESSAGES/django.po +20 -8
  450. wagtail/images/locale/tet/LC_MESSAGES/django.po +4 -4
  451. wagtail/images/locale/th/LC_MESSAGES/django.po +8 -8
  452. wagtail/images/locale/tr/LC_MESSAGES/django.po +6 -6
  453. wagtail/images/locale/tr_TR/LC_MESSAGES/django.po +6 -6
  454. wagtail/images/locale/uk/LC_MESSAGES/django.po +8 -8
  455. wagtail/images/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  456. wagtail/images/locale/zh_Hans/LC_MESSAGES/django.po +49 -5
  457. wagtail/images/locale/zh_Hant/LC_MESSAGES/django.po +4 -4
  458. wagtail/images/models.py +3 -0
  459. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  460. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  461. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  462. wagtail/images/templates/wagtailimages/images/edit.html +4 -4
  463. wagtail/images/tests/test_admin_views.py +58 -2
  464. wagtail/images/tests/test_image_operations.py +12 -0
  465. wagtail/images/tests/tests.py +27 -2
  466. wagtail/images/views/chooser.py +6 -1
  467. wagtail/images/views/images.py +7 -3
  468. wagtail/images/views/serve.py +1 -0
  469. wagtail/locale/be/LC_MESSAGES/django.po +3 -3
  470. wagtail/locale/en/LC_MESSAGES/django.po +84 -80
  471. wagtail/locale/fa/LC_MESSAGES/django.mo +0 -0
  472. wagtail/locale/fa/LC_MESSAGES/django.po +3 -0
  473. wagtail/locale/fr/LC_MESSAGES/django.mo +0 -0
  474. wagtail/locale/fr/LC_MESSAGES/django.po +23 -4
  475. wagtail/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  476. wagtail/locale/pl/LC_MESSAGES/django.po +3 -3
  477. wagtail/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  478. wagtail/locale/ru/LC_MESSAGES/django.po +3 -3
  479. wagtail/locale/sl/LC_MESSAGES/django.po +2 -2
  480. wagtail/locale/sv/LC_MESSAGES/django.mo +0 -0
  481. wagtail/locale/sv/LC_MESSAGES/django.po +11 -2
  482. wagtail/locales/locale/be/LC_MESSAGES/django.po +3 -3
  483. wagtail/locales/locale/en/LC_MESSAGES/django.po +2 -2
  484. wagtail/locales/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  485. wagtail/locales/locale/pl/LC_MESSAGES/django.po +3 -3
  486. wagtail/locales/locale/ru/LC_MESSAGES/django.po +3 -3
  487. wagtail/locales/locale/sl/LC_MESSAGES/django.po +2 -2
  488. wagtail/locales/tests.py +16 -0
  489. wagtail/locales/wagtail_hooks.py +0 -9
  490. wagtail/migrations/0094_alter_page_locale.py +19 -0
  491. wagtail/models/__init__.py +11 -5
  492. wagtail/models/i18n.py +6 -1
  493. wagtail/project_template/requirements.txt +1 -1
  494. wagtail/search/locale/be/LC_MESSAGES/django.po +3 -3
  495. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  496. wagtail/search/locale/fa/LC_MESSAGES/django.mo +0 -0
  497. wagtail/search/locale/fa/LC_MESSAGES/django.po +24 -0
  498. wagtail/search/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  499. wagtail/search/locale/pl/LC_MESSAGES/django.po +3 -3
  500. wagtail/search/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  501. wagtail/search/locale/pt_BR/LC_MESSAGES/django.po +2 -2
  502. wagtail/search/locale/ru/LC_MESSAGES/django.po +3 -3
  503. wagtail/search/locale/sl/LC_MESSAGES/django.po +2 -2
  504. wagtail/search/tests/test_queries.py +24 -0
  505. wagtail/search/utils.py +6 -12
  506. wagtail/signals.py +4 -0
  507. wagtail/sites/locale/be/LC_MESSAGES/django.po +3 -3
  508. wagtail/sites/locale/en/LC_MESSAGES/django.po +2 -2
  509. wagtail/sites/locale/hr_HR/LC_MESSAGES/django.po +2 -2
  510. wagtail/sites/locale/pl/LC_MESSAGES/django.po +3 -3
  511. wagtail/sites/locale/ru/LC_MESSAGES/django.po +3 -3
  512. wagtail/sites/locale/sl/LC_MESSAGES/django.po +2 -2
  513. wagtail/sites/locale/sr/LC_MESSAGES/django.po +2 -2
  514. wagtail/sites/tests.py +15 -0
  515. wagtail/sites/wagtail_hooks.py +0 -9
  516. wagtail/snippets/locale/be/LC_MESSAGES/django.po +3 -3
  517. wagtail/snippets/locale/ca/LC_MESSAGES/django.po +6 -6
  518. wagtail/snippets/locale/de/LC_MESSAGES/django.po +5 -5
  519. wagtail/snippets/locale/en/LC_MESSAGES/django.po +9 -9
  520. wagtail/snippets/locale/es/LC_MESSAGES/django.po +6 -6
  521. wagtail/snippets/locale/fa/LC_MESSAGES/django.mo +0 -0
  522. wagtail/snippets/locale/fa/LC_MESSAGES/django.po +17 -1
  523. wagtail/snippets/locale/fr/LC_MESSAGES/django.po +5 -5
  524. wagtail/snippets/locale/gl/LC_MESSAGES/django.po +6 -6
  525. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +8 -8
  526. wagtail/snippets/locale/hu/LC_MESSAGES/django.po +7 -7
  527. wagtail/snippets/locale/is_IS/LC_MESSAGES/django.po +5 -5
  528. wagtail/snippets/locale/it/LC_MESSAGES/django.po +5 -5
  529. wagtail/snippets/locale/ko/LC_MESSAGES/django.po +6 -6
  530. wagtail/snippets/locale/nb/LC_MESSAGES/django.po +6 -6
  531. wagtail/snippets/locale/nl/LC_MESSAGES/django.po +8 -8
  532. wagtail/snippets/locale/pl/LC_MESSAGES/django.po +9 -9
  533. wagtail/snippets/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  534. wagtail/snippets/locale/ro/LC_MESSAGES/django.po +6 -6
  535. wagtail/snippets/locale/ru/LC_MESSAGES/django.po +8 -8
  536. wagtail/snippets/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  537. wagtail/snippets/locale/sk_SK/LC_MESSAGES/django.po +3 -0
  538. wagtail/snippets/locale/sl/LC_MESSAGES/django.po +8 -8
  539. wagtail/snippets/locale/sr/LC_MESSAGES/django.po +2 -2
  540. wagtail/snippets/locale/sv/LC_MESSAGES/django.po +6 -6
  541. wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  542. wagtail/snippets/locale/zh_Hans/LC_MESSAGES/django.po +40 -1
  543. wagtail/snippets/permissions.py +5 -3
  544. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  545. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  546. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/menu.html +1 -1
  547. wagtail/snippets/tests/test_snippets.py +78 -12
  548. wagtail/snippets/tests/test_viewset.py +22 -0
  549. wagtail/snippets/views/snippets.py +19 -14
  550. wagtail/snippets/wagtail_hooks.py +2 -10
  551. wagtail/templatetags/wagtailcore_tags.py +3 -0
  552. wagtail/test/dummy_external_storage.py +1 -1
  553. wagtail/test/i18n/migrations/0003_alter_clusterabletestmodel_locale_and_more.py +40 -0
  554. wagtail/test/routablepage/models.py +4 -0
  555. wagtail/test/snippets/migrations/0012_alter_translatablesnippet_locale.py +20 -0
  556. wagtail/test/testapp/migrations/0038_sociallink.py +52 -0
  557. wagtail/test/testapp/migrations/0039_alter_eventcategory_locale_and_more.py +45 -0
  558. wagtail/test/testapp/models.py +24 -0
  559. wagtail/test/testapp/views.py +1 -0
  560. wagtail/test/testapp/wagtail_hooks.py +9 -0
  561. wagtail/test/urls_multilang.py +6 -1
  562. wagtail/test/urls_multilang_non_root.py +11 -0
  563. wagtail/tests/streamfield_migrations/test_migrations.py +53 -12
  564. wagtail/tests/test_audit_log.py +72 -2
  565. wagtail/tests/test_blocks.py +103 -0
  566. wagtail/tests/test_signals.py +49 -2
  567. wagtail/tests/test_streamfield.py +153 -0
  568. wagtail/tests/test_utils.py +42 -1
  569. wagtail/tests/tests.py +5 -0
  570. wagtail/users/apps.py +1 -0
  571. wagtail/users/forms.py +7 -0
  572. wagtail/users/locale/ar/LC_MESSAGES/django.po +4 -4
  573. wagtail/users/locale/be/LC_MESSAGES/django.po +9 -9
  574. wagtail/users/locale/ca/LC_MESSAGES/django.po +8 -8
  575. wagtail/users/locale/cs/LC_MESSAGES/django.po +6 -6
  576. wagtail/users/locale/cy/LC_MESSAGES/django.po +8 -8
  577. wagtail/users/locale/de/LC_MESSAGES/django.po +8 -8
  578. wagtail/users/locale/el/LC_MESSAGES/django.po +4 -4
  579. wagtail/users/locale/en/LC_MESSAGES/django.po +55 -50
  580. wagtail/users/locale/es/LC_MESSAGES/django.po +8 -8
  581. wagtail/users/locale/et/LC_MESSAGES/django.po +8 -8
  582. wagtail/users/locale/fa/LC_MESSAGES/django.mo +0 -0
  583. wagtail/users/locale/fa/LC_MESSAGES/django.po +69 -7
  584. wagtail/users/locale/fi/LC_MESSAGES/django.po +8 -8
  585. wagtail/users/locale/fr/LC_MESSAGES/django.mo +0 -0
  586. wagtail/users/locale/fr/LC_MESSAGES/django.po +52 -11
  587. wagtail/users/locale/gl/LC_MESSAGES/django.po +8 -8
  588. wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +10 -10
  589. wagtail/users/locale/hu/LC_MESSAGES/django.po +8 -8
  590. wagtail/users/locale/id_ID/LC_MESSAGES/django.po +4 -4
  591. wagtail/users/locale/is_IS/LC_MESSAGES/django.po +8 -8
  592. wagtail/users/locale/it/LC_MESSAGES/django.po +8 -8
  593. wagtail/users/locale/ja/LC_MESSAGES/django.po +4 -4
  594. wagtail/users/locale/ko/LC_MESSAGES/django.po +4 -4
  595. wagtail/users/locale/lt/LC_MESSAGES/django.po +4 -4
  596. wagtail/users/locale/lv/LC_MESSAGES/django.po +4 -4
  597. wagtail/users/locale/mn/LC_MESSAGES/django.po +5 -4
  598. wagtail/users/locale/nb/LC_MESSAGES/django.po +8 -8
  599. wagtail/users/locale/nl/LC_MESSAGES/django.po +6 -6
  600. wagtail/users/locale/pl/LC_MESSAGES/django.po +9 -9
  601. wagtail/users/locale/pt_BR/LC_MESSAGES/django.po +9 -9
  602. wagtail/users/locale/pt_PT/LC_MESSAGES/django.po +8 -8
  603. wagtail/users/locale/ro/LC_MESSAGES/django.po +8 -8
  604. wagtail/users/locale/ru/LC_MESSAGES/django.po +11 -11
  605. wagtail/users/locale/sk_SK/LC_MESSAGES/django.mo +0 -0
  606. wagtail/users/locale/sk_SK/LC_MESSAGES/django.po +12 -5
  607. wagtail/users/locale/sl/LC_MESSAGES/django.mo +0 -0
  608. wagtail/users/locale/sl/LC_MESSAGES/django.po +56 -12
  609. wagtail/users/locale/sv/LC_MESSAGES/django.mo +0 -0
  610. wagtail/users/locale/sv/LC_MESSAGES/django.po +49 -10
  611. wagtail/users/locale/tet/LC_MESSAGES/django.po +4 -4
  612. wagtail/users/locale/th/LC_MESSAGES/django.po +4 -4
  613. wagtail/users/locale/tr/LC_MESSAGES/django.po +4 -4
  614. wagtail/users/locale/tr_TR/LC_MESSAGES/django.po +4 -4
  615. wagtail/users/locale/uk/LC_MESSAGES/django.po +8 -8
  616. wagtail/users/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  617. wagtail/users/locale/zh_Hans/LC_MESSAGES/django.po +49 -5
  618. wagtail/users/locale/zh_Hant/LC_MESSAGES/django.po +2 -2
  619. wagtail/users/models.py +1 -0
  620. wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +3 -2
  621. wagtail/users/templatetags/wagtailusers_tags.py +9 -0
  622. wagtail/users/tests/__init__.py +7 -1
  623. wagtail/users/tests/test_admin_views.py +117 -32
  624. wagtail/users/views/groups.py +4 -0
  625. wagtail/users/views/users.py +58 -14
  626. wagtail/users/wagtail_hooks.py +7 -123
  627. wagtail/utils/utils.py +27 -0
  628. wagtail/utils/version.py +5 -2
  629. wagtail-6.2rc1.dist-info/METADATA +78 -0
  630. {wagtail-6.1.2.dist-info → wagtail-6.2rc1.dist-info}/RECORD +634 -607
  631. {wagtail-6.1.2.dist-info → wagtail-6.2rc1.dist-info}/WHEEL +1 -1
  632. wagtail/admin/templates/wagtailadmin/reports/aging_pages.html +0 -58
  633. wagtail/admin/templates/wagtailadmin/reports/page_types_usage.html +0 -18
  634. wagtail/admin/templates/wagtailadmin/reports/site_history.html +0 -57
  635. wagtail/admin/templates/wagtailadmin/reports/workflow.html +0 -81
  636. wagtail/admin/templates/wagtailadmin/reports/workflow_tasks.html +0 -63
  637. wagtail/contrib/frontend_cache/backends.py +0 -400
  638. wagtail/contrib/redirects/templates/wagtailredirects/list.html +0 -43
  639. wagtail/contrib/redirects/templates/wagtailredirects/reports/redirects_report.html +0 -14
  640. wagtail/contrib/redirects/tests/test_reports_view.py +0 -82
  641. wagtail-6.1.2.dist-info/METADATA +0 -78
  642. {wagtail-6.1.2.dist-info → wagtail-6.2rc1.dist-info}/LICENSE +0 -0
  643. {wagtail-6.1.2.dist-info → wagtail-6.2rc1.dist-info}/entry_points.txt +0 -0
  644. {wagtail-6.1.2.dist-info → wagtail-6.2rc1.dist-info}/top_level.txt +0 -0
@@ -189,11 +189,11 @@ msgstr ""
189
189
 
190
190
  #, python-format
191
191
  msgid ""
192
- "No redirects have been created. Why not <a href="
193
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
192
+ "No redirects have been created. Why not <a "
193
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
194
194
  msgstr ""
195
- "Er zijn nog geen doorverwijzingen aangemaakt. Waarom <a href="
196
- "\"%(wagtailredirects_add_redirect_url)s\">voeg je er niet een toe</a>?"
195
+ "Er zijn nog geen doorverwijzingen aangemaakt. Waarom <a "
196
+ "href=\"%(wagtailredirects_add_redirect_url)s\">voeg je er niet een toe</a>?"
197
197
 
198
198
  msgid "Site"
199
199
  msgstr "Site"
@@ -25,9 +25,9 @@ msgstr ""
25
25
  "Content-Type: text/plain; charset=UTF-8\n"
26
26
  "Content-Transfer-Encoding: 8bit\n"
27
27
  "Language: pl\n"
28
- "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
29
- "%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
30
- "%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
28
+ "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && "
29
+ "(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && "
30
+ "n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
31
31
 
32
32
  msgid "Wagtail redirects"
33
33
  msgstr "Przekierowania Wagtail"
@@ -189,16 +189,16 @@ msgstr "Kontynuuj"
189
189
  #, python-format
190
190
  msgid "Sorry, no redirects match \"<em>%(query_string)s</em>\""
191
191
  msgstr ""
192
- "Przepraszamy, żadne przekierowanie nie pasuje do \"<em>%(query_string)s</em>"
193
- "\""
192
+ "Przepraszamy, żadne przekierowanie nie pasuje do \"<em>%(query_string)s</"
193
+ "em>\""
194
194
 
195
195
  #, python-format
196
196
  msgid ""
197
- "No redirects have been created. Why not <a href="
198
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
197
+ "No redirects have been created. Why not <a "
198
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
199
199
  msgstr ""
200
- "Nie zostały stworzone żadne przekierowania. Czemu nie <a href="
201
- "\"%(wagtailredirects_add_redirect_url)s\">dodać jakiegoś</a>?"
200
+ "Nie zostały stworzone żadne przekierowania. Czemu nie <a "
201
+ "href=\"%(wagtailredirects_add_redirect_url)s\">dodać jakiegoś</a>?"
202
202
 
203
203
  msgid "Site"
204
204
  msgstr "Serwis"
@@ -11,7 +11,7 @@
11
11
  # Iuri L. Machado, 2021-2022
12
12
  # João Luiz Lorencetti <me@dirtycoder.net>, 2016
13
13
  # Luiz Boaretto <lboaretto@gmail.com>, 2018
14
- # Rodrigo de Almeida Sottomaior Macedo <sottomaiormacedotec@gmail.com>, 2022
14
+ # Rodrigo de Almeida Sottomaior Macedo <sottomaiormacedotec@sottomaiormacedo.tech>, 2022
15
15
  # Thiago Cangussu <cangussu.thg@gmail.com>, 2014
16
16
  # Thiago Cangussu <cng.thg@gmail.com>, 2014
17
17
  msgid ""
@@ -196,11 +196,11 @@ msgstr ""
196
196
 
197
197
  #, python-format
198
198
  msgid ""
199
- "No redirects have been created. Why not <a href="
200
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
199
+ "No redirects have been created. Why not <a "
200
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
201
201
  msgstr ""
202
- "Não há redirecionamentos criados. Por que não foi <a href="
203
- "\"%(wagtailredirects_add_redirect_url)s\">adicionado</a>?"
202
+ "Não há redirecionamentos criados. Por que não foi <a "
203
+ "href=\"%(wagtailredirects_add_redirect_url)s\">adicionado</a>?"
204
204
 
205
205
  msgid "Site"
206
206
  msgstr "Site"
@@ -179,11 +179,11 @@ msgstr ""
179
179
 
180
180
  #, python-format
181
181
  msgid ""
182
- "No redirects have been created. Why not <a href="
183
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
182
+ "No redirects have been created. Why not <a "
183
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
184
184
  msgstr ""
185
- "Ainda não foi criado nenhum redirecionamento. Que tal <a href="
186
- "\"%(wagtailredirects_add_redirect_url)s\">adicionar um</a>?"
185
+ "Ainda não foi criado nenhum redirecionamento. Que tal <a "
186
+ "href=\"%(wagtailredirects_add_redirect_url)s\">adicionar um</a>?"
187
187
 
188
188
  msgid "Site"
189
189
  msgstr "Site"
@@ -187,11 +187,11 @@ msgstr ""
187
187
 
188
188
  #, python-format
189
189
  msgid ""
190
- "No redirects have been created. Why not <a href="
191
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
190
+ "No redirects have been created. Why not <a "
191
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
192
192
  msgstr ""
193
- "Nu a fost creată nici o redirecție. De ce să nu <a href="
194
- "\"%(wagtailredirects_add_redirect_url)s\">adăugați una</a>?"
193
+ "Nu a fost creată nici o redirecție. De ce să nu <a "
194
+ "href=\"%(wagtailredirects_add_redirect_url)s\">adăugați una</a>?"
195
195
 
196
196
  msgid "Site"
197
197
  msgstr "Sait"
@@ -24,9 +24,9 @@ msgstr ""
24
24
  "Content-Type: text/plain; charset=UTF-8\n"
25
25
  "Content-Transfer-Encoding: 8bit\n"
26
26
  "Language: ru\n"
27
- "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
28
- "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
29
- "%100>=11 && n%100<=14)? 2 : 3);\n"
27
+ "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
28
+ "n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
29
+ "(n%100>=11 && n%100<=14)? 2 : 3);\n"
30
30
 
31
31
  msgid "Wagtail redirects"
32
32
  msgstr "Перенаправления Wagtail"
@@ -192,11 +192,11 @@ msgstr ""
192
192
 
193
193
  #, python-format
194
194
  msgid ""
195
- "No redirects have been created. Why not <a href="
196
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
195
+ "No redirects have been created. Why not <a "
196
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
197
197
  msgstr ""
198
- "Перенаправления еще не созданы. Почему бы не <a href="
199
- "\"%(wagtailredirects_add_redirect_url)s\">добавить одно</a>?"
198
+ "Перенаправления еще не созданы. Почему бы не <a "
199
+ "href=\"%(wagtailredirects_add_redirect_url)s\">добавить одно</a>?"
200
200
 
201
201
  msgid "Site"
202
202
  msgstr "Сайт"
@@ -114,11 +114,11 @@ msgstr ""
114
114
 
115
115
  #, python-format
116
116
  msgid ""
117
- "No redirects have been created. Why not <a href="
118
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
117
+ "No redirects have been created. Why not <a "
118
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
119
119
  msgstr ""
120
- "Zatiaľ neboli vytvorené žiadne presmerovania. Prečo nevytvoriť <a href="
121
- "\"%(wagtailredirects_add_redirect_url)s\">jedno presmerovanie teraz</a>?"
120
+ "Zatiaľ neboli vytvorené žiadne presmerovania. Prečo nevytvoriť <a "
121
+ "href=\"%(wagtailredirects_add_redirect_url)s\">jedno presmerovanie teraz</a>?"
122
122
 
123
123
  msgid "Site"
124
124
  msgstr "Stránka"
@@ -21,8 +21,8 @@ msgstr ""
21
21
  "Content-Type: text/plain; charset=UTF-8\n"
22
22
  "Content-Transfer-Encoding: 8bit\n"
23
23
  "Language: sl\n"
24
- "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
25
- "%100==4 ? 2 : 3);\n"
24
+ "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
25
+ "n%100==4 ? 2 : 3);\n"
26
26
 
27
27
  msgid "Wagtail redirects"
28
28
  msgstr "Wagtail preusmeritve"
@@ -188,11 +188,11 @@ msgstr ""
188
188
 
189
189
  #, python-format
190
190
  msgid ""
191
- "No redirects have been created. Why not <a href="
192
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
191
+ "No redirects have been created. Why not <a "
192
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
193
193
  msgstr ""
194
- "Dodana ni še nobena preusmeritev. Zakaj je nebi <a href="
195
- "\"%(wagtailredirects_add_redirect_url)s\">dodali</a>?"
194
+ "Dodana ni še nobena preusmeritev. Zakaj je nebi <a "
195
+ "href=\"%(wagtailredirects_add_redirect_url)s\">dodali</a>?"
196
196
 
197
197
  msgid "Site"
198
198
  msgstr "Spletno mesto"
@@ -16,8 +16,8 @@ msgstr ""
16
16
  "Content-Type: text/plain; charset=UTF-8\n"
17
17
  "Content-Transfer-Encoding: 8bit\n"
18
18
  "Language: sr\n"
19
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
20
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
19
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
20
+ "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
21
21
 
22
22
  msgid "Site"
23
23
  msgstr "Sajt"
@@ -186,11 +186,11 @@ msgstr "Ledsen, inga omdirigeringar matchar \"<em>%(query_string)s</em>\""
186
186
 
187
187
  #, python-format
188
188
  msgid ""
189
- "No redirects have been created. Why not <a href="
190
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
189
+ "No redirects have been created. Why not <a "
190
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
191
191
  msgstr ""
192
- "Inga omdirigeringar har skapats. Varför inte <a href="
193
- "\"%(wagtailredirects_add_redirect_url)s\">skapa en</a>?"
192
+ "Inga omdirigeringar har skapats. Varför inte <a "
193
+ "href=\"%(wagtailredirects_add_redirect_url)s\">skapa en</a>?"
194
194
 
195
195
  msgid "Site"
196
196
  msgstr "Sajt"
@@ -110,11 +110,11 @@ msgstr "Diskulpa, laiha dalan hanesan \"<em>%(query_string)s</em>\""
110
110
 
111
111
  #, python-format
112
112
  msgid ""
113
- "No redirects have been created. Why not <a href="
114
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
113
+ "No redirects have been created. Why not <a "
114
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
115
115
  msgstr ""
116
- "Laiha dalan ne'ebe mak kria ona. Tamba sa <a href="
117
- "\"%(wagtailredirects_add_redirect_url)s\">hatama ida</a>?"
116
+ "Laiha dalan ne'ebe mak kria ona. Tamba sa <a "
117
+ "href=\"%(wagtailredirects_add_redirect_url)s\">hatama ida</a>?"
118
118
 
119
119
  msgid "Site"
120
120
  msgstr "situs"
@@ -109,11 +109,11 @@ msgstr "ขออภัย,ไม่มีการเปลี่ยนทิ
109
109
 
110
110
  #, python-format
111
111
  msgid ""
112
- "No redirects have been created. Why not <a href="
113
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
112
+ "No redirects have been created. Why not <a "
113
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
114
114
  msgstr ""
115
- "ไม่มีการกำคุณไม่หนดทิศทางถูกสร้างขึ้น ทำไมคุณไม่<a href="
116
- "\"%(wagtailredirects_add_redirect_url)s\">เพิ่มหนึ่งอัน</a>?"
115
+ "ไม่มีการกำคุณไม่หนดทิศทางถูกสร้างขึ้น ทำไมคุณไม่<a "
116
+ "href=\"%(wagtailredirects_add_redirect_url)s\">เพิ่มหนึ่งอัน</a>?"
117
117
 
118
118
  msgid "Site"
119
119
  msgstr "เว็บไซด์"
@@ -114,11 +114,11 @@ msgstr "Üzgünüm, \"<em>%(query_string)s</em>\" ile eşleşen yönlendirme yok
114
114
 
115
115
  #, python-format
116
116
  msgid ""
117
- "No redirects have been created. Why not <a href="
118
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
117
+ "No redirects have been created. Why not <a "
118
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
119
119
  msgstr ""
120
- "Hiç yönedirme oluşturulmadı. Neden <a href="
121
- "\"%(wagtailredirects_add_redirect_url)s\">bir tane eklemiyorsunuz</a>?"
120
+ "Hiç yönedirme oluşturulmadı. Neden <a "
121
+ "href=\"%(wagtailredirects_add_redirect_url)s\">bir tane eklemiyorsunuz</a>?"
122
122
 
123
123
  msgid "Site"
124
124
  msgstr "Site"
@@ -116,11 +116,11 @@ msgstr "Üzgünüm, \"<em>%(query_string)s</em>\" ile eşleşen yönlendirme yok
116
116
 
117
117
  #, python-format
118
118
  msgid ""
119
- "No redirects have been created. Why not <a href="
120
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
119
+ "No redirects have been created. Why not <a "
120
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
121
121
  msgstr ""
122
- "Hiç yönedirme oluşturulmadı. Neden <a href="
123
- "\"%(wagtailredirects_add_redirect_url)s\">bir tane eklemiyorsunuz</a>?"
122
+ "Hiç yönedirme oluşturulmadı. Neden <a "
123
+ "href=\"%(wagtailredirects_add_redirect_url)s\">bir tane eklemiyorsunuz</a>?"
124
124
 
125
125
  msgid "Site"
126
126
  msgstr "Site"
@@ -169,11 +169,11 @@ msgstr ""
169
169
 
170
170
  #, python-format
171
171
  msgid ""
172
- "No redirects have been created. Why not <a href="
173
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
172
+ "No redirects have been created. Why not <a "
173
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
174
174
  msgstr ""
175
- "Ще немає жодного перенаправлення. Чому б не <a href="
176
- "\"%(wagtailredirects_add_redirect_url)s\">створити якесь</a>?"
175
+ "Ще немає жодного перенаправлення. Чому б не <a "
176
+ "href=\"%(wagtailredirects_add_redirect_url)s\">створити якесь</a>?"
177
177
 
178
178
  msgid "Site"
179
179
  msgstr "Сайт"
@@ -62,11 +62,11 @@ msgstr "到"
62
62
 
63
63
  #, python-format
64
64
  msgid ""
65
- "No redirects have been created. Why not <a href="
66
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
65
+ "No redirects have been created. Why not <a "
66
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
67
67
  msgstr ""
68
- "没有任何已保存的转向。为什么不 <a href="
69
- "\"%(wagtailredirects_add_redirect_url)s\">添加一个</a>?"
68
+ "没有任何已保存的转向。为什么不 <a "
69
+ "href=\"%(wagtailredirects_add_redirect_url)s\">添加一个</a>?"
70
70
 
71
71
  msgid "The redirect could not be saved due to errors."
72
72
  msgstr "由于多个错误,转向设置无法保存。"
@@ -173,11 +173,11 @@ msgstr "对不起,没有重定向符合\"<em>%(query_string)s</em>\""
173
173
 
174
174
  #, python-format
175
175
  msgid ""
176
- "No redirects have been created. Why not <a href="
177
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
176
+ "No redirects have been created. Why not <a "
177
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
178
178
  msgstr ""
179
- "还没有创建过重定向呢。为何不 <a href=\"%(wagtailredirects_add_redirect_url)s"
180
- "\">创建一个</a>?"
179
+ "还没有创建过重定向呢。为何不 <a "
180
+ "href=\"%(wagtailredirects_add_redirect_url)s\">创建一个</a>?"
181
181
 
182
182
  msgid "Site"
183
183
  msgstr "站点"
@@ -129,11 +129,11 @@ msgstr "對不起,沒有重定向符合\"<em>%(query_string)s</em>\""
129
129
 
130
130
  #, python-format
131
131
  msgid ""
132
- "No redirects have been created. Why not <a href="
133
- "\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
132
+ "No redirects have been created. Why not <a "
133
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
134
134
  msgstr ""
135
- "還沒有創建過重定向呢。為何不 <a href=\"%(wagtailredirects_add_redirect_url)s"
136
- "\">創建一個</a>?"
135
+ "還沒有創建過重定向呢。為何不 <a "
136
+ "href=\"%(wagtailredirects_add_redirect_url)s\">創建一個</a>?"
137
137
 
138
138
  msgid "Site"
139
139
  msgstr "站點"
@@ -2,6 +2,7 @@ from urllib.parse import urlparse
2
2
 
3
3
  from django.db import models
4
4
  from django.urls import Resolver404
5
+ from django.utils.functional import cached_property
5
6
  from django.utils.translation import gettext_lazy as _
6
7
 
7
8
  from wagtail.models import Page
@@ -63,10 +64,10 @@ class Redirect(models.Model):
63
64
  def __str__(self):
64
65
  return self.title
65
66
 
66
- @property
67
+ @cached_property
67
68
  def link(self):
68
69
  if self.redirect_page:
69
- page = self.redirect_page.specific
70
+ page = self.redirect_page.specific_deferred
70
71
  base_url = page.url
71
72
  if not self.redirect_page_route_path:
72
73
  return base_url
@@ -145,7 +146,7 @@ class Redirect(models.Model):
145
146
  url_parsed = urlparse(url)
146
147
 
147
148
  # Path must start with / but not end with /
148
- path = url_parsed[2]
149
+ path = url_parsed.path
149
150
  if not path.startswith("/"):
150
151
  path = "/" + path
151
152
 
@@ -153,12 +154,12 @@ class Redirect(models.Model):
153
154
  path = path[:-1]
154
155
 
155
156
  # Parameters must be sorted alphabetically
156
- parameters = url_parsed[3]
157
+ parameters = url_parsed.params
157
158
  parameters_components = parameters.split(";")
158
159
  parameters = ";".join(sorted(parameters_components))
159
160
 
160
161
  # Query string components must be sorted alphabetically
161
- query_string = url_parsed[4]
162
+ query_string = url_parsed.query
162
163
  query_string_components = query_string.split("&")
163
164
  query_string = "&".join(sorted(query_string_components))
164
165
 
@@ -1,38 +1 @@
1
- {% extends "wagtailadmin/base.html" %}
2
- {% load i18n wagtailadmin_tags %}
3
- {% block titletag %}{% blocktrans trimmed with title=redirect.title %}Editing {{ title }}{% endblocktrans %}{% endblock %}
4
- {% block content %}
5
- {% trans "Editing" as editing_str %}
6
- {% include "wagtailadmin/shared/header.html" with title=editing_str subtitle=redirect.title icon="redirect" %}
7
-
8
- {% include "wagtailadmin/shared/non_field_errors.html" %}
9
-
10
- <form action="{% url 'wagtailredirects:edit' redirect.id %}" method="POST" class="nice-padding" novalidate>
11
- {% csrf_token %}
12
-
13
- <ul class="fields">
14
- {% for field in form.visible_fields %}
15
- <li>{% formattedfield field %}</li>
16
- {% endfor %}
17
-
18
- <li>
19
- <input type="submit" value="{% trans 'Save' %}" class="button" />
20
- {% if user_can_delete %}
21
- <a href="{% url 'wagtailredirects:delete' redirect.id %}" class="button no">{% trans "Delete redirect" %}</a>
22
- {% endif %}
23
- </li>
24
- </ul>
25
- </form>
26
-
27
- {% endblock %}
28
-
29
- {% block extra_js %}
30
- {{ block.super }}
31
- {% include "wagtailadmin/pages/_editor_js.html" %}
32
- {{ form.media.js }}
33
- {% endblock %}
34
-
35
- {% block extra_css %}
36
- {{ block.super }}
37
- {{ form.media.css }}
38
- {% endblock %}
1
+ {% extends "wagtailadmin/generic/edit.html" %}
@@ -1,6 +1,10 @@
1
+ from io import BytesIO
2
+
1
3
  from django.conf import settings
4
+ from django.contrib.auth.models import Permission
2
5
  from django.test import TestCase, override_settings
3
6
  from django.urls import reverse
7
+ from openpyxl.reader.excel import load_workbook
4
8
 
5
9
  from wagtail.admin.admin_url_finder import AdminURLFinder
6
10
  from wagtail.contrib.redirects import models
@@ -592,7 +596,14 @@ class TestRedirects(TestCase):
592
596
  self.assertIs(redirect.is_permanent, True)
593
597
 
594
598
 
599
+ @override_settings(
600
+ CACHES={"default": {"BACKEND": "django.core.cache.backends.locmem.LocMemCache"}}
601
+ )
595
602
  class TestRedirectsIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
603
+ @classmethod
604
+ def setUpTestData(cls):
605
+ cls.site = Site.objects.first()
606
+
596
607
  def setUp(self):
597
608
  self.login()
598
609
 
@@ -607,6 +618,7 @@ class TestRedirectsIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase)
607
618
  [{"url": "", "label": "Redirects"}],
608
619
  response.content,
609
620
  )
621
+ self.assertContains(response, "No redirects have been created")
610
622
 
611
623
  def test_search(self):
612
624
  models.Redirect.objects.create(
@@ -692,6 +704,94 @@ class TestRedirectsIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase)
692
704
  (ordering,),
693
705
  )
694
706
 
707
+ def test_filtering_by_type(self):
708
+ temp_redirect = models.Redirect.add_redirect("/from", "/to", False)
709
+ perm_redirect = models.Redirect.add_redirect("/cat", "/dog", True)
710
+
711
+ response = self.get(params={"is_permanent": "True"})
712
+
713
+ self.assertContains(response, perm_redirect.old_path)
714
+ self.assertNotContains(response, temp_redirect.old_path)
715
+
716
+ def test_filtering_by_site(self):
717
+ site_redirect = models.Redirect.add_redirect("/cat", "/dog")
718
+ site_redirect.site = self.site
719
+ site_redirect.save()
720
+ nosite_redirect = models.Redirect.add_redirect("/from", "/to")
721
+
722
+ response = self.get(params={"site": self.site.pk})
723
+
724
+ self.assertContains(response, site_redirect.old_path)
725
+ self.assertNotContains(response, nosite_redirect.old_path)
726
+
727
+ def test_csv_export(self):
728
+ models.Redirect.add_redirect("/from", "/to", False)
729
+
730
+ # Session, User, UserProfile, Redirects
731
+ with self.assertNumQueries(4):
732
+ response = self.get(params={"export": "csv"})
733
+
734
+ csv_data = response.getvalue().decode().split("\n")
735
+
736
+ self.assertEqual(response.status_code, 200)
737
+ csv_header = csv_data[0]
738
+ csv_entries = csv_data[1:]
739
+ csv_entries = csv_entries[:-1] # Drop empty last line
740
+
741
+ self.assertEqual(csv_header, "From,To,Type,Site\r")
742
+ self.assertEqual(len(csv_entries), 1)
743
+ self.assertEqual(csv_entries[0], "/from,/to,temporary,\r")
744
+
745
+ def test_xlsx_export(self):
746
+ models.Redirect.add_redirect("/from", "/to", True)
747
+
748
+ # Session, User, UserProfile, Redirects
749
+ with self.assertNumQueries(4):
750
+ response = self.get(params={"export": "xlsx"})
751
+ workbook_data = response.getvalue()
752
+
753
+ self.assertEqual(response.status_code, 200)
754
+
755
+ worksheet = load_workbook(filename=BytesIO(workbook_data))["Sheet1"]
756
+ cell_array = [[cell.value for cell in row] for row in worksheet.rows]
757
+
758
+ self.assertEqual(cell_array[0], ["From", "To", "Type", "Site"])
759
+ self.assertEqual(len(cell_array), 2)
760
+ self.assertEqual(cell_array[1], ["/from", "/to", "permanent", None])
761
+
762
+ def test_num_queries_in_export(self):
763
+ page = Page.objects.get(id=2)
764
+ for i in range(3):
765
+ models.Redirect.add_redirect(f"/from{i}", "/to", False)
766
+ models.Redirect.add_redirect(f"/from-site{i}", "/to", False, site=self.site)
767
+ models.Redirect.add_redirect(f"/to-page{i}", page, False)
768
+
769
+ response = self.get(params={"export": "csv"})
770
+ csv_data = response.getvalue().decode().strip().split("\n")
771
+ # Session, User, UserProfile, Redirects
772
+ with self.assertNumQueries(4):
773
+ response = self.get(params={"export": "csv"})
774
+ csv_data = response.getvalue().decode().strip().split("\n")
775
+
776
+ self.assertEqual(len(csv_data), 10)
777
+
778
+ def test_redirect_page_filter_only_includes_relevant_pages(self):
779
+ """
780
+ The redirect_page filter should only include pages referenced by Redirect objects.
781
+ """
782
+ response = self.get()
783
+ request = response.context["request"]
784
+ qs = response.context["filters"].filters["redirect_page"].queryset(request)
785
+ self.assertQuerySetEqual(qs, Page.objects.none())
786
+
787
+ page = Page.objects.get(id=2)
788
+ models.Redirect.add_redirect("/to-page", page, False)
789
+
790
+ response = self.get()
791
+ request = response.context["request"]
792
+ qs = response.context["filters"].filters["redirect_page"].queryset(request)
793
+ self.assertQuerySetEqual(qs, Page.objects.filter(pk=2))
794
+
695
795
 
696
796
  class TestRedirectsAddView(WagtailTestUtils, TestCase):
697
797
  fixtures = ["test.json"]
@@ -849,7 +949,7 @@ class TestRedirectsAddView(WagtailTestUtils, TestCase):
849
949
  self.assertIsNone(redirects.first().site)
850
950
 
851
951
 
852
- class TestRedirectsEditView(WagtailTestUtils, TestCase):
952
+ class TestRedirectsEditView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
853
953
  def setUp(self):
854
954
  # Create a redirect to edit
855
955
  self.redirect = models.Redirect(
@@ -876,6 +976,13 @@ class TestRedirectsEditView(WagtailTestUtils, TestCase):
876
976
  response = self.get()
877
977
  self.assertEqual(response.status_code, 200)
878
978
  self.assertTemplateUsed(response, "wagtailredirects/edit.html")
979
+ self.assertBreadcrumbsItemsRendered(
980
+ [
981
+ {"url": reverse("wagtailredirects:index"), "label": "Redirects"},
982
+ {"url": "", "label": "/test"},
983
+ ],
984
+ response.content,
985
+ )
879
986
 
880
987
  url_finder = AdminURLFinder(self.user)
881
988
  expected_url = "/admin/redirects/%d/" % self.redirect.id
@@ -957,6 +1064,39 @@ class TestRedirectsEditView(WagtailTestUtils, TestCase):
957
1064
  # Should not redirect to index
958
1065
  self.assertEqual(response.status_code, 200)
959
1066
 
1067
+ def test_get_with_no_permission(self, redirect_id=None):
1068
+ self.user.is_superuser = False
1069
+ self.user.save()
1070
+ # Only basic access_admin permission is given
1071
+ self.user.user_permissions.add(
1072
+ Permission.objects.get(
1073
+ content_type__app_label="wagtailadmin",
1074
+ codename="access_admin",
1075
+ )
1076
+ )
1077
+
1078
+ response = self.get()
1079
+ self.assertEqual(response.status_code, 302)
1080
+ self.assertRedirects(response, reverse("wagtailadmin_home"))
1081
+
1082
+ def test_get_with_edit_permission_only(self):
1083
+ self.user.is_superuser = False
1084
+ self.user.save()
1085
+ self.user.user_permissions.add(
1086
+ Permission.objects.get(
1087
+ content_type__app_label="wagtailadmin",
1088
+ codename="access_admin",
1089
+ ),
1090
+ Permission.objects.get(
1091
+ content_type__app_label="wagtailredirects",
1092
+ codename="change_redirect",
1093
+ ),
1094
+ )
1095
+
1096
+ response = self.get()
1097
+ self.assertEqual(response.status_code, 200)
1098
+ self.assertTemplateUsed(response, "wagtailredirects/edit.html")
1099
+
960
1100
 
961
1101
  class TestRedirectsDeleteView(WagtailTestUtils, TestCase):
962
1102
  def setUp(self):
@@ -7,9 +7,8 @@ urlpatterns = [
7
7
  path("", views.IndexView.as_view(), name="index"),
8
8
  path("results/", views.IndexView.as_view(results_only=True), name="index_results"),
9
9
  path("add/", views.add, name="add"),
10
- path("<int:redirect_id>/", views.edit, name="edit"),
10
+ path("<int:redirect_id>/", views.EditView.as_view(), name="edit"),
11
11
  path("<int:redirect_id>/delete/", views.delete, name="delete"),
12
12
  path("import/", views.start_import, name="start_import"),
13
13
  path("import/process/", views.process_import, name="process_import"),
14
- path("report", views.RedirectsReportView.as_view(), name="report"),
15
14
  ]