wagtail 6.0.1__py3-none-any.whl → 6.1rc1__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 (512) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/admin/checks.py +51 -0
  3. wagtail/admin/compare.py +1 -1
  4. wagtail/admin/filters.py +70 -1
  5. wagtail/admin/forms/account.py +1 -1
  6. wagtail/admin/forms/collections.py +15 -0
  7. wagtail/admin/forms/pages.py +49 -0
  8. wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
  9. wagtail/admin/locale/ca/LC_MESSAGES/django.po +122 -0
  10. wagtail/admin/locale/de/LC_MESSAGES/django.mo +0 -0
  11. wagtail/admin/locale/de/LC_MESSAGES/django.po +5 -5
  12. wagtail/admin/locale/en/LC_MESSAGES/django.po +474 -385
  13. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +3 -3
  14. wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
  15. wagtail/admin/locale/es/LC_MESSAGES/django.po +6 -6
  16. wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
  17. wagtail/admin/locale/fr/LC_MESSAGES/django.po +70 -3
  18. wagtail/admin/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  19. wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +2 -6
  20. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.mo +0 -0
  21. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.po +2 -2
  22. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  23. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +4 -0
  24. wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
  25. wagtail/admin/locale/hu/LC_MESSAGES/django.po +142 -2
  26. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  27. wagtail/admin/locale/it/LC_MESSAGES/django.po +80 -8
  28. wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
  29. wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +14 -2
  30. wagtail/admin/locale/lv/LC_MESSAGES/django.mo +0 -0
  31. wagtail/admin/locale/lv/LC_MESSAGES/django.po +154 -1
  32. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  33. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +73 -2
  34. wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
  35. wagtail/admin/locale/ro/LC_MESSAGES/django.po +3 -3
  36. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  37. wagtail/admin/locale/sl/LC_MESSAGES/django.po +145 -2
  38. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  39. wagtail/admin/locale/sv/LC_MESSAGES/django.po +77 -3
  40. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  41. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +17 -1
  42. wagtail/admin/panels/comment_panel.py +1 -1
  43. wagtail/admin/panels/field_panel.py +1 -1
  44. wagtail/admin/rich_text/converters/editor_html.py +3 -1
  45. wagtail/admin/rich_text/editors/draftail/__init__.py +28 -2
  46. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  47. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  48. wagtail/admin/static/wagtailadmin/images/favicon.ico +0 -0
  49. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  50. wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
  51. wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
  52. wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
  53. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  54. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  55. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -1
  56. wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
  57. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  58. wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
  59. wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
  60. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  61. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  62. wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
  63. wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
  64. wagtail/admin/static/wagtailadmin/js/preview-panel.js +1 -1
  65. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  66. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  67. wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
  68. wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
  69. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  70. wagtail/admin/static/wagtailadmin/js/telepath/telepath.js +1 -1
  71. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  72. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  73. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  74. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +4 -4
  75. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  76. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  77. wagtail/admin/staticfiles.py +1 -0
  78. wagtail/admin/templates/wagtailadmin/admin_base.html +1 -0
  79. wagtail/admin/templates/wagtailadmin/base.html +1 -0
  80. wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +3 -1
  81. wagtail/admin/templates/wagtailadmin/collections/edit.html +0 -1
  82. wagtail/admin/templates/wagtailadmin/collections/index_results.html +10 -0
  83. wagtail/admin/templates/wagtailadmin/generic/base.html +1 -9
  84. wagtail/admin/templates/wagtailadmin/generic/form.html +4 -2
  85. wagtail/admin/templates/wagtailadmin/generic/history/action_cell.html +27 -0
  86. wagtail/admin/templates/wagtailadmin/generic/index_results.html +8 -0
  87. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +3 -4
  88. wagtail/admin/templates/wagtailadmin/icons/keyboard.svg +1 -0
  89. wagtail/admin/templates/wagtailadmin/page_privacy/set_privacy.html +3 -1
  90. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -15
  91. wagtail/admin/templates/wagtailadmin/pages/action_menu/save_draft.html +3 -1
  92. wagtail/admin/templates/wagtailadmin/pages/choose_parent.html +17 -0
  93. wagtail/admin/templates/wagtailadmin/pages/explorable_index.html +8 -0
  94. wagtail/admin/templates/wagtailadmin/pages/history.html +1 -61
  95. wagtail/admin/templates/wagtailadmin/pages/index.html +1 -5
  96. wagtail/admin/templates/wagtailadmin/pages/listing/_locked_indicator.html +2 -2
  97. wagtail/admin/templates/wagtailadmin/pages/listing/_page_title_column_header.html +25 -27
  98. wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html +2 -1
  99. wagtail/admin/templates/wagtailadmin/panels/multi_field_panel_child.html +1 -1
  100. wagtail/admin/templates/wagtailadmin/panels/publishing/schedule_publishing_panel.html +3 -1
  101. wagtail/admin/templates/wagtailadmin/panels/tabbed_interface.html +1 -1
  102. wagtail/admin/templates/wagtailadmin/shared/active_filters.html +2 -1
  103. wagtail/admin/templates/wagtailadmin/shared/breadcrumbs.html +8 -0
  104. wagtail/admin/templates/wagtailadmin/shared/forms/single_checkbox.html +1 -1
  105. wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html +1 -1
  106. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +21 -9
  107. wagtail/admin/templates/wagtailadmin/shared/human_readable_date.html +1 -1
  108. wagtail/admin/templates/wagtailadmin/shared/keyboard_shortcuts_dialog.html +29 -0
  109. wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +2 -1
  110. wagtail/admin/templates/wagtailadmin/skeleton.html +2 -1
  111. wagtail/admin/templates/wagtailadmin/tables/related_objects_cell.html +9 -0
  112. wagtail/admin/templates/wagtailadmin/tables/title_cell.html +9 -7
  113. wagtail/admin/templates/wagtailadmin/widgets/draftail_rich_text_area.html +1 -1
  114. wagtail/admin/templates/wagtailadmin/workflows/create.html +6 -23
  115. wagtail/admin/templates/wagtailadmin/workflows/create_task.html +6 -15
  116. wagtail/admin/templates/wagtailadmin/workflows/edit.html +6 -23
  117. wagtail/admin/templates/wagtailadmin/workflows/edit_task.html +6 -13
  118. wagtail/admin/templates/wagtailadmin/workflows/includes/task_usage_cell.html +4 -4
  119. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_tasks_cell.html +18 -0
  120. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_title_cell.html +7 -0
  121. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_used_by_cell.html +25 -0
  122. wagtail/admin/templates/wagtailadmin/workflows/index.html +0 -99
  123. wagtail/admin/templates/wagtailadmin/workflows/index_results.html +10 -0
  124. wagtail/admin/templates/wagtailadmin/workflows/task_index.html +0 -30
  125. wagtail/admin/templates/wagtailadmin/workflows/task_index_results.html +10 -0
  126. wagtail/admin/templates/wagtailadmin/workflows/usage.html +1 -1
  127. wagtail/admin/templatetags/wagtailadmin_tags.py +116 -39
  128. wagtail/admin/tests/api/test_pages.py +26 -10
  129. wagtail/admin/tests/pages/test_create_page.py +10 -4
  130. wagtail/admin/tests/pages/test_custom_listing.py +37 -0
  131. wagtail/admin/tests/pages/test_edit_page.py +6 -6
  132. wagtail/admin/tests/pages/test_explorer_view.py +19 -18
  133. wagtail/admin/tests/pages/test_move_page.py +1 -1
  134. wagtail/admin/tests/pages/test_page_usage.py +50 -2
  135. wagtail/admin/tests/pages/test_parent_page_chooser_view.py +119 -0
  136. wagtail/admin/tests/pages/test_preview.py +18 -4
  137. wagtail/admin/tests/test_account_management.py +20 -1
  138. wagtail/admin/tests/test_audit_log.py +172 -5
  139. wagtail/admin/tests/test_checks.py +92 -0
  140. wagtail/admin/tests/test_collections_views.py +19 -5
  141. wagtail/admin/tests/test_compare.py +6 -6
  142. wagtail/admin/tests/test_dashboard.py +404 -0
  143. wagtail/admin/tests/test_dbwhitelister.py +4 -5
  144. wagtail/admin/tests/test_edit_handlers.py +2 -2
  145. wagtail/admin/tests/test_keyboard_shortcuts.py +84 -0
  146. wagtail/admin/tests/test_page_chooser.py +31 -18
  147. wagtail/admin/tests/test_privacy.py +36 -2
  148. wagtail/admin/tests/test_rich_text.py +168 -23
  149. wagtail/admin/tests/test_templatetags.py +411 -43
  150. wagtail/admin/tests/test_views.py +4 -2
  151. wagtail/admin/tests/test_workflows.py +531 -9
  152. wagtail/admin/tests/tests.py +3 -1
  153. wagtail/admin/tests/ui/test_tables.py +48 -1
  154. wagtail/admin/tests/viewsets/test_model_viewset.py +130 -23
  155. wagtail/admin/ui/side_panels.py +3 -1
  156. wagtail/admin/ui/tables/__init__.py +13 -1
  157. wagtail/admin/ui/tables/pages.py +17 -6
  158. wagtail/admin/urls/__init__.py +8 -3
  159. wagtail/admin/urls/pages.py +5 -0
  160. wagtail/admin/urls/workflows.py +10 -0
  161. wagtail/admin/views/chooser.py +20 -24
  162. wagtail/admin/views/collections.py +17 -1
  163. wagtail/admin/views/generic/base.py +34 -4
  164. wagtail/admin/views/generic/history.py +220 -51
  165. wagtail/admin/views/generic/mixins.py +7 -4
  166. wagtail/admin/views/generic/models.py +54 -47
  167. wagtail/admin/views/generic/multiple_upload.py +17 -8
  168. wagtail/admin/views/generic/usage.py +17 -11
  169. wagtail/admin/views/home.py +15 -12
  170. wagtail/admin/views/mixins.py +30 -0
  171. wagtail/admin/views/pages/choose_parent.py +73 -0
  172. wagtail/admin/views/pages/history.py +54 -66
  173. wagtail/admin/views/pages/listing.py +187 -106
  174. wagtail/admin/views/pages/usage.py +6 -1
  175. wagtail/admin/views/pages/utils.py +70 -1
  176. wagtail/admin/views/workflows.py +150 -21
  177. wagtail/admin/viewsets/model.py +2 -2
  178. wagtail/admin/viewsets/pages.py +77 -0
  179. wagtail/admin/wagtail_hooks.py +40 -2
  180. wagtail/admin/widgets/button.py +10 -10
  181. wagtail/api/v2/filters.py +1 -1
  182. wagtail/api/v2/tests/test_pages.py +1 -1
  183. wagtail/blocks/base.py +18 -9
  184. wagtail/blocks/field_block.py +9 -7
  185. wagtail/blocks/list_block.py +16 -6
  186. wagtail/blocks/static_block.py +3 -0
  187. wagtail/blocks/stream_block.py +58 -23
  188. wagtail/blocks/struct_block.py +15 -9
  189. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +39 -47
  190. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  191. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.po +2 -2
  192. wagtail/contrib/forms/models.py +5 -5
  193. wagtail/contrib/forms/templates/wagtailforms/list_submissions.html +44 -33
  194. wagtail/contrib/forms/templates/wagtailforms/submissions_index.html +2 -63
  195. wagtail/contrib/forms/tests/test_models.py +26 -0
  196. wagtail/contrib/forms/urls.py +6 -0
  197. wagtail/contrib/forms/views.py +52 -49
  198. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.mo +0 -0
  199. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +3 -3
  200. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +34 -42
  201. wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +2 -2
  202. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  203. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +2 -2
  204. wagtail/contrib/redirects/signal_handlers.py +1 -1
  205. wagtail/contrib/redirects/templates/wagtailredirects/index.html +1 -36
  206. wagtail/contrib/redirects/templates/wagtailredirects/index_results.html +18 -0
  207. wagtail/contrib/redirects/templates/wagtailredirects/redirect_target_cell.html +8 -0
  208. wagtail/contrib/redirects/tests/test_import_command.py +1 -1
  209. wagtail/contrib/redirects/tests/test_redirects.py +79 -8
  210. wagtail/contrib/redirects/urls.py +2 -1
  211. wagtail/contrib/redirects/views.py +85 -55
  212. wagtail/contrib/search_promotions/admin_urls.py +2 -1
  213. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +41 -64
  214. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +2 -2
  215. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  216. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +2 -2
  217. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  218. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +41 -2
  219. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
  220. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +9 -3
  221. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index.html +1 -16
  222. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index_results.html +11 -0
  223. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/list.html +0 -51
  224. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/results.html +3 -16
  225. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/search_promotion_column.html +15 -0
  226. wagtail/contrib/search_promotions/tests.py +122 -9
  227. wagtail/contrib/search_promotions/views.py +66 -65
  228. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +3 -3
  229. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  230. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.po +2 -2
  231. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.mo +0 -0
  232. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.po +6 -2
  233. wagtail/contrib/settings/registry.py +10 -5
  234. wagtail/contrib/settings/tests/generic/test_admin.py +9 -0
  235. wagtail/contrib/settings/tests/site_specific/test_admin.py +10 -1
  236. wagtail/contrib/settings/tests/site_specific/test_model.py +3 -3
  237. wagtail/contrib/settings/tests/site_specific/test_templates.py +1 -1
  238. wagtail/contrib/settings/views.py +3 -1
  239. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  240. wagtail/contrib/simple_translation/tests/test_wagtail_hooks.py +2 -2
  241. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  242. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  243. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +2 -2
  244. wagtail/contrib/table_block/blocks.py +2 -2
  245. wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
  246. wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.po +27 -2
  247. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  248. wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
  249. wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.po +27 -2
  250. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  251. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +27 -2
  252. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  253. wagtail/contrib/table_block/tests.py +6 -0
  254. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
  255. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +12 -2
  256. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
  257. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
  258. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +12 -2
  259. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  260. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +12 -2
  261. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  262. wagtail/coreutils.py +3 -2
  263. wagtail/documents/admin_urls.py +2 -2
  264. wagtail/documents/locale/en/LC_MESSAGES/django.po +22 -22
  265. wagtail/documents/locale/fr/LC_MESSAGES/django.po +2 -2
  266. wagtail/documents/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  267. wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +2 -2
  268. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  269. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +19 -2
  270. wagtail/documents/locale/hu/LC_MESSAGES/django.mo +0 -0
  271. wagtail/documents/locale/hu/LC_MESSAGES/django.po +16 -2
  272. wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
  273. wagtail/documents/locale/it/LC_MESSAGES/django.po +19 -2
  274. wagtail/documents/migrations/0013_delete_uploadeddocument.py +16 -0
  275. wagtail/documents/models.py +1 -20
  276. wagtail/documents/rich_text/__init__.py +11 -7
  277. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  278. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  279. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  280. wagtail/documents/templates/wagtaildocs/documents/index.html +0 -16
  281. wagtail/documents/tests/test_admin_views.py +155 -23
  282. wagtail/documents/tests/test_collection_privacy.py +55 -1
  283. wagtail/documents/tests/test_rich_text.py +14 -0
  284. wagtail/documents/views/documents.py +25 -22
  285. wagtail/documents/views/multiple.py +6 -7
  286. wagtail/documents/views/serve.py +16 -1
  287. wagtail/documents/wagtail_hooks.py +20 -15
  288. wagtail/embeds/blocks.py +5 -0
  289. wagtail/embeds/locale/en/LC_MESSAGES/django.po +2 -2
  290. wagtail/embeds/locale/fr/LC_MESSAGES/django.po +2 -2
  291. wagtail/embeds/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  292. wagtail/embeds/locale/he_IL/LC_MESSAGES/django.po +2 -2
  293. wagtail/embeds/rich_text/__init__.py +1 -1
  294. wagtail/embeds/tests/test_rich_text.py +14 -0
  295. wagtail/embeds/wagtail_hooks.py +4 -14
  296. wagtail/fields.py +3 -48
  297. wagtail/images/admin_urls.py +2 -2
  298. wagtail/images/check_files/wagtail.jpg +0 -0
  299. wagtail/images/check_files/wagtail.png +0 -0
  300. wagtail/images/fields.py +2 -0
  301. wagtail/images/image_operations.py +1 -1
  302. wagtail/images/locale/ca/LC_MESSAGES/django.mo +0 -0
  303. wagtail/images/locale/ca/LC_MESSAGES/django.po +12 -0
  304. wagtail/images/locale/en/LC_MESSAGES/django.po +33 -45
  305. wagtail/images/locale/fr/LC_MESSAGES/django.po +2 -2
  306. wagtail/images/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  307. wagtail/images/locale/he_IL/LC_MESSAGES/django.po +2 -2
  308. wagtail/images/locale/hu/LC_MESSAGES/django.mo +0 -0
  309. wagtail/images/locale/hu/LC_MESSAGES/django.po +28 -2
  310. wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
  311. wagtail/images/locale/it/LC_MESSAGES/django.po +14 -2
  312. wagtail/images/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  313. wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +4 -0
  314. wagtail/images/migrations/0026_delete_uploadedimage.py +16 -0
  315. wagtail/images/models.py +49 -43
  316. wagtail/images/rich_text/__init__.py +18 -8
  317. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  318. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  319. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  320. wagtail/images/templates/wagtailimages/images/image_listing_header.html +6 -0
  321. wagtail/images/templates/wagtailimages/images/index.html +11 -51
  322. wagtail/images/tests/test_admin_views.py +119 -62
  323. wagtail/images/tests/test_image_operations.py +10 -0
  324. wagtail/images/tests/test_models.py +35 -33
  325. wagtail/images/tests/test_rich_text.py +14 -0
  326. wagtail/images/tests/utils.py +1 -1
  327. wagtail/images/views/images.py +35 -64
  328. wagtail/images/views/multiple.py +6 -7
  329. wagtail/images/wagtail_hooks.py +4 -14
  330. wagtail/locale/en/LC_MESSAGES/django.po +150 -136
  331. wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
  332. wagtail/locale/es/LC_MESSAGES/django.po +3 -2
  333. wagtail/locale/fr/LC_MESSAGES/django.po +2 -2
  334. wagtail/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  335. wagtail/locale/he_IL/LC_MESSAGES/django.po +2 -2
  336. wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
  337. wagtail/locale/it/LC_MESSAGES/django.po +5 -5
  338. wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
  339. wagtail/locale/sl/LC_MESSAGES/django.po +27 -2
  340. wagtail/locales/locale/ar/LC_MESSAGES/django.po +1 -1
  341. wagtail/locales/locale/be/LC_MESSAGES/django.po +1 -1
  342. wagtail/locales/locale/bg/LC_MESSAGES/django.po +1 -1
  343. wagtail/locales/locale/ca/LC_MESSAGES/django.po +1 -1
  344. wagtail/locales/locale/cs/LC_MESSAGES/django.po +1 -1
  345. wagtail/locales/locale/cy/LC_MESSAGES/django.po +1 -1
  346. wagtail/locales/locale/da/LC_MESSAGES/django.po +1 -1
  347. wagtail/locales/locale/de/LC_MESSAGES/django.po +1 -1
  348. wagtail/locales/locale/el/LC_MESSAGES/django.po +1 -1
  349. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  350. wagtail/locales/locale/es/LC_MESSAGES/django.po +1 -1
  351. wagtail/locales/locale/et/LC_MESSAGES/django.po +2 -2
  352. wagtail/locales/locale/fa/LC_MESSAGES/django.po +1 -1
  353. wagtail/locales/locale/fi/LC_MESSAGES/django.po +1 -1
  354. wagtail/locales/locale/fr/LC_MESSAGES/django.po +1 -1
  355. wagtail/locales/locale/gl/LC_MESSAGES/django.po +1 -1
  356. wagtail/locales/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  357. wagtail/locales/locale/he_IL/LC_MESSAGES/django.po +3 -3
  358. wagtail/locales/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  359. wagtail/locales/locale/hu/LC_MESSAGES/django.po +1 -1
  360. wagtail/locales/locale/id_ID/LC_MESSAGES/django.po +1 -1
  361. wagtail/locales/locale/is_IS/LC_MESSAGES/django.po +1 -1
  362. wagtail/locales/locale/it/LC_MESSAGES/django.po +1 -1
  363. wagtail/locales/locale/ja/LC_MESSAGES/django.po +1 -1
  364. wagtail/locales/locale/ko/LC_MESSAGES/django.po +1 -1
  365. wagtail/locales/locale/lt/LC_MESSAGES/django.po +1 -1
  366. wagtail/locales/locale/lv/LC_MESSAGES/django.po +1 -1
  367. wagtail/locales/locale/mi/LC_MESSAGES/django.po +1 -1
  368. wagtail/locales/locale/mn/LC_MESSAGES/django.po +1 -1
  369. wagtail/locales/locale/my/LC_MESSAGES/django.po +1 -1
  370. wagtail/locales/locale/nb/LC_MESSAGES/django.po +1 -1
  371. wagtail/locales/locale/nl/LC_MESSAGES/django.po +1 -1
  372. wagtail/locales/locale/pl/LC_MESSAGES/django.po +1 -1
  373. wagtail/locales/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  374. wagtail/locales/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  375. wagtail/locales/locale/ro/LC_MESSAGES/django.po +1 -1
  376. wagtail/locales/locale/ru/LC_MESSAGES/django.po +1 -1
  377. wagtail/locales/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  378. wagtail/locales/locale/sl/LC_MESSAGES/django.po +1 -1
  379. wagtail/locales/locale/sv/LC_MESSAGES/django.po +1 -1
  380. wagtail/locales/locale/tet/LC_MESSAGES/django.po +1 -1
  381. wagtail/locales/locale/th/LC_MESSAGES/django.po +1 -1
  382. wagtail/locales/locale/tr/LC_MESSAGES/django.po +1 -1
  383. wagtail/locales/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  384. wagtail/locales/locale/uk/LC_MESSAGES/django.po +1 -1
  385. wagtail/locales/locale/vi/LC_MESSAGES/django.po +1 -1
  386. wagtail/locales/locale/zh/LC_MESSAGES/django.po +1 -1
  387. wagtail/locales/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  388. wagtail/locales/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  389. wagtail/locales/tests.py +18 -3
  390. wagtail/locales/views.py +0 -1
  391. wagtail/management/commands/rebuild_references_index.py +3 -1
  392. wagtail/migrations/0092_alter_collectionviewrestriction_password_and_more.py +33 -0
  393. wagtail/migrations/0093_uploadedfile.py +53 -0
  394. wagtail/models/__init__.py +147 -32
  395. wagtail/models/i18n.py +1 -1
  396. wagtail/models/{collections.py → media.py} +33 -2
  397. wagtail/models/reference_index.py +1 -1
  398. wagtail/models/view_restrictions.py +10 -3
  399. wagtail/project_template/project_name/settings/base.py +6 -0
  400. wagtail/project_template/requirements.txt +1 -1
  401. wagtail/rich_text/__init__.py +25 -8
  402. wagtail/rich_text/pages.py +19 -8
  403. wagtail/rich_text/rewriters.py +140 -68
  404. wagtail/search/backends/database/mysql/mysql.py +3 -3
  405. wagtail/search/backends/database/postgres/postgres.py +3 -3
  406. wagtail/search/backends/database/sqlite/sqlite.py +2 -2
  407. wagtail/search/backends/elasticsearch7.py +4 -0
  408. wagtail/search/locale/en/LC_MESSAGES/django.po +3 -3
  409. wagtail/search/tests/test_postgres_backend.py +50 -0
  410. wagtail/sites/locale/en/LC_MESSAGES/django.po +8 -8
  411. wagtail/sites/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  412. wagtail/sites/locale/he_IL/LC_MESSAGES/django.po +2 -2
  413. wagtail/sites/locale/ro/LC_MESSAGES/django.mo +0 -0
  414. wagtail/sites/locale/ro/LC_MESSAGES/django.po +3 -2
  415. wagtail/sites/tests.py +35 -9
  416. wagtail/sites/views.py +3 -1
  417. wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
  418. wagtail/snippets/locale/de/LC_MESSAGES/django.po +7 -8
  419. wagtail/snippets/locale/en/LC_MESSAGES/django.po +16 -56
  420. wagtail/snippets/locale/fr/LC_MESSAGES/django.po +2 -2
  421. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  422. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +2 -2
  423. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  424. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +6 -2
  425. wagtail/snippets/locale/lv/LC_MESSAGES/django.mo +0 -0
  426. wagtail/snippets/locale/lv/LC_MESSAGES/django.po +12 -0
  427. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  428. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +4 -0
  429. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  430. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  431. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/publish.html +3 -1
  432. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/save.html +3 -1
  433. wagtail/snippets/templates/wagtailsnippets/snippets/create.html +2 -3
  434. wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +2 -3
  435. wagtail/snippets/tests/test_preview.py +13 -2
  436. wagtail/snippets/tests/test_snippets.py +41 -16
  437. wagtail/snippets/tests/test_viewset.py +95 -18
  438. wagtail/snippets/tests/test_workflows.py +12 -0
  439. wagtail/snippets/views/snippets.py +1 -40
  440. wagtail/templatetags/wagtailcore_tags.py +1 -1
  441. wagtail/test/demosite/models.py +1 -1
  442. wagtail/test/middleware.py +14 -1
  443. wagtail/test/testapp/fixtures/test.json +20 -0
  444. wagtail/test/testapp/migrations/0001_squashed_0073_revisablechildmodel_secret_text.py +8 -8
  445. wagtail/test/testapp/migrations/0023_snippetchoosermodel_full_featured.py +1 -0
  446. wagtail/test/testapp/migrations/0034_custompermissionmodel.py +44 -0
  447. wagtail/test/testapp/migrations/0035_modelwithcustommanager.py +30 -0
  448. wagtail/test/testapp/migrations/0036_complexdefaultstreampage.py +28 -0
  449. wagtail/test/testapp/models.py +79 -2
  450. wagtail/test/testapp/templates/tests/custom_docs_password_required.html +10 -0
  451. wagtail/test/testapp/templates/tests/custom_page_password_required.html +10 -0
  452. wagtail/test/testapp/views.py +24 -2
  453. wagtail/test/testapp/wagtail_hooks.py +19 -0
  454. wagtail/test/utils/wagtail_tests.py +2 -2
  455. wagtail/tests/test_blocks.py +262 -1
  456. wagtail/tests/test_migrations.py +1 -1
  457. wagtail/tests/test_page_model.py +77 -0
  458. wagtail/tests/test_page_privacy.py +18 -1
  459. wagtail/tests/test_rich_text.py +95 -5
  460. wagtail/tests/test_streamfield.py +43 -0
  461. wagtail/tests/test_utils.py +8 -2
  462. wagtail/tests/test_views.py +52 -1
  463. wagtail/tests/test_whitelist.py +7 -7
  464. wagtail/users/forms.py +3 -1
  465. wagtail/users/locale/en/LC_MESSAGES/django.po +124 -96
  466. wagtail/users/locale/fr/LC_MESSAGES/django.po +2 -2
  467. wagtail/users/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  468. wagtail/users/locale/he_IL/LC_MESSAGES/django.po +2 -2
  469. wagtail/users/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  470. wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +13 -2
  471. wagtail/users/migrations/0013_userprofile_density.py +23 -0
  472. wagtail/users/models.py +14 -3
  473. wagtail/users/templates/wagtailusers/groups/create.html +1 -7
  474. wagtail/users/templates/wagtailusers/groups/edit.html +1 -13
  475. wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +46 -2
  476. wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -3
  477. wagtail/users/templates/wagtailusers/users/create.html +1 -14
  478. wagtail/users/templates/wagtailusers/users/edit.html +1 -14
  479. wagtail/users/templates/wagtailusers/users/index.html +2 -5
  480. wagtail/users/templates/wagtailusers/users/index_results.html +3 -13
  481. wagtail/users/templates/wagtailusers/users/user_cell.html +9 -0
  482. wagtail/users/templatetags/wagtailusers_tags.py +107 -20
  483. wagtail/users/tests/test_admin_views.py +669 -90
  484. wagtail/users/views/groups.py +58 -61
  485. wagtail/users/views/users.py +211 -92
  486. wagtail/users/wagtail_hooks.py +6 -38
  487. wagtail/users/widgets.py +3 -5
  488. wagtail/utils/text.py +1 -1
  489. wagtail/views.py +5 -9
  490. wagtail/whitelist.py +1 -1
  491. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/METADATA +5 -6
  492. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/RECORD +496 -477
  493. wagtail/admin/static/wagtailadmin/js/page-editor.js +0 -1
  494. wagtail/admin/static/wagtailadmin/js/vendor/mousetrap.min.js +0 -1
  495. wagtail/admin/static/wagtailadmin/js/vendor/urlify.js +0 -1
  496. wagtail/admin/static/wagtailadmin/js/vendor/xregexp.min.js +0 -1
  497. wagtail/admin/templates/wagtailadmin/collections/index.html +0 -34
  498. wagtail/admin/templates/wagtailadmin/pages/revisions/_actions.html +0 -22
  499. wagtail/admin/templates/wagtailadmin/shared/page_breadcrumbs.html +0 -55
  500. wagtail/admin/tests/pages/test_dashboard.py +0 -172
  501. wagtail/contrib/redirects/templates/wagtailredirects/results.html +0 -23
  502. wagtail/documents/templates/wagtaildocs/documents/list.html +0 -2
  503. wagtail/search/tests/test_postgres_stemming.py +0 -40
  504. wagtail/sites/templates/wagtailsites/create.html +0 -7
  505. wagtail/sites/templates/wagtailsites/edit.html +0 -7
  506. wagtail/snippets/templates/wagtailsnippets/snippets/revisions/_actions.html +0 -36
  507. wagtail/users/templates/wagtailusers/users/list.html +0 -62
  508. wagtail/users/urls/users.py +0 -12
  509. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/LICENSE +0 -0
  510. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/WHEEL +0 -0
  511. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/entry_points.txt +0 -0
  512. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/top_level.txt +0 -0
