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,7 +1,8 @@
1
+ from warnings import warn
2
+
1
3
  from django.conf import settings
2
4
  from django.template.response import TemplateResponse
3
- from django.urls import include, path, reverse
4
- from django.utils.html import format_html
5
+ from django.urls import include, path, reverse, reverse_lazy
5
6
  from django.utils.translation import gettext, ngettext
6
7
  from django.utils.translation import gettext_lazy as _
7
8
 
@@ -31,6 +32,7 @@ from wagtail.documents.views.bulk_actions import (
31
32
  )
32
33
  from wagtail.documents.views.chooser import viewset as chooser_viewset
33
34
  from wagtail.models import BaseViewRestriction
35
+ from wagtail.utils.deprecation import RemovedInWagtail70Warning
34
36
  from wagtail.wagtail_hooks import require_wagtail_login
35
37
 
36
38
 
@@ -64,18 +66,6 @@ def register_documents_menu_item():
64
66
  )
65
67
 
66
68
 
67
- @hooks.register("insert_editor_js")
68
- def editor_js():
69
- return format_html(
70
- """
71
- <script>
72
- window.chooserUrls.documentChooser = '{0}';
73
- </script>
74
- """,
75
- reverse("wagtaildocs_chooser:choose"),
76
- )
77
-
78
-
79
69
  @hooks.register("register_rich_text_features")
80
70
  def register_document_feature(features):
81
71
  features.register_link_type(DocumentLinkHandler)
@@ -88,6 +78,9 @@ def register_document_feature(features):
88
78
  "type": "DOCUMENT",
89
79
  "icon": "doc-full-inverse",
90
80
  "description": gettext("Document"),
81
+ "chooserUrls": {
82
+ "documentChooser": reverse_lazy("wagtaildocs_chooser:choose")
83
+ },
91
84
  },
92
85
  js=["wagtaildocs/js/document-chooser-modal.js"],
93
86
  ),
@@ -190,10 +183,22 @@ def check_view_restrictions(document, request):
190
183
 
191
184
  password_required_template = getattr(
192
185
  settings,
193
- "DOCUMENT_PASSWORD_REQUIRED_TEMPLATE",
186
+ "WAGTAILDOCS_PASSWORD_REQUIRED_TEMPLATE",
194
187
  "wagtaildocs/password_required.html",
195
188
  )
196
189
 
190
+ if hasattr(settings, "DOCUMENT_PASSWORD_REQUIRED_TEMPLATE"):
191
+ warn(
192
+ "The `DOCUMENT_PASSWORD_REQUIRED_TEMPLATE` setting is deprecated - use `WAGTAILDOCS_PASSWORD_REQUIRED_TEMPLATE` instead.",
193
+ category=RemovedInWagtail70Warning,
194
+ )
195
+
196
+ password_required_template = getattr(
197
+ settings,
198
+ "DOCUMENT_PASSWORD_REQUIRED_TEMPLATE",
199
+ password_required_template,
200
+ )
201
+
197
202
  context = {"form": form, "action_url": action_url}
198
203
  return TemplateResponse(request, password_required_template, context)
199
204
 
wagtail/embeds/blocks.py CHANGED
@@ -85,5 +85,10 @@ class EmbedBlock(blocks.URLBlock):
85
85
  raise ValidationError(_("Cannot find an embed for this URL."))
86
86
  return super().clean(value)
87
87
 
88
+ def normalize(self, value):
89
+ if isinstance(value, EmbedValue):
90
+ return value
91
+ return EmbedValue(value)
92
+
88
93
  class Meta:
89
94
  icon = "media"
@@ -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"
@@ -62,6 +62,6 @@ msgid ""
62
62
  "Please try again later."
63
63
  msgstr ""
64
64
 
65
- #: wagtail_hooks.py:51
65
+ #: wagtail_hooks.py:38
66
66
  msgid "Embed"
67
67
  msgstr ""
@@ -18,7 +18,7 @@ class MediaEmbedHandler(EmbedHandler):
18
18
  return get_embed(attrs["url"])
