wagtail 6.0.2__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 (355) 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/de/LC_MESSAGES/django.mo +0 -0
  9. wagtail/admin/locale/de/LC_MESSAGES/django.po +5 -5
  10. wagtail/admin/locale/en/LC_MESSAGES/django.po +474 -385
  11. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +3 -3
  12. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  13. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +73 -2
  14. wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
  15. wagtail/admin/locale/ro/LC_MESSAGES/django.po +3 -3
  16. wagtail/admin/panels/comment_panel.py +1 -1
  17. wagtail/admin/panels/field_panel.py +1 -1
  18. wagtail/admin/rich_text/converters/editor_html.py +3 -1
  19. wagtail/admin/rich_text/editors/draftail/__init__.py +28 -2
  20. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  21. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  22. wagtail/admin/static/wagtailadmin/images/favicon.ico +0 -0
  23. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  24. wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
  25. wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
  26. wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
  27. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  28. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  29. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -1
  30. wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
  31. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  32. wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
  33. wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
  34. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  35. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  36. wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
  37. wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
  38. wagtail/admin/static/wagtailadmin/js/preview-panel.js +1 -1
  39. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  40. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  41. wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
  42. wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
  43. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  44. wagtail/admin/static/wagtailadmin/js/telepath/telepath.js +1 -1
  45. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  46. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  47. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  48. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +4 -4
  49. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  50. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  51. wagtail/admin/staticfiles.py +1 -0
  52. wagtail/admin/templates/wagtailadmin/base.html +1 -0
  53. wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +3 -1
  54. wagtail/admin/templates/wagtailadmin/collections/index_results.html +10 -0
  55. wagtail/admin/templates/wagtailadmin/generic/base.html +1 -9
  56. wagtail/admin/templates/wagtailadmin/generic/form.html +3 -2
  57. wagtail/admin/templates/wagtailadmin/generic/history/action_cell.html +27 -0
  58. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +3 -3
  59. wagtail/admin/templates/wagtailadmin/icons/keyboard.svg +1 -0
  60. wagtail/admin/templates/wagtailadmin/page_privacy/set_privacy.html +3 -1
  61. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -14
  62. wagtail/admin/templates/wagtailadmin/pages/action_menu/save_draft.html +3 -1
  63. wagtail/admin/templates/wagtailadmin/pages/choose_parent.html +17 -0
  64. wagtail/admin/templates/wagtailadmin/pages/explorable_index.html +8 -0
  65. wagtail/admin/templates/wagtailadmin/pages/history.html +1 -61
  66. wagtail/admin/templates/wagtailadmin/pages/index.html +1 -3
  67. wagtail/admin/templates/wagtailadmin/pages/listing/_locked_indicator.html +2 -2
  68. wagtail/admin/templates/wagtailadmin/pages/listing/_page_title_column_header.html +25 -27
  69. wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html +2 -1
  70. wagtail/admin/templates/wagtailadmin/panels/multi_field_panel_child.html +1 -1
  71. wagtail/admin/templates/wagtailadmin/panels/publishing/schedule_publishing_panel.html +3 -1
  72. wagtail/admin/templates/wagtailadmin/panels/tabbed_interface.html +1 -1
  73. wagtail/admin/templates/wagtailadmin/shared/active_filters.html +2 -1
  74. wagtail/admin/templates/wagtailadmin/shared/breadcrumbs.html +8 -0
  75. wagtail/admin/templates/wagtailadmin/shared/forms/single_checkbox.html +1 -1
  76. wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html +1 -1
  77. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +21 -9
  78. wagtail/admin/templates/wagtailadmin/shared/human_readable_date.html +1 -1
  79. wagtail/admin/templates/wagtailadmin/shared/keyboard_shortcuts_dialog.html +29 -0
  80. wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +2 -1
  81. wagtail/admin/templates/wagtailadmin/skeleton.html +2 -1
  82. wagtail/admin/templates/wagtailadmin/tables/related_objects_cell.html +9 -0
  83. wagtail/admin/templates/wagtailadmin/tables/title_cell.html +9 -7
  84. wagtail/admin/templates/wagtailadmin/widgets/draftail_rich_text_area.html +1 -1
  85. wagtail/admin/templates/wagtailadmin/workflows/create.html +6 -23
  86. wagtail/admin/templates/wagtailadmin/workflows/create_task.html +6 -15
  87. wagtail/admin/templates/wagtailadmin/workflows/edit.html +6 -23
  88. wagtail/admin/templates/wagtailadmin/workflows/edit_task.html +6 -13
  89. wagtail/admin/templates/wagtailadmin/workflows/includes/task_usage_cell.html +4 -4
  90. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_tasks_cell.html +18 -0
  91. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_title_cell.html +7 -0
  92. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_used_by_cell.html +25 -0
  93. wagtail/admin/templates/wagtailadmin/workflows/index.html +0 -99
  94. wagtail/admin/templates/wagtailadmin/workflows/index_results.html +10 -0
  95. wagtail/admin/templates/wagtailadmin/workflows/task_index.html +0 -30
  96. wagtail/admin/templates/wagtailadmin/workflows/task_index_results.html +10 -0
  97. wagtail/admin/templates/wagtailadmin/workflows/usage.html +1 -1
  98. wagtail/admin/templatetags/wagtailadmin_tags.py +116 -39
  99. wagtail/admin/tests/pages/test_create_page.py +10 -4
  100. wagtail/admin/tests/pages/test_custom_listing.py +37 -0
  101. wagtail/admin/tests/pages/test_edit_page.py +6 -6
  102. wagtail/admin/tests/pages/test_explorer_view.py +19 -18
  103. wagtail/admin/tests/pages/test_move_page.py +1 -1
  104. wagtail/admin/tests/pages/test_page_usage.py +50 -2
  105. wagtail/admin/tests/pages/test_parent_page_chooser_view.py +119 -0
  106. wagtail/admin/tests/pages/test_preview.py +18 -4
  107. wagtail/admin/tests/test_account_management.py +20 -1
  108. wagtail/admin/tests/test_audit_log.py +172 -5
  109. wagtail/admin/tests/test_checks.py +92 -0
  110. wagtail/admin/tests/test_collections_views.py +19 -5
  111. wagtail/admin/tests/test_compare.py +6 -6
  112. wagtail/admin/tests/test_dashboard.py +404 -0
  113. wagtail/admin/tests/test_dbwhitelister.py +4 -5
  114. wagtail/admin/tests/test_edit_handlers.py +2 -2
  115. wagtail/admin/tests/test_keyboard_shortcuts.py +84 -0
  116. wagtail/admin/tests/test_page_chooser.py +31 -18
  117. wagtail/admin/tests/test_privacy.py +36 -2
  118. wagtail/admin/tests/test_rich_text.py +168 -23
  119. wagtail/admin/tests/test_templatetags.py +411 -43
  120. wagtail/admin/tests/test_views.py +4 -2
  121. wagtail/admin/tests/test_workflows.py +531 -9
  122. wagtail/admin/tests/tests.py +3 -1
  123. wagtail/admin/tests/ui/test_tables.py +48 -1
  124. wagtail/admin/tests/viewsets/test_model_viewset.py +126 -29
  125. wagtail/admin/ui/side_panels.py +3 -1
  126. wagtail/admin/ui/tables/__init__.py +13 -1
  127. wagtail/admin/ui/tables/pages.py +17 -6
  128. wagtail/admin/urls/__init__.py +8 -3
  129. wagtail/admin/urls/pages.py +5 -0
  130. wagtail/admin/urls/workflows.py +10 -0
  131. wagtail/admin/views/chooser.py +20 -24
  132. wagtail/admin/views/collections.py +17 -1
  133. wagtail/admin/views/generic/base.py +31 -4
  134. wagtail/admin/views/generic/history.py +220 -51
  135. wagtail/admin/views/generic/mixins.py +7 -4
  136. wagtail/admin/views/generic/models.py +54 -38
  137. wagtail/admin/views/generic/multiple_upload.py +17 -8
  138. wagtail/admin/views/generic/usage.py +17 -11
  139. wagtail/admin/views/home.py +15 -12
  140. wagtail/admin/views/mixins.py +30 -0
  141. wagtail/admin/views/pages/choose_parent.py +73 -0
  142. wagtail/admin/views/pages/history.py +54 -66
  143. wagtail/admin/views/pages/listing.py +187 -106
  144. wagtail/admin/views/pages/usage.py +6 -1
  145. wagtail/admin/views/pages/utils.py +70 -1
  146. wagtail/admin/views/workflows.py +150 -21
  147. wagtail/admin/viewsets/model.py +2 -2
  148. wagtail/admin/viewsets/pages.py +77 -0
  149. wagtail/admin/wagtail_hooks.py +40 -2
  150. wagtail/admin/widgets/button.py +10 -9
  151. wagtail/api/v2/filters.py +1 -1
  152. wagtail/api/v2/tests/test_pages.py +1 -1
  153. wagtail/blocks/base.py +18 -9
  154. wagtail/blocks/field_block.py +9 -7
  155. wagtail/blocks/list_block.py +16 -6
  156. wagtail/blocks/static_block.py +3 -0
  157. wagtail/blocks/stream_block.py +58 -23
  158. wagtail/blocks/struct_block.py +15 -9
  159. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +39 -47
  160. wagtail/contrib/forms/models.py +5 -5
  161. wagtail/contrib/forms/templates/wagtailforms/list_submissions.html +44 -33
  162. wagtail/contrib/forms/templates/wagtailforms/submissions_index.html +2 -63
  163. wagtail/contrib/forms/tests/test_models.py +26 -0
  164. wagtail/contrib/forms/urls.py +6 -0
  165. wagtail/contrib/forms/views.py +52 -49
  166. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.mo +0 -0
  167. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +3 -3
  168. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +34 -42
  169. wagtail/contrib/redirects/signal_handlers.py +1 -1
  170. wagtail/contrib/redirects/templates/wagtailredirects/index.html +1 -36
  171. wagtail/contrib/redirects/templates/wagtailredirects/index_results.html +18 -0
  172. wagtail/contrib/redirects/templates/wagtailredirects/redirect_target_cell.html +8 -0
  173. wagtail/contrib/redirects/tests/test_import_command.py +1 -1
  174. wagtail/contrib/redirects/tests/test_redirects.py +79 -8
  175. wagtail/contrib/redirects/urls.py +2 -1
  176. wagtail/contrib/redirects/views.py +85 -55
  177. wagtail/contrib/search_promotions/admin_urls.py +2 -1
  178. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +41 -64
  179. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index.html +1 -16
  180. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index_results.html +11 -0
  181. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/list.html +0 -51
  182. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/results.html +3 -16
  183. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/search_promotion_column.html +15 -0
  184. wagtail/contrib/search_promotions/tests.py +122 -9
  185. wagtail/contrib/search_promotions/views.py +66 -65
  186. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +3 -3
  187. wagtail/contrib/settings/registry.py +10 -5
  188. wagtail/contrib/settings/tests/generic/test_admin.py +9 -0
  189. wagtail/contrib/settings/tests/site_specific/test_admin.py +10 -1
  190. wagtail/contrib/settings/tests/site_specific/test_model.py +3 -3
  191. wagtail/contrib/settings/tests/site_specific/test_templates.py +1 -1
  192. wagtail/contrib/settings/views.py +3 -1
  193. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  194. wagtail/contrib/simple_translation/tests/test_wagtail_hooks.py +2 -2
  195. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  196. wagtail/contrib/table_block/blocks.py +1 -1
  197. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  198. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  199. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
  200. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  201. wagtail/coreutils.py +3 -2
  202. wagtail/documents/admin_urls.py +2 -2
  203. wagtail/documents/locale/en/LC_MESSAGES/django.po +22 -22
  204. wagtail/documents/migrations/0013_delete_uploadeddocument.py +16 -0
  205. wagtail/documents/models.py +1 -20
  206. wagtail/documents/rich_text/__init__.py +11 -7
  207. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  208. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  209. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  210. wagtail/documents/templates/wagtaildocs/documents/index.html +0 -16
  211. wagtail/documents/tests/test_admin_views.py +155 -23
  212. wagtail/documents/tests/test_collection_privacy.py +55 -1
  213. wagtail/documents/tests/test_rich_text.py +14 -0
  214. wagtail/documents/views/documents.py +25 -22
  215. wagtail/documents/views/multiple.py +6 -7
  216. wagtail/documents/views/serve.py +16 -1
  217. wagtail/documents/wagtail_hooks.py +20 -15
  218. wagtail/embeds/blocks.py +5 -0
  219. wagtail/embeds/locale/en/LC_MESSAGES/django.po +2 -2
  220. wagtail/embeds/rich_text/__init__.py +1 -1
  221. wagtail/embeds/tests/test_rich_text.py +14 -0
  222. wagtail/embeds/wagtail_hooks.py +4 -14
  223. wagtail/fields.py +3 -48
  224. wagtail/images/admin_urls.py +2 -2
  225. wagtail/images/check_files/wagtail.jpg +0 -0
  226. wagtail/images/check_files/wagtail.png +0 -0
  227. wagtail/images/fields.py +2 -0
  228. wagtail/images/image_operations.py +1 -1
  229. wagtail/images/locale/en/LC_MESSAGES/django.po +33 -45
  230. wagtail/images/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  231. wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +4 -0
  232. wagtail/images/migrations/0026_delete_uploadedimage.py +16 -0
  233. wagtail/images/models.py +49 -43
  234. wagtail/images/rich_text/__init__.py +18 -8
  235. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  236. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  237. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  238. wagtail/images/templates/wagtailimages/images/image_listing_header.html +6 -0
  239. wagtail/images/templates/wagtailimages/images/index.html +11 -51
  240. wagtail/images/tests/test_admin_views.py +119 -62
  241. wagtail/images/tests/test_image_operations.py +10 -0
  242. wagtail/images/tests/test_models.py +35 -33
  243. wagtail/images/tests/test_rich_text.py +14 -0
  244. wagtail/images/tests/utils.py +1 -1
  245. wagtail/images/views/images.py +35 -64
  246. wagtail/images/views/multiple.py +6 -7
  247. wagtail/images/wagtail_hooks.py +4 -14
  248. wagtail/locale/en/LC_MESSAGES/django.po +150 -136
  249. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  250. wagtail/locales/tests.py +18 -3
  251. wagtail/locales/views.py +0 -1
  252. wagtail/management/commands/rebuild_references_index.py +3 -1
  253. wagtail/migrations/0092_alter_collectionviewrestriction_password_and_more.py +33 -0
  254. wagtail/migrations/0093_uploadedfile.py +53 -0
  255. wagtail/models/__init__.py +147 -32
  256. wagtail/models/i18n.py +1 -1
  257. wagtail/models/{collections.py → media.py} +33 -2
  258. wagtail/models/reference_index.py +1 -1
  259. wagtail/models/view_restrictions.py +10 -3
  260. wagtail/project_template/project_name/settings/base.py +6 -0
  261. wagtail/project_template/requirements.txt +1 -1
  262. wagtail/rich_text/__init__.py +25 -8
  263. wagtail/rich_text/pages.py +19 -8
  264. wagtail/rich_text/rewriters.py +140 -68
  265. wagtail/search/backends/database/mysql/mysql.py +3 -3
  266. wagtail/search/backends/database/postgres/postgres.py +3 -3
  267. wagtail/search/backends/database/sqlite/sqlite.py +2 -2
  268. wagtail/search/backends/elasticsearch7.py +4 -0
  269. wagtail/search/locale/en/LC_MESSAGES/django.po +3 -3
  270. wagtail/search/tests/test_postgres_backend.py +50 -0
  271. wagtail/sites/locale/en/LC_MESSAGES/django.po +8 -8
  272. wagtail/sites/tests.py +35 -9
  273. wagtail/sites/views.py +3 -1
  274. wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
  275. wagtail/snippets/locale/de/LC_MESSAGES/django.po +5 -6
  276. wagtail/snippets/locale/en/LC_MESSAGES/django.po +16 -56
  277. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  278. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  279. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/publish.html +3 -1
  280. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/save.html +3 -1
  281. wagtail/snippets/templates/wagtailsnippets/snippets/create.html +1 -1
  282. wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +1 -1
  283. wagtail/snippets/tests/test_preview.py +13 -2
  284. wagtail/snippets/tests/test_snippets.py +41 -16
  285. wagtail/snippets/tests/test_viewset.py +63 -18
  286. wagtail/snippets/tests/test_workflows.py +12 -0
  287. wagtail/snippets/views/snippets.py +1 -40
  288. wagtail/templatetags/wagtailcore_tags.py +1 -1
  289. wagtail/test/demosite/models.py +1 -1
  290. wagtail/test/middleware.py +14 -1
  291. wagtail/test/testapp/fixtures/test.json +20 -0
  292. wagtail/test/testapp/migrations/0001_squashed_0073_revisablechildmodel_secret_text.py +8 -8
  293. wagtail/test/testapp/migrations/0023_snippetchoosermodel_full_featured.py +1 -0
  294. wagtail/test/testapp/migrations/0034_custompermissionmodel.py +44 -0
  295. wagtail/test/testapp/migrations/0035_modelwithcustommanager.py +30 -0
  296. wagtail/test/testapp/migrations/0036_complexdefaultstreampage.py +28 -0
  297. wagtail/test/testapp/models.py +79 -2
  298. wagtail/test/testapp/templates/tests/custom_docs_password_required.html +10 -0
  299. wagtail/test/testapp/templates/tests/custom_page_password_required.html +10 -0
  300. wagtail/test/testapp/views.py +24 -2
  301. wagtail/test/testapp/wagtail_hooks.py +19 -0
  302. wagtail/test/utils/wagtail_tests.py +2 -2
  303. wagtail/tests/test_blocks.py +262 -1
  304. wagtail/tests/test_migrations.py +1 -1
  305. wagtail/tests/test_page_model.py +77 -0
  306. wagtail/tests/test_page_privacy.py +18 -1
  307. wagtail/tests/test_rich_text.py +95 -5
  308. wagtail/tests/test_streamfield.py +43 -0
  309. wagtail/tests/test_utils.py +8 -2
  310. wagtail/tests/test_views.py +52 -1
  311. wagtail/tests/test_whitelist.py +7 -7
  312. wagtail/users/forms.py +3 -1
  313. wagtail/users/locale/en/LC_MESSAGES/django.po +124 -96
  314. wagtail/users/migrations/0013_userprofile_density.py +23 -0
  315. wagtail/users/models.py +14 -3
  316. wagtail/users/templates/wagtailusers/groups/create.html +1 -7
  317. wagtail/users/templates/wagtailusers/groups/edit.html +1 -13
  318. wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +46 -2
  319. wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -2
  320. wagtail/users/templates/wagtailusers/users/create.html +1 -9
  321. wagtail/users/templates/wagtailusers/users/edit.html +1 -9
  322. wagtail/users/templates/wagtailusers/users/index.html +2 -5
  323. wagtail/users/templates/wagtailusers/users/index_results.html +3 -13
  324. wagtail/users/templates/wagtailusers/users/user_cell.html +9 -0
  325. wagtail/users/templatetags/wagtailusers_tags.py +107 -20
  326. wagtail/users/tests/test_admin_views.py +669 -90
  327. wagtail/users/views/groups.py +58 -61
  328. wagtail/users/views/users.py +211 -92
  329. wagtail/users/wagtail_hooks.py +6 -38
  330. wagtail/users/widgets.py +3 -5
  331. wagtail/utils/text.py +1 -1
  332. wagtail/views.py +5 -9
  333. wagtail/whitelist.py +1 -1
  334. {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/METADATA +4 -5
  335. {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/RECORD +339 -320
  336. wagtail/admin/static/wagtailadmin/js/page-editor.js +0 -1
  337. wagtail/admin/static/wagtailadmin/js/vendor/mousetrap.min.js +0 -1
  338. wagtail/admin/static/wagtailadmin/js/vendor/urlify.js +0 -1
  339. wagtail/admin/static/wagtailadmin/js/vendor/xregexp.min.js +0 -1
  340. wagtail/admin/templates/wagtailadmin/collections/index.html +0 -34
  341. wagtail/admin/templates/wagtailadmin/pages/revisions/_actions.html +0 -22
  342. wagtail/admin/templates/wagtailadmin/shared/page_breadcrumbs.html +0 -55
  343. wagtail/admin/tests/pages/test_dashboard.py +0 -172
  344. wagtail/contrib/redirects/templates/wagtailredirects/results.html +0 -23
  345. wagtail/documents/templates/wagtaildocs/documents/list.html +0 -2
  346. wagtail/search/tests/test_postgres_stemming.py +0 -40
  347. wagtail/sites/templates/wagtailsites/create.html +0 -6
  348. wagtail/sites/templates/wagtailsites/edit.html +0 -6
  349. wagtail/snippets/templates/wagtailsnippets/snippets/revisions/_actions.html +0 -36
  350. wagtail/users/templates/wagtailusers/users/list.html +0 -62
  351. wagtail/users/urls/users.py +0 -12
  352. {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/LICENSE +0 -0
  353. {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/WHEEL +0 -0
  354. {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/entry_points.txt +0 -0
  355. {wagtail-6.0.2.dist-info → wagtail-6.1rc1.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
1
1
  from django.contrib.auth.models import Group
2
- from django.test import TestCase
2
+ from django.test import TestCase, override_settings
3
3
  from django.urls import reverse
4
4
 
5
5
  from wagtail.models import Page, PageViewRestriction
@@ -205,12 +205,46 @@ class TestSetPrivacyView(WagtailTestUtils, TestCase):
205
205
  history_response = self.client.get(history_url)
206
206
 
207
207
  # Check that the expected log message is present
208
- expected_log_message = "Removed the 'Private, accessible with the following password' view restriction. The page is public."
208
+ expected_log_message = "Removed the 'Private, accessible with a shared password' view restriction. The page is public."
209
209
  self.assertContains(
210
210
  history_response,
211
211
  expected_log_message,
212
212
  )
213
213
 
214
+ def test_set_shared_password_page(self):
215
+ response = self.client.get(
216
+ reverse("wagtailadmin_pages:set_privacy", args=(self.public_page.id,)),
217
+ )
218
+
219
+ input_el = self.get_soup(response.content).select_one("[data-field-input]")
220
+ self.assertEqual(response.status_code, 200)
221
+
222
+ # check that input option for password is visible
223
+ self.assertIn("password", response.context["form"].fields)
224
+
225
+ # check that the option for password is visible
226
+ self.assertIsNotNone(input_el)
227
+
228
+ @override_settings(WAGTAIL_PRIVATE_PAGE_OPTIONS={"SHARED_PASSWORD": False})
229
+ def test_unset_shared_password_page(self):
230
+ response = self.client.get(
231
+ reverse("wagtailadmin_pages:set_privacy", args=(self.public_page.id,)),
232
+ )
233
+ self.assertEqual(response.status_code, 200)
234
+
235
+ # check that input option for password is not visible
236
+ self.assertNotIn("password", response.context["form"].fields)
237
+ self.assertFalse(
238
+ response.context["form"]
239
+ .fields["restriction_type"]
240
+ .valid_value(PageViewRestriction.PASSWORD)
241
+ )
242
+
243
+ # check that the option for password is not visible
244
+ self.assertNotContains(
245
+ response, '<div class="w-field__input" data-field-input>'
246
+ )
247
+
214
248
  def test_get_private_groups(self):
215
249
  """
216
250
  This tests that the restriction type and group fields as set correctly when a user opens the set_privacy view on a public page
@@ -3,14 +3,18 @@ import unittest
3
3
  from django.conf import settings
4
4
  from django.test import SimpleTestCase, TestCase
5
5
  from django.test.utils import override_settings
6
- from django.urls import reverse
6
+ from django.urls import reverse, reverse_lazy
7
7
 
8
8
  from wagtail.admin.rich_text import DraftailRichTextArea, get_rich_text_editor_widget
9
- from wagtail.admin.rich_text.converters.editor_html import PageLinkHandler
9
+ from wagtail.admin.rich_text.converters.editor_html import (
10
+ EditorHTMLConverter,
11
+ PageLinkHandler,
12
+ )
10
13
  from wagtail.admin.rich_text.editors.draftail.features import Feature
11
14
  from wagtail.blocks import RichTextBlock
12
15
  from wagtail.models import Page, get_page_models
13
16
  from wagtail.rich_text import RichText
17
+ from wagtail.rich_text.feature_registry import FeatureRegistry
14
18
  from wagtail.test.testapp.models import SingleEventPage
15
19
  from wagtail.test.testapp.rich_text import CustomRichTextArea, LegacyRichTextArea
16
20
  from wagtail.test.utils import WagtailTestUtils
@@ -108,7 +112,9 @@ class TestDefaultRichText(WagtailTestUtils, BaseRichTextEditHandlerTestCase):
108
112
  self.assertEqual(response.status_code, 200)
109
113
 
110
114
  # Check that draftail (default editor) initialisation is applied
111
- self.assertContains(response, "window.draftail.initEditor('#id_body',")
115
+ # Check that data-controller and data-w-init-event-value were added after initialization
116
+ self.assertContains(response, 'data-controller="w-init"')
117
+ self.assertContains(response, 'data-w-init-event-value="w-draftail:init"')
112
118
 
113
119
  # check that media for draftail is being imported
114
120
  self.assertContains(response, "wagtailadmin/js/draftail.js")
@@ -353,10 +359,20 @@ class TestDraftailWithFeatureOptions(WagtailTestUtils, BaseRichTextEditHandlerTe
353
359
  args=("tests", "defaultrichtextfieldpage", self.root_page.id),
354
360
  )
355
361
  )
356
- self.assertEqual(response.status_code, 200)
357
- self.assertContains(response, '"type": "header-two"')
358
- self.assertContains(response, '"type": "IMAGE"')
359
- self.assertNotContains(response, '"type": "ordered-list-item"')
362
+ soup = self.get_soup(response.content)
363
+ input = soup.find(
364
+ "input",
365
+ {
366
+ "data-draftail-input": "",
367
+ "data-controller": "w-init",
368
+ "data-w-init-event-value": "w-draftail:init",
369
+ },
370
+ )
371
+ data = input["data-w-init-detail-value"]
372
+
373
+ self.assertIn('"type": "header-two"', data)
374
+ self.assertIn('"type": "IMAGE"', data)
375
+ self.assertNotIn('"type": "ordered-list-item"', data)
360
376
 
361
377
  @unittest.expectedFailure # TODO(telepath)
362
378
  def test_features_option_on_rich_text_block(self):
@@ -400,16 +416,28 @@ class TestDraftailWithAdditionalFeatures(
400
416
 
401
417
  self.assertEqual(response.status_code, 200)
402
418
  # default ones are there
403
- self.assertContains(response, '"type": "header-two"')
404
- self.assertContains(response, '"type": "LINK"')
405
- self.assertContains(response, '"type": "ITALIC"')
419
+
420
+ soup = self.get_soup(response.content)
421
+ input = soup.find(
422
+ "input",
423
+ {
424
+ "data-draftail-input": "",
425
+ "data-controller": "w-init",
426
+ "data-w-init-event-value": "w-draftail:init",
427
+ },
428
+ )
429
+ data = input["data-w-init-detail-value"]
430
+
431
+ self.assertIn('"type": "header-two"', data)
432
+ self.assertIn('"type": "LINK"', data)
433
+ self.assertIn('"type": "ITALIC"', data)
406
434
 
407
435
  # not the additional ones.
408
- self.assertNotContains(response, '"type": "CODE"')
409
- self.assertNotContains(response, '"type": "blockquote"')
410
- self.assertNotContains(response, '"type": "SUPERSCRIPT"')
411
- self.assertNotContains(response, '"type": "SUBSCRIPT"')
412
- self.assertNotContains(response, '"type": "STRIKETHROUGH"')
436
+ self.assertNotIn('"type": "CODE"', data)
437
+ self.assertNotIn('"type": "blockquote"', data)
438
+ self.assertNotIn('"type": "SUPERSCRIPT"', data)
439
+ self.assertNotIn('"type": "SUBSCRIPT"', data)
440
+ self.assertNotIn('"type": "STRIKETHROUGH"', data)
413
441
 
414
442
  @override_settings(
415
443
  WAGTAILADMIN_RICH_TEXT_EDITORS={
@@ -437,17 +465,29 @@ class TestDraftailWithAdditionalFeatures(
437
465
  )
438
466
 
439
467
  self.assertEqual(response.status_code, 200)
468
+
469
+ soup = self.get_soup(response.content)
470
+ input = soup.find(
471
+ "input",
472
+ {
473
+ "data-draftail-input": "",
474
+ "data-controller": "w-init",
475
+ "data-w-init-event-value": "w-draftail:init",
476
+ },
477
+ )
478
+
479
+ data = input["data-w-init-detail-value"]
440
480
  # Added features are there
441
- self.assertContains(response, '"type": "header-two"')
442
- self.assertContains(response, '"type": "CODE"')
443
- self.assertContains(response, '"type": "blockquote"')
444
- self.assertContains(response, '"type": "SUPERSCRIPT"')
445
- self.assertContains(response, '"type": "SUBSCRIPT"')
446
- self.assertContains(response, '"type": "STRIKETHROUGH"')
481
+ self.assertIn('"type": "header-two"', data)
482
+ self.assertIn('"type": "CODE"', data)
483
+ self.assertIn('"type": "blockquote"', data)
484
+ self.assertIn('"type": "SUPERSCRIPT"', data)
485
+ self.assertIn('"type": "SUBSCRIPT"', data)
486
+ self.assertIn('"type": "STRIKETHROUGH"', data)
447
487
 
448
488
  # But not the unprovided default ones.
449
- self.assertNotContains(response, '"type": "LINK"')
450
- self.assertNotContains(response, '"type": "ITALIC"')
489
+ self.assertNotIn('"type": "LINK"', data)
490
+ self.assertNotIn('"type": "ITALIC"', data)
451
491
 
452
492
 
453
493
  class TestPageLinkHandler(WagtailTestUtils, TestCase):
@@ -471,6 +511,17 @@ class TestPageLinkHandler(WagtailTestUtils, TestCase):
471
511
  % events_page_id,
472
512
  )
473
513
 
514
+ def test_editorhtmlconverter_from_database_format(self):
515
+ events_page_id = Page.objects.get(url_path="/home/events/").pk
516
+ db_html = '<a linktype="page" id="%d">foo</a>' % events_page_id
517
+ converter = EditorHTMLConverter(features=["link"])
518
+ editor_html = converter.from_database_format(db_html)
519
+ self.assertEqual(
520
+ editor_html,
521
+ '<a data-linktype="page" data-id="%d" data-parent-id="2" href="/events/">foo</a>'
522
+ % events_page_id,
523
+ )
524
+
474
525
 
475
526
  class TestWidgetNotHidden(SimpleTestCase):
476
527
  def test_draftail(self):
@@ -491,3 +542,97 @@ class TestDraftailFeature(SimpleTestCase):
491
542
  media_html = str(feature.media)
492
543
  self.assertRegex(media_html, r"feature.js\?v=(\w+)")
493
544
  self.assertRegex(media_html, r"feature.css\?v=(\w+)")
545
+
546
+
547
+ class TestRichTextChooserUrls(WagtailTestUtils, BaseRichTextEditHandlerTestCase):
548
+ def setUp(self):
549
+ super().setUp()
550
+
551
+ # Find root page
552
+ self.root_page = Page.objects.get(id=2)
553
+
554
+ self.login()
555
+
556
+ @override_settings(
557
+ WAGTAILADMIN_RICH_TEXT_EDITORS={
558
+ "default": {
559
+ "WIDGET": "wagtail.admin.rich_text.DraftailRichTextArea",
560
+ },
561
+ }
562
+ )
563
+ def test_chooser_urls_exist(self):
564
+ features = FeatureRegistry()
565
+ link = features.get_editor_plugin("draftail", "link")
566
+
567
+ self.assertIsNotNone(link.data.get("chooserUrls"))
568
+ self.assertEqual(
569
+ link.data["chooserUrls"]["pageChooser"],
570
+ reverse_lazy("wagtailadmin_choose_page"),
571
+ )
572
+ self.assertEqual(
573
+ link.data["chooserUrls"]["externalLinkChooser"],
574
+ reverse_lazy("wagtailadmin_choose_page_external_link"),
575
+ )
576
+ self.assertEqual(
577
+ link.data["chooserUrls"]["emailLinkChooser"],
578
+ reverse_lazy("wagtailadmin_choose_page_email_link"),
579
+ )
580
+ self.assertEqual(
581
+ link.data["chooserUrls"]["phoneLinkChooser"],
582
+ reverse_lazy("wagtailadmin_choose_page_phone_link"),
583
+ )
584
+ self.assertEqual(
585
+ link.data["chooserUrls"]["anchorLinkChooser"],
586
+ reverse_lazy("wagtailadmin_choose_page_anchor_link"),
587
+ )
588
+
589
+ def test_lazy_chooser_urls_resolved_correctly(self):
590
+ response = self.client.get(
591
+ reverse(
592
+ "wagtailadmin_pages:add",
593
+ args=("tests", "defaultrichtextfieldpage", self.root_page.id),
594
+ )
595
+ )
596
+
597
+ soup = self.get_soup(response.content)
598
+ input = soup.find(
599
+ "input",
600
+ {
601
+ "data-draftail-input": "",
602
+ "data-controller": "w-init",
603
+ "data-w-init-event-value": "w-draftail:init",
604
+ },
605
+ )
606
+
607
+ data = input["data-w-init-detail-value"]
608
+
609
+ self.assertIn(
610
+ '"chooserUrls": {"imageChooser": "/admin/images/chooser/"}',
611
+ data,
612
+ )
613
+ self.assertIn(
614
+ '"chooserUrls": {"embedsChooser": "/admin/embeds/chooser/"}',
615
+ data,
616
+ )
617
+ self.assertIn(
618
+ '"chooserUrls": {"documentChooser": "/admin/documents/chooser/"}',
619
+ data,
620
+ )
621
+
622
+ self.assertIn(
623
+ '"chooserUrls": {"pageChooser": "/admin/choose-page/", "externalLinkChooser": "/admin/choose-external-link/", "emailLinkChooser": "/admin/choose-email-link/", "phoneLinkChooser": "/admin/choose-phone-link/", "anchorLinkChooser": "/admin/choose-anchor-link/"}',
624
+ data,
625
+ )
626
+
627
+ def test_lazy_urls_resolution(self):
628
+ """
629
+ Check that the lazy URLs have been resolved correctly in the rendered widget HTML data attributes.
630
+ """
631
+
632
+ widget = DraftailRichTextArea()
633
+ html = widget.render("test_chooserUrls", "", {})
634
+
635
+ self.assertIn("/admin/choose-page/", html)
636
+ self.assertIn("/admin/images/chooser/", html)
637
+ self.assertIn("/admin/embeds/chooser/", html)
638
+ self.assertIn("/admin/documents/chooser/", html)