@@ -6,13 +6,15 @@ from django.core.exceptions import PermissionDenied
6
6
  from django.shortcuts import get_object_or_404, redirect
7
7
  from django.urls import reverse
8
8
  from django.utils.translation import gettext, gettext_lazy, ngettext
9
- from django.views.generic import ListView, TemplateView
9
+ from django.views.generic import TemplateView
10
+ from django_filters import DateFromToRangeFilter
10
11
 
11
12
  from wagtail.admin import messages
13
+ from wagtail.admin.filters import DateRangePickerWidget, WagtailFilterSet
12
14
  from wagtail.admin.ui.tables import Column, TitleColumn
13
15
  from wagtail.admin.views import generic
16
+ from wagtail.admin.views.generic.base import BaseListingView
14
17
  from wagtail.admin.views.mixins import SpreadsheetExportMixin
15
- from wagtail.contrib.forms.forms import SelectDateForm
16
18
  from wagtail.contrib.forms.utils import get_forms_for_user
17
19
  from wagtail.models import Page
18
20
 
@@ -70,8 +72,6 @@ class FormPagesListView(generic.IndexView):
70
72
  is_searchable = False
71
73
 
72
74
  def get_breadcrumbs_items(self):
73
- if not self.model:
74
- return self.breadcrumbs_items
75
75
  return self.breadcrumbs_items + [
76
76
  {"url": "", "label": self.page_title, "sublabel": gettext("Pages")},
77
77
  ]