19
19
 
20
20
  @staticmethod
21
- def expand_db_attributes(attrs):
21
+ def expand_db_attributes(attrs: dict) -> str:
22
22
  """
23
23
  Given a dict of attributes from the <embed> tag, return the real HTML
24
24
  representation for use on the front-end.
@@ -1,6 +1,7 @@
1
1
  from unittest.mock import patch
2
2
 
3
3
  from django.test import TestCase, override_settings
4
+ from django.urls import reverse_lazy
4
5
 
5
6
  from wagtail.embeds.exceptions import EmbedNotFoundException
6
7
  from wagtail.embeds.models import Embed
@@ -9,6 +10,7 @@ from wagtail.embeds.rich_text.editor_html import (
9
10
  MediaEmbedHandler as EditorHtmlMediaEmbedHandler,
10
11
  )
11
12
  from wagtail.rich_text import expand_db_html
13
+ from wagtail.rich_text.feature_registry import FeatureRegistry
12
14
  from wagtail.test.utils import WagtailTestUtils
13
15
 
14
16
 
@@ -143,3 +145,15 @@ class TestFrontendMediaEmbedHandler(TestCase):
143
145
  get_embed.assert_called_with(
144
146
  "https://www.youtube.com/watch?v=O7D-1RG-VRk&t=25", None, None
145
147
  )
148
+
149
+
150
+ class TestEntityFeatureChooserUrls(TestCase):
151
+ def test_chooser_urls_exist(self):
152
+ features = FeatureRegistry()
153
+ embed = features.get_editor_plugin("draftail", "embed")
154
+
155
+ self.assertIsNotNone(embed.data.get("chooserUrls"))
156
+ self.assertEqual(
157
+ embed.data["chooserUrls"]["embedsChooser"],
158
+ reverse_lazy("wagtailembeds:chooser"),
159
+ )
@@ -1,5 +1,4 @@
1
- from django.urls import include, path, reverse
2
- from django.utils.html import format_html
1
+ from django.urls import include, path, reverse_lazy
3
2
  from django.utils.translation import gettext as _
4
3
 
5
4
  import wagtail.admin.rich_text.editors.draftail.features as draftail_features
@@ -17,18 +16,6 @@ def register_admin_urls():
17
16
  ]
18
17
 
19
18
 
20
- @hooks.register("insert_editor_js")
21
- def editor_js():
22
- return format_html(
23
- """
24
- <script>
25
- window.chooserUrls.embedsChooser = '{0}';
26
- </script>
27
- """,
28
- reverse("wagtailembeds:chooser"),
29
- )
30
-
31
-
32
19
  @hooks.register("register_rich_text_features")
33
20
  def register_embed_feature(features):
34
21
  # define a handler for converting <embed embedtype="media"> tags into frontend HTML
@@ -49,6 +36,9 @@ def register_embed_feature(features):
49
36
  "type": "EMBED",
50
37
  "icon": "media",
51
38
  "description": _("Embed"),
39
+ "chooserUrls": {
40
+ "embedsChooser": reverse_lazy("wagtailembeds:chooser"),
41
+ },
52
42
  },
53
43
  js=["wagtailembeds/js/embed-chooser-modal.js"],
54
44
  ),
wagtail/fields.py CHANGED
@@ -131,59 +131,14 @@ class StreamField(models.Field):
131
131
  return name, path, args, kwargs
132
132
 
133
133
  def to_python(self, value):
134
- value = self._to_python(value)
134
+ result = self.stream_block.to_python(value)
135
135
 
136
136
  # The top-level StreamValue is passed a reference to the StreamField, to support
137
137
  # pickling. This is necessary because unpickling needs access to the StreamBlock
138
138
  # definition, which cannot itself be pickled; instead we store a pointer to the
139
139
  # field within the model, which gives us a path to retrieve the StreamBlock definition.
140
-
141
- value._stream_field = self
142
- return value
143
-
144
- def _to_python(self, value):
145
- if value is None or value == "":
146
- return StreamValue(self.stream_block, [])
147
- elif isinstance(value, StreamValue):
148
- return value
149
- elif isinstance(value, str):
150
- try:
151
- unpacked_value = json.loads(value)
152
- except ValueError:
153
- # value is not valid JSON; most likely, this field was previously a
154
- # rich text field before being migrated to StreamField, and the data
155
- # was left intact in the migration. Return an empty stream instead
156
- # (but keep the raw text available as an attribute, so that it can be
157
- # used to migrate that data to StreamField)
158
- return StreamValue(self.stream_block, [], raw_text=value)
159
-
160
- if unpacked_value is None:
161
- # we get here if value is the literal string 'null'. This should probably
162
- # never happen if the rest of the (de)serialization code is working properly,
163
- # but better to handle it just in case...
164
- return StreamValue(self.stream_block, [])
165
-
166
- return self.stream_block.to_python(unpacked_value)
167
- elif value and isinstance(value, list) and isinstance(value[0], dict):
168
- # The value is already unpacked since JSONField-based StreamField should
169
- # accept deserialised values (no need to call json.dumps() first).
170
- # In addition, the value is not a list of (block_name, value) tuples
171
- # handled in the `else` block.
172
- return self.stream_block.to_python(value)
173
- else:
174
- # See if it looks like the standard non-smart representation of a
175
- # StreamField value: a list of (block_name, value) tuples
176
- try:
177
- [None for (x, y) in value]
178
- except (TypeError, ValueError):
179
- # Give up trying to make sense of the value
180
- raise TypeError(
181
- "Cannot handle %r (type %r) as a value of StreamField"
182
- % (value, type(value))
183
- )
184
-
185
- # Test succeeded, so return as a StreamValue-ified version of that value
186
- return StreamValue(self.stream_block, value)
140
+ result._stream_field = self
141
+ return result
187
142
 
188
143
  def get_prep_value(self, value):
189
144
  if (
@@ -24,7 +24,7 @@ urlpatterns = [
24
24
  path("multiple/add/", multiple.AddView.as_view(), name="add_multiple"),
25
25
  path("multiple/<int:image_id>/", multiple.EditView.as_view(), name="edit_multiple"),
26
26
  path(
27
- "multiple/create_from_uploaded_image/<int:uploaded_image_id>/",
27
+ "multiple/create_from_uploaded_image/<int:uploaded_file_id>/",
28
28
  multiple.CreateFromUploadedImageView.as_view(),
29
29
  name="create_multiple_from_uploaded_image",
30
30
  ),
@@ -34,7 +34,7 @@ urlpatterns = [
34
34
  name="delete_multiple",
35
35
  ),
36
36
  path(
37
- "multiple/delete_upload/<int:uploaded_image_id>/",
37
+ "multiple/delete_upload/<int:uploaded_file_id>/",
38
38
  multiple.DeleteUploadView.as_view(),
39
39
  name="delete_upload_multiple",
40
40
  ),
Binary file
Binary file
wagtail/images/fields.py CHANGED
@@ -205,5 +205,7 @@ def image_format_name_to_content_type(image_format_name):
205
205
  return "image/webp"
206
206
  elif image_format_name == "avif":
207
207
  return "image/avif"
208
+ elif image_format_name == "ico":
209
+ return "image/x-icon"
208
210
  else:
209
211
  raise ValueError("Unknown image format name")
@@ -409,7 +409,7 @@ class WebPQualityOperation(FilterOperation):
409
409
 
410
410
 
411
411
  class FormatOperation(FilterOperation):
412
- supported_formats = ["jpeg", "png", "gif", "webp", "avif"]
412
+ supported_formats = ["jpeg", "png", "gif", "webp", "avif", "ico"]
413
413
 
414
414
  def construct(self, format, *options):
415
415
  self.format = format
@@ -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"
@@ -144,7 +144,7 @@ msgstr ""
144
144
  msgid "Add/edit images you own"
145
145
  msgstr ""
146
146
 
147
- #: forms.py:202 views/images.py:382
147
+ #: forms.py:202 views/images.py:353
148
148
  msgid "Edit"
149
149
  msgstr ""
150
150
 
@@ -160,39 +160,39 @@ msgstr ""
160
160
  msgid "Select images in choosers"
161
161
  msgstr ""
162
162
 
163
- #: models.py:243
163
+ #: models.py:254
164
164
  msgid "title"
165
165
  msgstr ""
166
166
 
167
- #: models.py:246
167
+ #: models.py:257
168
168
  msgid "file"
169
169
  msgstr ""
170
170
 
171
- #: models.py:251
171
+ #: models.py:262
172
172
  msgid "width"
173
173
  msgstr ""
174
174
 
175
- #: models.py:252
175
+ #: models.py:263
176
176
  msgid "height"
177
177
  msgstr ""
178
178
 
179
- #: models.py:254
179
+ #: models.py:265
180
180
  msgid "created at"
181
181
  msgstr ""
182
182
 
183
- #: models.py:258 models.py:1337
183
+ #: models.py:269
184
184
  msgid "uploaded by user"
185
185
  msgstr ""
186
186
 
187
- #: models.py:266
187
+ #: models.py:277
188
188
  msgid "tags"
189
189
  msgstr ""
190
190
 
191
- #: models.py:824
191
+ #: models.py:853
192
192
  msgid "image"
193
193
  msgstr ""
194
194
 
195
- #: models.py:825
195
+ #: models.py:854
196
196
  msgid "images"
197
197
  msgstr ""
198
198
 
@@ -266,7 +266,7 @@ msgid "Delete images"
266
266
  msgstr ""
267
267
 
268
268
  #: templates/wagtailimages/bulk_actions/confirm_bulk_delete.html:13
269
- #: views/images.py:355
269
+ #: views/images.py:326
270
270
  msgid "Are you sure you want to delete this image?"
271
271
  msgid_plural "Are you sure you want to delete these images?"
272
272
  msgstr[0] ""
@@ -368,7 +368,7 @@ msgstr[1] ""
368
368
  msgid "Change image file:"
369
369
  msgstr ""
370
370
 
371
- #: templates/wagtailimages/images/add.html:4 views/images.py:52
371
+ #: templates/wagtailimages/images/add.html:4 views/images.py:62
372
372
  msgid "Add an image"
373
373
  msgstr ""
374
374
 
@@ -400,7 +400,7 @@ msgid "Editing"
400
400
  msgstr ""
401
401
 
402
402
  #: templates/wagtailimages/images/edit.html:43
403
- #: templates/wagtailimages/images/edit.html:99 views/images.py:343
403
+ #: templates/wagtailimages/images/edit.html:99 views/images.py:314
404
404
  msgid "Delete image"
405
405
  msgstr ""
406
406
 
@@ -450,23 +450,11 @@ msgstr ""
450
450
  msgid "Usage"
451
451
  msgstr ""
452
452
 
453
- #: templates/wagtailimages/images/index.html:24
453
+ #: templates/wagtailimages/images/index.html:14
454
454
  msgid "Sort by"
455
455
  msgstr ""
456
456
 
457
- #: templates/wagtailimages/images/index.html:33
458
- msgid "Entries per page"
459
- msgstr ""
460
-
461
- #: templates/wagtailimages/images/index.html:45
462
- msgid "Popular Tags:"
463
- msgstr ""
464
-
465
- #: templates/wagtailimages/images/index.html:54
466
- msgid "Clear"
467
- msgstr ""
468
-
469
- #: templates/wagtailimages/images/index.html:66
457
+ #: templates/wagtailimages/images/index.html:26
470
458
  msgid "Select all images in listing"
471
459
  msgstr ""
472
460
 
@@ -607,7 +595,7 @@ msgid_plural "%(num_parent_objects)d images have been added to %(collection)s"
607
595
  msgstr[0] ""
608
596
  msgstr[1] ""
609
597
 
610
- #: views/bulk_actions/delete.py:8 views/images.py:211
598
+ #: views/bulk_actions/delete.py:8 views/images.py:182
611
599
  msgid "Delete"
612
600
  msgstr ""
613
601
 
@@ -642,72 +630,72 @@ msgstr ""
642
630
  msgid "Edit this image"
643
631
  msgstr ""
644
632
 
645
- #: views/images.py:37
633
+ #: views/images.py:46
646
634
  msgid "Newest"
647
635
  msgstr ""
648
636
 
649
- #: views/images.py:38
637
+ #: views/images.py:47
650
638
  msgid "Oldest"
651
639
  msgstr ""
652
640
 
653
- #: views/images.py:39
641
+ #: views/images.py:48
654
642
  msgid "Title: (A -> Z)"
655
643
  msgstr ""
656
644
 
657
- #: views/images.py:40
645
+ #: views/images.py:49
658
646
  msgid "Title: (Z -> A)"
659
647
  msgstr ""
660
648
 
661
- #: views/images.py:41
649
+ #: views/images.py:50
662
650
  msgid "File size: (low to high)"
663
651
  msgstr ""
664
652
 
665
- #: views/images.py:42
653
+ #: views/images.py:51
666
654
  msgid "File size: (high to low)"
667
655
  msgstr ""
668
656
 
669
- #: views/images.py:51 wagtail_hooks.py:53 wagtail_hooks.py:170
657
+ #: views/images.py:61 wagtail_hooks.py:52 wagtail_hooks.py:160
670
658
  msgid "Images"
671
659
  msgstr ""
672
660
 
673
- #: views/images.py:184
661
+ #: views/images.py:155
674
662
  #, python-format
675
663
  msgid "Image '%(image_title)s' updated."
676
664
  msgstr ""
677
665
 
678
- #: views/images.py:185
666
+ #: views/images.py:156
679
667
  msgid "Edit again"
680
668
  msgstr ""
681
669
 
682
- #: views/images.py:189
670
+ #: views/images.py:160
683
671
  msgid "The image could not be saved due to errors."
684
672
  msgstr ""
685
673
 
686
- #: views/images.py:206
674
+ #: views/images.py:177
687
675
  msgid ""
688
676
  "The source image file could not be found. Please change the source or delete "
689
677
  "the image."
690
678
  msgstr ""
691
679
 
692
- #: views/images.py:361
680
+ #: views/images.py:332
693
681
  #, python-format
694
682
  msgid "Image '%(image_title)s' deleted."
695
683
  msgstr ""
696
684
 
697
- #: views/images.py:379
685
+ #: views/images.py:350
698
686
  #, python-format
699
687
  msgid "Image '%(image_title)s' added."
700
688
  msgstr ""
701
689
 
702
- #: views/images.py:388
690
+ #: views/images.py:359
703
691
  msgid "The image could not be created due to errors."
704
692
  msgstr ""
705
693
 
706
- #: wagtail_hooks.py:92
694
+ #: wagtail_hooks.py:79
707
695
  msgid "Image"
708
696
  msgstr ""
709
697
 
710
- #: wagtail_hooks.py:190
698
+ #: wagtail_hooks.py:180
711
699
  #, python-format
712
700
  msgid "%(count)s image"
713
701
  msgid_plural "%(count)s images"
@@ -260,6 +260,10 @@ msgstr "Novo"
260
260
  msgid "Latest images"
261
261
  msgstr "Últimas imagens"
262
262
 
263
+ #, python-format
264
+ msgid "Select %(title)s"
265
+ msgstr "Selecionar %(title)s"
266
+
263
267
  msgid "Choose a format"
264
268
  msgstr "Escolher um formato"
265
269
 
@@ -0,0 +1,16 @@
1
+ # Generated by Django 5.0.1 on 2024-01-30 18:19
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wagtailimages', '0025_alter_image_file_alter_rendition_file'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.DeleteModel(
14
+ name='UploadedImage',
15
+ ),
16
+ ]