@@ -144,22 +144,36 @@ class DeleteSubmissionsView(TemplateView):
144
144
  return context
145
145
 
146
146
 
147
- class SubmissionsListView(SpreadsheetExportMixin, ListView):
147
+ class SubmissionsListFilterSet(WagtailFilterSet):
148
+ date = DateFromToRangeFilter(
149
+ label=gettext_lazy("Submission date"),
150
+ field_name="submit_time",
151
+ widget=DateRangePickerWidget,
152
+ )
153
+
154
+
155
+ class SubmissionsListView(SpreadsheetExportMixin, BaseListingView):
148
156
  """Lists submissions for the provided form page"""
149
157
 
150
158
  template_name = "wagtailforms/submissions_index.html"
159
+ results_template_name = "wagtailforms/list_submissions.html"
151
160
  context_object_name = "submissions"
152
161
  form_page = None
153
- ordering = ("-submit_time",)
162
+ default_ordering = ("-submit_time",)
154
163
  ordering_csv = ("submit_time",) # keep legacy CSV ordering
155
164
  orderable_fields = (
156
165
  "id",
157
166
  "submit_time",
158
167
  ) # used to validate ordering in URL
159
168
  page_title = gettext_lazy("Form data")
160
- select_date_form = None
169
+ header_icon = "form"
161
170
  paginate_by = 20
162
- page_kwarg = "p"
171
+ filterset_class = SubmissionsListFilterSet
172
+ forms_index_url_name = "wagtailforms:index"
173
+ index_url_name = "wagtailforms:list_submissions"
174
+ index_results_url_name = "wagtailforms:list_submissions_results"
175
+ _show_breadcrumbs = True
176
+ show_export_buttons = True
163
177
 
164
178
  def dispatch(self, request, *args, **kwargs):
165
179
  """Check permissions and set the form page"""
@@ -177,29 +191,17 @@ class SubmissionsListView(SpreadsheetExportMixin, ListView):
177
191
 
178
192
  return super().dispatch(request, *args, **kwargs)
179
193
 
180
- def get_queryset(self):
181
- """Return queryset of form submissions with filter and order_by applied"""
194
+ def get_filterset_kwargs(self):
195
+ kwargs = super().get_filterset_kwargs()
196
+ kwargs["queryset"] = self.get_base_queryset()
197
+ return kwargs
198
+
199
+ def get_base_queryset(self):
200
+ """Return queryset of form submissions"""
182
201
  submission_class = self.form_page.get_submission_class()
183
202
  queryset = submission_class._default_manager.filter(page=self.form_page)
184
-
185
- filtering = self.get_filtering()
186
- if filtering and isinstance(filtering, dict):
187
- queryset = queryset.filter(**filtering)
188
-
189
- ordering = self.get_ordering()
190
- if ordering:
191
- if isinstance(ordering, str):
192
- ordering = (ordering,)
193
- queryset = queryset.order_by(*ordering)
194
-
195
203
  return queryset
196
204
 
197
- def get_paginate_by(self, queryset):
198
- """Get the number of items to paginate by, or ``None`` for no pagination"""
199
- if self.is_export:
200
- return None
201
- return self.paginate_by
202
-
203
205
  def get_validated_ordering(self):
204
206
  """Return a dict of field names with ordering labels if ordering is valid"""
205
207
  orderable_fields = self.orderable_fields or ()
@@ -208,7 +210,7 @@ class SubmissionsListView(SpreadsheetExportMixin, ListView):
208
210
  # Revert to CSV order_by submit_time ascending for backwards compatibility
209
211
  default_ordering = self.ordering_csv or ()
210
212
  else:
211
- default_ordering = self.ordering or ()
213
+ default_ordering = self.default_ordering or ()
212
214
  if isinstance(default_ordering, str):
213
215
  default_ordering = (default_ordering,)
214
216
  ordering_strs = self.request.GET.getlist("order_by") or list(default_ordering)
@@ -229,25 +231,6 @@ class SubmissionsListView(SpreadsheetExportMixin, ListView):
229
231
  ordering = self.get_validated_ordering()
230
232
  return [values[0] + name for name, values in ordering.items()]
231
233
 
232
- def get_filtering(self):
233
- """Return filering as a dict for submissions queryset"""
234
- self.select_date_form = SelectDateForm(self.request.GET)
235
- result = {}
236
- if self.select_date_form.is_valid():
237
- date_from = self.select_date_form.cleaned_data.get("date_from")
238
- date_to = self.select_date_form.cleaned_data.get("date_to")
239
- if date_to:
240
- # careful: date_to must be increased by 1 day
241
- # as submit_time is a time so will always be greater
242
- date_to += datetime.timedelta(days=1)
243
- if date_from:
244
- result["submit_time__range"] = [date_from, date_to]
245
- else:
246
- result["submit_time__lte"] = date_to
247
- elif date_from:
248
- result["submit_time__gte"] = date_from
249
- return result
250
-
251
234
  def get_filename(self):
252
235
  """Returns the base filename for the generated spreadsheet data file"""
253
236
  return "{}-export-{}".format(
@@ -268,6 +251,28 @@ class SubmissionsListView(SpreadsheetExportMixin, ListView):
268
251
  )
269
252
  return row_dict
270
253
 
254
+ def get_index_url(self):
255
+ return reverse(self.index_url_name, args=(self.form_page.id,))
256
+
257
+ def get_index_results_url(self):
258
+ return reverse(self.index_results_url_name, args=(self.form_page.id,))
259
+
260
+ def get_page_subtitle(self):
261
+ return self.form_page.get_admin_display_title()
262
+
263
+ def get_breadcrumbs_items(self):
264
+ return self.breadcrumbs_items + [
265
+ {
266
+ "url": reverse(self.forms_index_url_name),
267
+ "label": gettext("Forms"),
268
+ },
269
+ {
270
+ "url": "",
271
+ "label": self.get_page_title(),
272
+ "sublabel": self.get_page_subtitle(),
273
+ },
274
+ ]
275
+
271
276
  def get_context_data(self, **kwargs):
272
277
  """Return context for view"""
273
278
  context = super().get_context_data(**kwargs)
@@ -275,7 +280,6 @@ class SubmissionsListView(SpreadsheetExportMixin, ListView):
275
280
  data_fields = self.form_page.get_data_fields()
276
281
  data_rows = []
277
282
  context["submissions"] = submissions
278
- context["page_title"] = self.page_title
279
283
  if not self.is_export:
280
284
  # Build data_rows as list of dicts containing model_id and fields
281
285
  for submission in submissions:
@@ -310,7 +314,6 @@ class SubmissionsListView(SpreadsheetExportMixin, ListView):
310
314
  context.update(
311
315
  {
312
316
  "form_page": self.form_page,
313
- "select_date_form": self.select_date_form,
314
317
  "data_headings": data_headings,
315
318
  "data_rows": data_rows,
316
319
  }
@@ -6,14 +6,14 @@
6
6
  # David Llop, 2014
7
7
  # David Llop, 2014
8
8
  # David Llop, 2014
9
- # Roger Pons <rogerpons@gmail.com>, 2017,2023
9
+ # Roger Pons <rogerpons@gmail.com>, 2017,2023-2024
10
10
  msgid ""
11
11
  msgstr ""
12
12
  "Project-Id-Version: Wagtail\n"
13
13
  "Report-Msgid-Bugs-To: \n"
14
14
  "POT-Creation-Date: 2024-01-24 13:51+0000\n"
15
15
  "PO-Revision-Date: 2014-02-20 21:04+0000\n"
16
- "Last-Translator: Roger Pons <rogerpons@gmail.com>, 2017,2023\n"
16
+ "Last-Translator: Roger Pons <rogerpons@gmail.com>, 2017,2023-2024\n"
17
17
  "Language-Team: Catalan (http://app.transifex.com/torchbox/wagtail/language/"
18
18
  "ca/)\n"
19
19
  "MIME-Version: 1.0\n"
@@ -243,7 +243,7 @@ msgid "The redirect could not be created due to errors."
243
243
  msgstr "No s'ha pogut crear el redireccionament."
244
244
 
245
245
  msgid "Search redirects"
246
- msgstr "Cerca redireccions"
246
+ msgstr "Cercar redireccions"
247
247
 
248
248
  #, python-format
249
249
  msgid "File format of type \"%(extension)s\" is not supported"
@@ -8,7 +8,7 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: PACKAGE VERSION\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2024-01-24 13:51+0000\n"
11
+ "POT-Creation-Date: 2024-04-18 17:28+0100\n"
12
12
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,7 +22,8 @@ msgstr ""
22
22
  msgid "Wagtail redirects"
23
23
  msgstr ""
24
24
 
25
- #: filters.py:12 templates/wagtailredirects/list.html:20 views.py:436
25
+ #: filters.py:12 templates/wagtailredirects/list.html:20 views.py:102
26
+ #: views.py:466
26
27
  msgid "Type"
27
28
  msgstr ""
28
29
 
@@ -124,7 +125,7 @@ msgid "redirects"
124
125
  msgstr ""
125
126
 
126
127
  #: templates/wagtailredirects/add.html:3 templates/wagtailredirects/add.html:5
127
- #: templates/wagtailredirects/index.html:14
128
+ #: views.py:69
128
129
  msgid "Add redirect"
129
130
  msgstr ""
130
131
 
@@ -133,16 +134,14 @@ msgstr ""
133
134
  msgid "Save"
134
135
  msgstr ""
135
136
 
136
- #: templates/wagtailredirects/choose_import_file.html:3
137
- #: templates/wagtailredirects/index.html:7
138
- #: templates/wagtailredirects/index.html:10 wagtail_hooks.py:34
137
+ #: templates/wagtailredirects/choose_import_file.html:3 views.py:78
138
+ #: wagtail_hooks.py:34
139
139
  msgid "Redirects"
140
140
  msgstr ""
141
141
 
142
142
  #: templates/wagtailredirects/choose_import_file.html:6
143
143
  #: templates/wagtailredirects/confirm_import.html:6
144
- #: templates/wagtailredirects/import_summary.html:5
145
- #: templates/wagtailredirects/index.html:17
144
+ #: templates/wagtailredirects/import_summary.html:5 views.py:116
146
145
  msgid "Import redirects"
147
146
  msgstr ""
148
147
 
@@ -218,12 +217,12 @@ msgstr ""
218
217
 
219
218
  #: templates/wagtailredirects/import_summary.html:17
220
219
  #: templates/wagtailredirects/list.html:12
221
- #: templates/wagtailredirects/list.html:15 views.py:433
220
+ #: templates/wagtailredirects/list.html:15 views.py:84 views.py:463
222
221
  msgid "From"
223
222
  msgstr ""
224
223
 
225
224
  #: templates/wagtailredirects/import_summary.html:18
226
- #: templates/wagtailredirects/list.html:19 views.py:435
225
+ #: templates/wagtailredirects/list.html:19 views.py:96 views.py:465
227
226
  msgid "To"
228
227
  msgstr ""
229
228
 
@@ -235,11 +234,19 @@ msgstr ""
235
234
  msgid "Continue"
236
235
  msgstr ""
237
236
 
238
- #: templates/wagtailredirects/index.html:18
239
- msgid "Export redirects"
237
+ #: templates/wagtailredirects/index_results.html:7
238
+ #, python-format
239
+ msgid "Sorry, no redirects match \"<em>%(query_string)s</em>\""
240
240
  msgstr ""
241
241
 
242
- #: templates/wagtailredirects/list.html:18 views.py:434
242
+ #: templates/wagtailredirects/index_results.html:13
243
+ #, python-format
244
+ msgid ""
245
+ "No redirects have been created. Why not <a "
246
+ "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
247
+ msgstr ""
248
+
249
+ #: templates/wagtailredirects/list.html:18 views.py:90 views.py:464
243
250
  msgid "Site"
244
251
  msgstr ""
245
252
 
@@ -252,78 +259,63 @@ msgstr ""
252
259
  msgid "No redirects found."
253
260
  msgstr ""
254
261
 
255
- #: templates/wagtailredirects/results.html:5
256
- #, python-format
257
- msgid "There is %(counter)s match"
258
- msgid_plural "There are %(counter)s matches"
259
- msgstr[0] ""
260
- msgstr[1] ""
261
-
262
- #: templates/wagtailredirects/results.html:18
263
- #, python-format
264
- msgid "Sorry, no redirects match \"<em>%(query_string)s</em>\""
265
- msgstr ""
266
-
267
- #: templates/wagtailredirects/results.html:21
268
- #, python-format
269
- msgid ""
270
- "No redirects have been created. Why not <a "
271
- "href=\"%(wagtailredirects_add_redirect_url)s\">add one</a>?"
262
+ #: views.py:122
263
+ msgid "Export redirects"
272
264
  msgstr ""
273
265
 
274
- #: views.py:117
266
+ #: views.py:147
275
267
  #, python-format
276
268
  msgid "Redirect '%(redirect_title)s' updated."
277
269
  msgstr ""
278
270
 
279
- #: views.py:122 views.py:190
271
+ #: views.py:152 views.py:220
280
272
  msgid "Edit"
281
273
  msgstr ""
282
274
 
283
- #: views.py:128
275
+ #: views.py:158
284
276
  msgid "The redirect could not be saved due to errors."
285
277
  msgstr ""
286
278
 
287
- #: views.py:160
279
+ #: views.py:190
288
280
  #, python-format
289
281
  msgid "Redirect '%(redirect_title)s' deleted."
290
282
  msgstr ""
291
283
 
292
- #: views.py:185
284
+ #: views.py:215
293
285
  #, python-format
294
286
  msgid "Redirect '%(redirect_title)s' added."
295
287
  msgstr ""
296
288
 
297
- #: views.py:197
289
+ #: views.py:227
298
290
  msgid "The redirect could not be created due to errors."
299
291
  msgstr ""
300
292
 
301
- #: views.py:236
293
+ #: views.py:266
302
294
  msgid "Search redirects"
303
295
  msgstr ""
304
296
 
305
- #: views.py:250
297
+ #: views.py:280
306
298
  #, python-format
307
299
  msgid "File format of type \"%(extension)s\" is not supported"
308
300
  msgstr ""
309
301
 
310
- #: views.py:267
302
+ #: views.py:297
311
303
  #, python-format
312
304
  msgid "Imported file has a wrong encoding: %(error_message)s"
313
305
  msgstr ""
314
306
 
315
- #: views.py:274
307
+ #: views.py:304
316
308
  #, python-format
317
309
  msgid "%(error)s encountered while trying to read file: %(filename)s"
318
310
  msgstr ""
319
311
 
320
- #: views.py:365
312
+ #: views.py:395
321
313
  #, python-format
322
314
  msgid "Imported %(total)d redirect"
323
315
  msgid_plural "Imported %(total)d redirects"
324
316
  msgstr[0] ""
325
317
  msgstr[1] ""
326
318
 
327
- #: views.py:421
319
+ #: views.py:451
328
320
  msgid "Export Redirects"
329
321
  msgstr ""
@@ -6,8 +6,8 @@
6
6
  # Axel Haustant, 2016
7
7
  # Axel Haustant, 2016
8
8
  # Bertrand Bordage <bordage.bertrand@gmail.com>, 2015,2017-2018
9
- # fpoulain <fpoulain@metrodore.fr>, 2018
10
- # fpoulain <fpoulain@metrodore.fr>, 2018
9
+ # 69c761fa404d2f74d5a7a2904d9e6f47_dc2dbc9 <f37077798760362881f9d396b6e22ec7_1878>, 2018
10
+ # 69c761fa404d2f74d5a7a2904d9e6f47_dc2dbc9 <f37077798760362881f9d396b6e22ec7_1878>, 2018
11
11
  # Léo <leo@naeka.fr>, 2016
12
12
  # Loic Teixeira, 2020-2022
13
13
  # nahuel, 2014
@@ -20,8 +20,8 @@ msgstr ""
20
20
  "Content-Type: text/plain; charset=UTF-8\n"
21
21
  "Content-Transfer-Encoding: 8bit\n"
22
22
  "Language: he_IL\n"
23
- "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
24
- "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
23
+ "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
24
+ "1 == 0) ? 1: 2;\n"
25
25
 
26
26
  msgid "Type"
27
27
  msgstr "סוג"
@@ -134,7 +134,7 @@ def create_redirects(page: Page, page_old: Page, sites: Iterable[Site]) -> None:
134
134
  # For bulk-creating redirects in batches
135
135
  batch = BatchRedirectCreator(max_size=2000, ignore_conflicts=True)
136
136
 
137
- # Treat the page that was updated / moved separately to it's decendants,
137
+ # Treat the page that was updated / moved separately to it's descendants,
138
138
  # because there may be changes to fields other than `slug` or `url_path`
139
139
  # that impact the URL.
140
140
  old_urls = _page_urls_for_sites(page_old, sites, cache_target=page)
@@ -1,36 +1 @@
1
- {% extends "wagtailadmin/base.html" %}
2
- {% load i18n %}
3
- {% load static wagtailadmin_tags %}
4
-
5
- {% block bodyclass %}redirects{% endblock %}
6
-
7
- {% block titletag %}{% trans "Redirects" %}{% endblock %}
8
-
9
- {% block content %}
10
- {% trans "Redirects" as redirects_str %}
11
- {% url 'wagtailredirects:index' as search_results_url %}
12
- {% if user_can_add %}
13
- {% url "wagtailredirects:add" as add_link %}
14
- {% trans "Add redirect" as add_str %}
15
- {% url "wagtailredirects:start_import" as import_link %}
16
- {% url "wagtailredirects:report" as report_link %}
17
- {% trans "Import redirects" as import_str %}
18
- {% trans "Export redirects" as export_str %}
19
- {% fragment as redirect_actions %}
20
- {% fragment as button %}
21
- <a href="{{ import_link }}" class="button bicolor button--icon">{% icon name="doc-full-inverse" wrapped=1 %}{{ import_str }}</a>
22
- {% endfragment %}
23
- {% dropdown_button classname="w-ml-2.5" button=button toggle_icon="arrow-down" %}
24
- <a class="button bicolor button--icon" href="{{ report_link }}">{% icon name="download" wrapped=1 %}{{ export_str }}</a>
25
- {% enddropdown_button %}
26
- {% endfragment %}
27
- {% include "wagtailadmin/shared/header.html" with title=redirects_str icon="redirect" search_url="wagtailredirects:index" query_parameters=query_parameters action_url=add_link action_text=add_str action_icon="plus" extra_actions=redirect_actions search_results_url=search_results_url search_target="#redirects-results" %}
28
- {% else %}
29
- {% include "wagtailadmin/shared/header.html" with title=redirects_str icon="redirect" search_url="wagtailredirects:index" search_results_url=search_results_url search_target="#redirects-results" %}
30
- {% endif %}
31
- <div class="nice-padding">
32
- <div id="redirects-results" class="redirects">
33
- {% include "wagtailredirects/results.html" %}
34
- </div>
35
- </div>
36
- {% endblock %}
1
+ {% extends "wagtailadmin/generic/index.html" %}
@@ -0,0 +1,18 @@
1
+ {% extends "wagtailadmin/generic/index_results.html" %}
2
+ {% load i18n %}
3
+
4
+ {% block no_results_message %}
5
+ {% if query_string %}
6
+ <p role="alert">
7
+ {% blocktrans trimmed %}
8
+ Sorry, no redirects match "<em>{{ query_string }}</em>"
9
+ {% endblocktrans %}
10
+ </p>
11
+ {% else %}
12
+ <p>
13
+ {% blocktrans trimmed with wagtailredirects_add_redirect_url=add_url %}
14
+ No redirects have been created. Why not <a href="{{ wagtailredirects_add_redirect_url }}">add one</a>?
15
+ {% endblocktrans %}
16
+ </p>
17
+ {% endif %}
18
+ {% endblock %}
@@ -0,0 +1,8 @@
1
+ {% load i18n wagtailadmin_tags %}
2
+ <td class="w-truncate w-max-w-0">
3
+ {% if url %}
4
+ <a href="{{ url }}" class="nolink">{{ value }}</a>
5
+ {% else %}
6
+ {{ value }}
7
+ {% endif %}
8
+ </td>
@@ -241,7 +241,7 @@ class TestImportCommand(TestCase):
241
241
  "wagtail.contrib.redirects.management.commands.import_redirects.get_input",
242
242
  return_value="Y",
243
243
  )
244
- def test_successfull_ask_imports_redirect(self, get_input):
244
+ def test_successful_ask_imports_redirect(self, get_input):
245
245
  invalid_file = tempfile.NamedTemporaryFile(mode="w+", encoding="utf-8")
246
246
  invalid_file.write("from,to\n")
247
247
  invalid_file.write("/alpha,http://omega.test/")
@@ -1,3 +1,4 @@
1
+ from django.conf import settings
1
2
  from django.test import TestCase, override_settings
2
3
  from django.urls import reverse
3
4
 
@@ -7,6 +8,7 @@ from wagtail.log_actions import registry as log_registry
7
8
  from wagtail.models import Page, Site
8
9
  from wagtail.test.routablepage.models import RoutablePageTest
9
10
  from wagtail.test.utils import WagtailTestUtils
11
+ from wagtail.test.utils.template_tests import AdminTemplateTestUtils
10
12
 
11
13
 
12
14
  @override_settings(
@@ -200,6 +202,24 @@ class TestRedirects(TestCase):
200
202
  response, "/redirectto", status_code=302, fetch_redirect_response=False
201
203
  )
202
204
 
205
+ def test_redirect_without_trailing_slash(self):
206
+ # Create a redirect
207
+ redirect = models.Redirect(old_path="/redirectme", redirect_link="/redirectto")
208
+ redirect.save()
209
+
210
+ # confirm that CommonMiddleware's append-slash behaviour is enabled
211
+ self.assertTrue(settings.APPEND_SLASH)
212
+
213
+ response = self.client.get("/redirectme")
214
+ # Request should be picked up by RedirectMiddleware, not CommonMiddleware
215
+ # (which would redirect to /redirectme/ instead).
216
+ # Before Django 4.2, CommonMiddleware performed the 'add trailing slash' test
217
+ # during the initial request processing, which took precedence over RedirectMiddleware
218
+ # and caused a double redirect (/redirectme -> /redirectme/ -> /redirectto).
219
+ self.assertRedirects(
220
+ response, "/redirectto", status_code=301, fetch_redirect_response=False
221
+ )
222
+
203
223
  def test_redirect_stripping_query_string(self):
204
224
  # Create a redirect which includes a query string
205
225
  redirect_with_query_string = models.Redirect(
@@ -572,7 +592,7 @@ class TestRedirects(TestCase):
572
592
  self.assertIs(redirect.is_permanent, True)
573
593
 
574
594
 
575
- class TestRedirectsIndexView(WagtailTestUtils, TestCase):
595
+ class TestRedirectsIndexView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
576
596
  def setUp(self):
577
597
  self.login()
578
598
 
@@ -583,11 +603,24 @@ class TestRedirectsIndexView(WagtailTestUtils, TestCase):
583
603
  response = self.get()
584
604
  self.assertEqual(response.status_code, 200)
585
605
  self.assertTemplateUsed(response, "wagtailredirects/index.html")
606
+ self.assertBreadcrumbsItemsRendered(
607
+ [{"url": "", "label": "Redirects"}],
608
+ response.content,
609
+ )
586
610
 
587
611
  def test_search(self):
588
- response = self.get({"q": "Hello"})
589
- self.assertEqual(response.status_code, 200)
590
- self.assertEqual(response.context["query_string"], "Hello")
612
+ models.Redirect.objects.create(
613
+ old_path="/aaargh", redirect_link="http://torchbox.com/"
614
+ )
615
+ models.Redirect.objects.create(
616
+ old_path="/torchbox", redirect_link="http://aaargh.com/"
617
+ )
618
+ models.Redirect.objects.create(
619
+ old_path="/unrelated", redirect_link="http://unrelated.com/"
620
+ )
621
+ response = self.get({"q": "Aaargh"})
622
+ self.assertEqual(len(response.context["redirects"]), 2)
623
+ self.assertEqual(response.context["query_string"], "Aaargh")
591
624
 
592
625
  def test_search_results(self):
593
626
  models.Redirect.objects.create(
@@ -596,8 +629,15 @@ class TestRedirectsIndexView(WagtailTestUtils, TestCase):
596
629
  models.Redirect.objects.create(
597
630
  old_path="/torchbox", redirect_link="http://aaargh.com/"
598
631
  )
599
- response = self.get({"q": "aaargh"})
632
+ models.Redirect.objects.create(
633
+ old_path="/unrelated", redirect_link="http://unrelated.com/"
634
+ )
635
+ response = self.client.get(
636
+ reverse("wagtailredirects:index_results"),
637
+ {"q": "Aaargh"},
638
+ )
600
639
  self.assertEqual(len(response.context["redirects"]), 2)
640
+ self.assertEqual(response.context["query_string"], "Aaargh")
601
641
 
602
642
  def test_pagination(self):
603
643
  # page numbers in range should be accepted
@@ -607,7 +647,7 @@ class TestRedirectsIndexView(WagtailTestUtils, TestCase):
607
647
  response = self.get({"p": 9999})
608
648
  self.assertEqual(response.status_code, 404)
609
649
 
610
- def test_listing_order(self):
650
+ def test_default_ordering(self):
611
651
  for i in range(0, 10):
612
652
  models.Redirect.objects.create(
613
653
  old_path="/redirect%d" % i, redirect_link="http://torchbox.com/"
@@ -621,6 +661,37 @@ class TestRedirectsIndexView(WagtailTestUtils, TestCase):
621
661
  self.assertEqual(response.status_code, 200)
622
662
  self.assertEqual(response.context["redirects"][0].old_path, "/aaargh")
623
663
 
664
+ def test_custom_orderings(self):
665
+ models.Redirect.objects.create(
666
+ old_path="/test", redirect_link="http://wagtail.org/"
667
+ )
668
+ valid_orderings = {
669
+ "old_path",
670
+ "-old_path",
671
+ "site__site_name",
672
+ "-site__site_name",
673
+ "is_permanent",
674
+ "-is_permanent",
675
+ }
676
+ for ordering in valid_orderings:
677
+ with self.subTest(ordering=ordering):
678
+ response = self.get({"ordering": ordering})
679
+ self.assertEqual(response.status_code, 200)
680
+ soup = self.get_soup(response.content)
681
+ links = {
682
+ reverse("wagtailredirects:index") + "?ordering=" + other
683
+ for other in valid_orderings
684
+ if not other.startswith("-")
685
+ and other != ordering
686
+ or other == f"-{ordering}"
687
+ }
688
+ for link in links:
689
+ self.assertIsNotNone(soup.find("a", {"href": link}))
690
+ self.assertEqual(
691
+ response.context["object_list"].query.order_by,
692
+ (ordering,),
693
+ )
694
+
624
695
 
625
696
  class TestRedirectsAddView(WagtailTestUtils, TestCase):
626
697
  fixtures = ["test.json"]
@@ -810,7 +881,7 @@ class TestRedirectsEditView(WagtailTestUtils, TestCase):
810
881
  expected_url = "/admin/redirects/%d/" % self.redirect.id
811
882
  self.assertEqual(url_finder.get_edit_url(self.redirect), expected_url)
812
883
 
813
- def test_nonexistant_redirect(self):
884
+ def test_nonexistent_redirect(self):
814
885
  self.assertEqual(self.get(redirect_id=100000).status_code, 404)
815
886
 
816
887
  def test_edit(self):
@@ -914,7 +985,7 @@ class TestRedirectsDeleteView(WagtailTestUtils, TestCase):
914
985
  self.assertEqual(response.status_code, 200)
915
986
  self.assertTemplateUsed(response, "wagtailredirects/confirm_delete.html")
916
987
 
917
- def test_nonexistant_redirect(self):
988
+ def test_nonexistent_redirect(self):
918
989
  self.assertEqual(self.get(redirect_id=100000).status_code, 404)
919
990
 
920
991
  def test_delete(self):
@@ -4,7 +4,8 @@ from wagtail.contrib.redirects import views
4
4
 
5
5
  app_name = "wagtailredirects"
6
6
  urlpatterns = [
7
- path("", views.index, name="index"),
7
+ path("", views.IndexView.as_view(), name="index"),
8
+ path("results/", views.IndexView.as_view(results_only=True), name="index_results"),
8
9
  path("add/", views.add, name="add"),
9
10
  path("<int:redirect_id>/", views.edit, name="edit"),
10
11
  path("<int:redirect_id>/delete/", views.delete, name="delete"),