wagtail 6.2.2__py3-none-any.whl → 6.3rc2__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 (386) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_for_translation.py +6 -0
  3. wagtail/actions/publish_revision.py +3 -3
  4. wagtail/admin/action_menu.py +5 -3
  5. wagtail/admin/forms/account.py +1 -1
  6. wagtail/admin/icons.py +2 -6
  7. wagtail/admin/locale/cy/LC_MESSAGES/django.mo +0 -0
  8. wagtail/admin/locale/cy/LC_MESSAGES/django.po +32 -0
  9. wagtail/admin/locale/dv/LC_MESSAGES/django.mo +0 -0
  10. wagtail/admin/locale/dv/LC_MESSAGES/django.po +28 -0
  11. wagtail/admin/locale/en/LC_MESSAGES/django.po +451 -485
  12. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +7 -7
  13. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  14. wagtail/admin/locale/sl/LC_MESSAGES/django.po +150 -0
  15. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.mo +0 -0
  16. wagtail/admin/locale/sl/LC_MESSAGES/djangojs.po +9 -2
  17. wagtail/admin/locale/ug/LC_MESSAGES/django.mo +0 -0
  18. wagtail/admin/locale/ug/LC_MESSAGES/django.po +3250 -196
  19. wagtail/admin/localization.py +12 -2
  20. wagtail/admin/panels/model_utils.py +1 -1
  21. wagtail/admin/site_summary.py +0 -2
  22. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  23. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  24. wagtail/admin/static/wagtailadmin/images/email-header.jpg +0 -0
  25. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  26. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  27. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +12 -0
  28. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  29. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  30. wagtail/admin/static/wagtailadmin/js/telepath/telepath.js +1 -1
  31. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  32. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  33. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +1 -1
  34. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  35. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  36. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  37. wagtail/admin/staticfiles.py +6 -4
  38. wagtail/admin/templates/wagtailadmin/account/account.html +42 -59
  39. wagtail/admin/templates/wagtailadmin/admin_base.html +0 -28
  40. wagtail/admin/templates/wagtailadmin/bulk_actions/footer.html +1 -1
  41. wagtail/admin/templates/wagtailadmin/chooser/_search_results.html +7 -5
  42. wagtail/admin/templates/wagtailadmin/chooser/tables/page_navigate_to_children_cell.html +1 -1
  43. wagtail/admin/templates/wagtailadmin/generic/chooser/results.html +7 -5
  44. wagtail/admin/templates/wagtailadmin/generic/edit.html +0 -8
  45. wagtail/admin/templates/wagtailadmin/generic/form.html +60 -17
  46. wagtail/admin/templates/wagtailadmin/generic/index.html +17 -0
  47. wagtail/admin/templates/wagtailadmin/generic/index_results.html +9 -35
  48. wagtail/admin/templates/wagtailadmin/generic/inspect.html +2 -21
  49. wagtail/admin/templates/wagtailadmin/generic/listing.html +11 -17
  50. wagtail/admin/templates/wagtailadmin/generic/listing_results.html +19 -1
  51. wagtail/admin/templates/wagtailadmin/home/account_summary.html +26 -0
  52. wagtail/admin/templates/wagtailadmin/home/locked_pages.html +28 -18
  53. wagtail/admin/templates/wagtailadmin/home/recent_edits.html +28 -17
  54. wagtail/admin/templates/wagtailadmin/home/site_summary_pages.html +2 -2
  55. wagtail/admin/templates/wagtailadmin/home/upgrade_notification.html +35 -13
  56. wagtail/admin/templates/wagtailadmin/home/user_objects_in_workflow_moderation.html +28 -18
  57. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +43 -32
  58. wagtail/admin/templates/wagtailadmin/home.html +22 -5
  59. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -1
  60. wagtail/admin/templates/wagtailadmin/pages/action_menu/menu.html +1 -11
  61. wagtail/admin/templates/wagtailadmin/pages/action_menu/menu_item.html +1 -6
  62. wagtail/admin/templates/wagtailadmin/pages/action_menu/page_locked.html +1 -1
  63. wagtail/admin/templates/wagtailadmin/pages/action_menu/publish.html +1 -1
  64. wagtail/admin/templates/wagtailadmin/pages/action_menu/save_draft.html +1 -1
  65. wagtail/admin/templates/wagtailadmin/pages/bulk_actions/confirm_bulk_delete.html +12 -6
  66. wagtail/admin/templates/wagtailadmin/pages/bulk_actions/confirm_bulk_move.html +12 -7
  67. wagtail/admin/templates/wagtailadmin/pages/bulk_actions/confirm_bulk_publish.html +17 -11
  68. wagtail/admin/templates/wagtailadmin/pages/bulk_actions/confirm_bulk_unpublish.html +15 -9
  69. wagtail/admin/templates/wagtailadmin/pages/confirm_delete.html +9 -9
  70. wagtail/admin/templates/wagtailadmin/pages/confirm_move.html +2 -2
  71. wagtail/admin/templates/wagtailadmin/pages/confirm_unpublish.html +4 -4
  72. wagtail/admin/templates/wagtailadmin/pages/create.html +15 -34
  73. wagtail/admin/templates/wagtailadmin/pages/edit.html +15 -30
  74. wagtail/admin/templates/wagtailadmin/pages/explorable_index.html +6 -0
  75. wagtail/admin/templates/wagtailadmin/pages/explorable_index_results.html +60 -0
  76. wagtail/admin/templates/wagtailadmin/pages/index.html +1 -36
  77. wagtail/admin/templates/wagtailadmin/pages/index_results.html +2 -50
  78. wagtail/admin/templates/wagtailadmin/pages/listing/_locked_indicator.html +1 -1
  79. wagtail/admin/templates/wagtailadmin/pages/listing/_ordering_cell.html +1 -1
  80. wagtail/admin/templates/wagtailadmin/pages/listing/_page_header_buttons.html +1 -1
  81. wagtail/admin/templates/wagtailadmin/pages/listing/_page_title_column_header.html +3 -3
  82. wagtail/admin/templates/wagtailadmin/pages/listing/_pagination.html +1 -1
  83. wagtail/admin/templates/wagtailadmin/pages/listing.html +24 -0
  84. wagtail/admin/templates/wagtailadmin/pages/search.html +1 -20
  85. wagtail/admin/templates/wagtailadmin/pages/search_results.html +27 -25
  86. wagtail/admin/templates/wagtailadmin/permissions/includes/collection_member_permissions_formset.html +0 -1
  87. wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_report.html +2 -2
  88. wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_types_usage.html +6 -6
  89. wagtail/admin/templates/wagtailadmin/reports/workflow_tasks_results.html +1 -1
  90. wagtail/admin/templates/wagtailadmin/shared/action_menu/menu.html +14 -0
  91. wagtail/admin/templates/wagtailadmin/shared/action_menu/menu_item.html +6 -0
  92. wagtail/admin/templates/wagtailadmin/shared/avatar.html +13 -3
  93. wagtail/admin/templates/wagtailadmin/shared/header.html +0 -5
  94. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +1 -1
  95. wagtail/admin/templates/wagtailadmin/shared/page_status_tag_new.html +4 -1
  96. wagtail/admin/templates/wagtailadmin/shared/pagination_nav.html +1 -1
  97. wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +1 -1
  98. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/locale.html +1 -1
  99. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/usage.html +2 -2
  100. wagtail/admin/templates/wagtailadmin/shared/side_panels/preview.html +94 -52
  101. wagtail/admin/templates/wagtailadmin/{pages/_unsaved_changes_warning.html → shared/unsaved_changes_warning.html} +4 -4
  102. wagtail/admin/templates/wagtailadmin/shared/usage_summary.html +2 -2
  103. wagtail/admin/templates/wagtailadmin/shared/workflow_history/detail.html +1 -7
  104. wagtail/admin/templates/wagtailadmin/shared/workflow_history/listing.html +1 -0
  105. wagtail/admin/templates/wagtailadmin/shared/workflow_history/{list.html → listing_results.html} +33 -35
  106. wagtail/admin/templates/wagtailadmin/tables/references_cell.html +1 -1
  107. wagtail/admin/templates/wagtailadmin/workflows/create.html +11 -36
  108. wagtail/admin/templates/wagtailadmin/workflows/create_task.html +0 -38
  109. wagtail/admin/templates/wagtailadmin/workflows/edit.html +44 -74
  110. wagtail/admin/templates/wagtailadmin/workflows/edit_task.html +27 -66
  111. wagtail/admin/templates/wagtailadmin/workflows/includes/task_usage_cell.html +4 -2
  112. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_tasks_cell.html +4 -4
  113. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_used_by_cell.html +15 -11
  114. wagtail/admin/templates/wagtailadmin/workflows/task_chooser/includes/results.html +7 -5
  115. wagtail/admin/templatetags/wagtailadmin_tags.py +51 -22
  116. wagtail/admin/tests/pages/test_content_type_use_view.py +82 -2
  117. wagtail/admin/tests/pages/test_edit_page.py +70 -0
  118. wagtail/admin/tests/pages/test_explorer_view.py +65 -4
  119. wagtail/admin/tests/pages/test_page_search.py +8 -7
  120. wagtail/admin/tests/pages/test_page_usage.py +3 -1
  121. wagtail/admin/tests/pages/test_preview.py +208 -63
  122. wagtail/admin/tests/pages/test_reorder_page.py +91 -1
  123. wagtail/admin/tests/pages/test_view_draft.py +32 -1
  124. wagtail/admin/tests/pages/test_workflow_history.py +288 -7
  125. wagtail/admin/tests/test_account_management.py +23 -3
  126. wagtail/admin/tests/test_audit_log.py +24 -2
  127. wagtail/admin/tests/test_collections_views.py +17 -5
  128. wagtail/admin/tests/test_dashboard.py +1 -1
  129. wagtail/admin/tests/test_edit_handlers.py +3 -2
  130. wagtail/admin/tests/test_icon_sprite.py +4 -0
  131. wagtail/admin/tests/test_privacy.py +5 -19
  132. wagtail/admin/tests/test_reports_views.py +1 -1
  133. wagtail/admin/tests/test_site_summary.py +3 -3
  134. wagtail/admin/tests/test_templatetags.py +27 -3
  135. wagtail/admin/tests/test_upgrade_notification.py +71 -18
  136. wagtail/admin/tests/test_views.py +2 -2
  137. wagtail/admin/tests/test_views_generic.py +13 -0
  138. wagtail/admin/tests/test_widgets.py +3 -3
  139. wagtail/admin/tests/test_workflows.py +172 -27
  140. wagtail/admin/tests/tests.py +1 -1
  141. wagtail/admin/tests/viewsets/test_model_viewset.py +55 -3
  142. wagtail/admin/ui/side_panels.py +19 -0
  143. wagtail/admin/ui/sidebar.py +4 -3
  144. wagtail/admin/ui/tables/__init__.py +14 -1
  145. wagtail/admin/ui/tables/pages.py +6 -1
  146. wagtail/admin/urls/pages.py +10 -1
  147. wagtail/admin/urls/workflows.py +6 -1
  148. wagtail/admin/views/account.py +5 -1
  149. wagtail/admin/views/collections.py +0 -2
  150. wagtail/admin/views/generic/base.py +118 -1
  151. wagtail/admin/views/generic/history.py +158 -26
  152. wagtail/admin/views/generic/models.py +113 -99
  153. wagtail/admin/views/home.py +24 -9
  154. wagtail/admin/views/page_privacy.py +54 -30
  155. wagtail/admin/views/pages/history.py +11 -4
  156. wagtail/admin/views/pages/listing.py +76 -89
  157. wagtail/admin/views/pages/preview.py +1 -1
  158. wagtail/admin/views/pages/search.py +27 -71
  159. wagtail/admin/views/pages/usage.py +63 -24
  160. wagtail/admin/views/pages/utils.py +4 -3
  161. wagtail/admin/views/reports/base.py +0 -6
  162. wagtail/admin/views/workflows.py +67 -25
  163. wagtail/admin/viewsets/model.py +4 -3
  164. wagtail/admin/widgets/chooser.py +2 -1
  165. wagtail/api/v2/tests/test_pages.py +15 -2
  166. wagtail/blocks/field_block.py +15 -3
  167. wagtail/blocks/static_block.py +3 -0
  168. wagtail/contrib/forms/locale/cy/LC_MESSAGES/django.mo +0 -0
  169. wagtail/contrib/forms/locale/cy/LC_MESSAGES/django.po +29 -1
  170. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +15 -11
  171. wagtail/contrib/forms/templates/wagtailforms/confirm_delete.html +1 -0
  172. wagtail/contrib/forms/templates/wagtailforms/index.html +1 -1
  173. wagtail/contrib/forms/templates/wagtailforms/index_results.html +1 -1
  174. wagtail/contrib/forms/templates/wagtailforms/list_submissions.html +2 -1
  175. wagtail/contrib/forms/templates/wagtailforms/panels/form_responses_panel.html +2 -2
  176. wagtail/contrib/forms/tests/test_views.py +234 -35
  177. wagtail/contrib/forms/utils.py +8 -14
  178. wagtail/contrib/forms/views.py +72 -27
  179. wagtail/contrib/frontend_cache/backends/azure.py +1 -1
  180. wagtail/contrib/frontend_cache/backends/cloudfront.py +2 -2
  181. wagtail/contrib/frontend_cache/backends/dummy.py +11 -0
  182. wagtail/contrib/frontend_cache/tests.py +31 -37
  183. wagtail/contrib/frontend_cache/utils.py +12 -5
  184. wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.mo +0 -0
  185. wagtail/contrib/redirects/locale/cy/LC_MESSAGES/django.po +16 -1
  186. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +20 -24
  187. wagtail/contrib/redirects/models.py +16 -1
  188. wagtail/contrib/redirects/signal_handlers.py +18 -3
  189. wagtail/contrib/redirects/templates/wagtailredirects/add.html +5 -16
  190. wagtail/contrib/redirects/templates/wagtailredirects/import_summary.html +1 -1
  191. wagtail/contrib/redirects/tests/test_redirects.py +49 -6
  192. wagtail/contrib/redirects/tests/test_signal_handlers.py +42 -1
  193. wagtail/contrib/redirects/views.py +27 -3
  194. wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.mo +0 -0
  195. wagtail/contrib/search_promotions/locale/cy/LC_MESSAGES/django.po +60 -1
  196. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +12 -18
  197. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/add.html +5 -8
  198. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/edit.html +15 -10
  199. wagtail/contrib/search_promotions/tests.py +13 -2
  200. wagtail/contrib/search_promotions/views.py +15 -3
  201. wagtail/contrib/settings/locale/cy/LC_MESSAGES/django.mo +0 -0
  202. wagtail/contrib/settings/locale/cy/LC_MESSAGES/django.po +6 -1
  203. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +2 -10
  204. wagtail/contrib/settings/templates/wagtailsettings/edit.html +12 -45
  205. wagtail/contrib/simple_translation/locale/cy/LC_MESSAGES/django.mo +0 -0
  206. wagtail/contrib/simple_translation/locale/cy/LC_MESSAGES/django.po +13 -1
  207. wagtail/contrib/simple_translation/locale/dv/LC_MESSAGES/django.mo +0 -0
  208. wagtail/contrib/simple_translation/locale/dv/LC_MESSAGES/django.po +3 -0
  209. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +4 -4
  210. wagtail/contrib/simple_translation/locale/sl/LC_MESSAGES/django.mo +0 -0
  211. wagtail/contrib/simple_translation/locale/sl/LC_MESSAGES/django.po +5 -2
  212. wagtail/contrib/simple_translation/tests/test_views.py +51 -0
  213. wagtail/contrib/simple_translation/wagtail_hooks.py +16 -11
  214. wagtail/contrib/styleguide/locale/cy/LC_MESSAGES/django.mo +0 -0
  215. wagtail/contrib/styleguide/locale/cy/LC_MESSAGES/django.po +5 -1
  216. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +1 -1
  217. wagtail/contrib/table_block/locale/cy/LC_MESSAGES/django.mo +0 -0
  218. wagtail/contrib/table_block/locale/cy/LC_MESSAGES/django.po +27 -1
  219. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  220. wagtail/contrib/typed_table_block/blocks.py +25 -0
  221. wagtail/contrib/typed_table_block/locale/cy/LC_MESSAGES/django.mo +0 -0
  222. wagtail/contrib/typed_table_block/locale/cy/LC_MESSAGES/django.po +12 -1
  223. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  224. wagtail/contrib/typed_table_block/tests.py +24 -1
  225. wagtail/coreutils.py +5 -11
  226. wagtail/documents/admin_urls.py +2 -2
  227. wagtail/documents/locale/cy/LC_MESSAGES/django.mo +0 -0
  228. wagtail/documents/locale/cy/LC_MESSAGES/django.po +10 -0
  229. wagtail/documents/locale/en/LC_MESSAGES/django.po +61 -76
  230. wagtail/documents/migrations/0014_alter_document_file_size.py +18 -0
  231. wagtail/documents/models.py +1 -1
  232. wagtail/documents/rich_text/__init__.py +1 -3
  233. wagtail/documents/static/wagtaildocs/js/add-multiple.js +1 -1
  234. wagtail/documents/templates/wagtaildocs/bulk_actions/confirm_bulk_add_tags.html +5 -1
  235. wagtail/documents/templates/wagtaildocs/bulk_actions/confirm_bulk_add_to_collection.html +5 -1
  236. wagtail/documents/templates/wagtaildocs/bulk_actions/confirm_bulk_delete.html +11 -5
  237. wagtail/documents/templates/wagtaildocs/documents/add.html +13 -41
  238. wagtail/documents/templates/wagtaildocs/documents/edit.html +28 -56
  239. wagtail/documents/templates/wagtaildocs/documents/index.html +1 -4
  240. wagtail/documents/templates/wagtaildocs/homepage/site_summary_documents.html +2 -2
  241. wagtail/documents/templates/wagtaildocs/multiple/add.html +36 -41
  242. wagtail/documents/tests/test_admin_views.py +64 -6
  243. wagtail/documents/tests/test_site_summary.py +3 -3
  244. wagtail/documents/views/documents.py +103 -113
  245. wagtail/documents/views/multiple.py +19 -1
  246. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  247. wagtail/embeds/oembed_providers.py +9 -19
  248. wagtail/fields.py +43 -27
  249. wagtail/images/admin_urls.py +2 -2
  250. wagtail/images/blocks.py +230 -2
  251. wagtail/images/fields.py +17 -29
  252. wagtail/images/image_operations.py +1 -1
  253. wagtail/images/locale/cy/LC_MESSAGES/django.mo +0 -0
  254. wagtail/images/locale/cy/LC_MESSAGES/django.po +128 -1
  255. wagtail/images/locale/en/LC_MESSAGES/django.po +119 -129
  256. wagtail/images/migrations/0025_alter_image_file_alter_rendition_file.py +36 -43
  257. wagtail/images/migrations/0027_image_description.py +20 -0
  258. wagtail/images/models.py +120 -45
  259. wagtail/images/rich_text/__init__.py +1 -3
  260. wagtail/images/static/wagtailimages/js/add-multiple.js +1 -1
  261. wagtail/images/static/wagtailimages/js/image-block.js +1 -0
  262. wagtail/images/templates/wagtailimages/bulk_actions/confirm_bulk_add_tags.html +5 -1
  263. wagtail/images/templates/wagtailimages/bulk_actions/confirm_bulk_add_to_collection.html +5 -1
  264. wagtail/images/templates/wagtailimages/bulk_actions/confirm_bulk_delete.html +11 -5
  265. wagtail/images/templates/wagtailimages/chooser/results.html +2 -2
  266. wagtail/images/templates/wagtailimages/homepage/site_summary_images.html +2 -2
  267. wagtail/images/templates/wagtailimages/images/_file_field.html +2 -2
  268. wagtail/images/templates/wagtailimages/images/add.html +13 -31
  269. wagtail/images/templates/wagtailimages/images/edit.html +53 -82
  270. wagtail/images/templates/wagtailimages/images/index.html +1 -4
  271. wagtail/images/templates/wagtailimages/images/url_generator.html +1 -1
  272. wagtail/images/templates/wagtailimages/multiple/add.html +40 -47
  273. wagtail/images/templates/wagtailimages/widgets/image.html +5 -0
  274. wagtail/images/templates/wagtailimages/widgets/image_chooser.html +1 -1
  275. wagtail/images/tests/test_admin_views.py +70 -10
  276. wagtail/images/tests/test_blocks.py +367 -1
  277. wagtail/images/tests/test_image_operations.py +23 -0
  278. wagtail/images/tests/test_models.py +20 -0
  279. wagtail/images/tests/test_signal_handlers.py +99 -95
  280. wagtail/images/tests/test_site_summary.py +3 -3
  281. wagtail/images/tests/test_templatetags.py +11 -7
  282. wagtail/images/tests/tests.py +4 -0
  283. wagtail/images/views/images.py +103 -104
  284. wagtail/images/views/multiple.py +17 -1
  285. wagtail/locale/cy/LC_MESSAGES/django.mo +0 -0
  286. wagtail/locale/cy/LC_MESSAGES/django.po +3 -0
  287. wagtail/locale/en/LC_MESSAGES/django.po +137 -125
  288. wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
  289. wagtail/locale/sl/LC_MESSAGES/django.po +3 -0
  290. wagtail/locales/locale/en/LC_MESSAGES/django.po +8 -8
  291. wagtail/locales/views.py +4 -1
  292. wagtail/migrations/0089_log_entry_data_json_null_to_object.py +1 -7
  293. wagtail/models/__init__.py +122 -14
  294. wagtail/models/audit_log.py +1 -3
  295. wagtail/models/i18n.py +1 -2
  296. wagtail/project_template/Dockerfile +3 -3
  297. wagtail/project_template/requirements.txt +2 -2
  298. wagtail/query.py +17 -4
  299. wagtail/rich_text/__init__.py +2 -3
  300. wagtail/rich_text/pages.py +2 -4
  301. wagtail/rich_text/rewriters.py +2 -2
  302. wagtail/search/backends/database/mysql/query.py +3 -3
  303. wagtail/search/backends/database/sqlite/query.py +6 -6
  304. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  305. wagtail/sites/locale/en/LC_MESSAGES/django.po +6 -6
  306. wagtail/sites/views.py +0 -1
  307. wagtail/snippets/action_menu.py +14 -4
  308. wagtail/snippets/locale/cy/LC_MESSAGES/django.mo +0 -0
  309. wagtail/snippets/locale/cy/LC_MESSAGES/django.po +73 -1
  310. wagtail/snippets/locale/en/LC_MESSAGES/django.po +27 -33
  311. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  312. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  313. wagtail/snippets/templates/wagtailsnippets/bulk_actions/confirm_bulk_delete.html +5 -3
  314. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/locked.html +1 -1
  315. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/menu.html +1 -11
  316. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/menu_item.html +1 -6
  317. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/publish.html +1 -1
  318. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/save.html +1 -1
  319. wagtail/snippets/templates/wagtailsnippets/snippets/create.html +1 -18
  320. wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +1 -14
  321. wagtail/snippets/templates/wagtailsnippets/snippets/index.html +2 -5
  322. wagtail/snippets/tests/test_preview.py +193 -61
  323. wagtail/snippets/tests/test_snippets.py +247 -38
  324. wagtail/snippets/tests/test_usage.py +5 -0
  325. wagtail/snippets/tests/test_viewset.py +25 -9
  326. wagtail/snippets/tests/test_workflows.py +232 -19
  327. wagtail/snippets/views/snippets.py +1 -10
  328. wagtail/test/numberformat.py +104 -0
  329. wagtail/test/settings.py +10 -0
  330. wagtail/test/settings_ui.py +2 -0
  331. wagtail/test/testapp/migrations/0010_alter_customimage_file_and_more.py +71 -78
  332. wagtail/test/testapp/migrations/0040_nocreatablesubpagetypespage_nosubpagetypespage.py +54 -0
  333. wagtail/test/testapp/migrations/0041_alter_jsonstreammodel_options.py +17 -0
  334. wagtail/test/testapp/migrations/0042_alter_customdocument_file_size_and_more.py +28 -0
  335. wagtail/test/testapp/migrations/0043_customimage_description.py +41 -0
  336. wagtail/test/testapp/migrations/0044_custompreviewsizesmodel_custompreviewsizespage.py +52 -0
  337. wagtail/test/testapp/migrations/0045_alter_streampage_body.py +52 -0
  338. wagtail/test/testapp/models.py +62 -4
  339. wagtail/test/testapp/rich_text.py +2 -2
  340. wagtail/test/testapp/templates/tests/form_page_landing.html +2 -1
  341. wagtail/test/testapp/urls.py +5 -0
  342. wagtail/test/testapp/views.py +5 -0
  343. wagtail/test/utils/page_tests.py +5 -5
  344. wagtail/test/utils/template_tests.py +2 -2
  345. wagtail/tests/test_blocks.py +15 -0
  346. wagtail/tests/test_page_permissions.py +109 -0
  347. wagtail/tests/test_revision_model.py +27 -0
  348. wagtail/tests/test_signals.py +21 -2
  349. wagtail/tests/test_tests.py +30 -0
  350. wagtail/users/locale/cy/LC_MESSAGES/django.mo +0 -0
  351. wagtail/users/locale/cy/LC_MESSAGES/django.po +118 -1
  352. wagtail/users/locale/dv/LC_MESSAGES/django.mo +0 -0
  353. wagtail/users/locale/dv/LC_MESSAGES/django.po +3 -0
  354. wagtail/users/locale/en/LC_MESSAGES/django.po +89 -113
  355. wagtail/users/locale/sl/LC_MESSAGES/django.mo +0 -0
  356. wagtail/users/locale/sl/LC_MESSAGES/django.po +3 -0
  357. wagtail/users/migrations/0014_userprofile_contrast.py +23 -0
  358. wagtail/users/models.py +11 -0
  359. wagtail/users/templates/wagtailusers/bulk_actions/confirm_bulk_assign_role.html +5 -1
  360. wagtail/users/templates/wagtailusers/bulk_actions/confirm_bulk_delete.html +5 -1
  361. wagtail/users/templates/wagtailusers/bulk_actions/confirm_bulk_set_active_state.html +5 -1
  362. wagtail/users/templates/wagtailusers/groups/create.html +19 -17
  363. wagtail/users/templates/wagtailusers/groups/edit.html +2 -40
  364. wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +1 -62
  365. wagtail/users/templates/wagtailusers/groups/includes/page_permissions_formset.html +0 -1
  366. wagtail/users/templates/wagtailusers/users/create.html +46 -50
  367. wagtail/users/templates/wagtailusers/users/edit.html +45 -62
  368. wagtail/users/templates/wagtailusers/users/index.html +1 -4
  369. wagtail/users/templatetags/wagtailusers_tags.py +1 -5
  370. wagtail/users/tests/test_admin_views.py +85 -66
  371. wagtail/users/views/groups.py +4 -1
  372. wagtail/users/views/users.py +2 -0
  373. {wagtail-6.2.2.dist-info → wagtail-6.3rc2.dist-info}/METADATA +6 -6
  374. {wagtail-6.2.2.dist-info → wagtail-6.3rc2.dist-info}/RECORD +378 -367
  375. wagtail/admin/static/wagtailadmin/js/preview-panel.js +0 -2
  376. wagtail/admin/static/wagtailadmin/js/preview-panel.js.LICENSE.txt +0 -11
  377. wagtail/admin/templates/wagtailadmin/generic/history_results.html +0 -1
  378. wagtail/admin/templates/wagtailadmin/page_privacy/ancestor_privacy.html +0 -3
  379. wagtail/admin/templates/wagtailadmin/pages/usage_results.html +0 -6
  380. wagtail/admin/templates/wagtailadmin/shared/workflow_history/index.html +0 -17
  381. wagtail/admin/templates/wagtailadmin/shared/workflow_history/results.html +0 -17
  382. wagtail/admin/templates/wagtailadmin/workflows/usage.html +0 -44
  383. {wagtail-6.2.2.dist-info → wagtail-6.3rc2.dist-info}/LICENSE +0 -0
  384. {wagtail-6.2.2.dist-info → wagtail-6.3rc2.dist-info}/WHEEL +0 -0
  385. {wagtail-6.2.2.dist-info → wagtail-6.3rc2.dist-info}/entry_points.txt +0 -0
  386. {wagtail-6.2.2.dist-info → wagtail-6.3rc2.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,7 @@ from wagtail.images.tests.utils import (
12
12
 
13
13
  LIBRARIES = {
14
14
  "wagtailimages_tags": "wagtail.images.templatetags.wagtailimages_tags",
15
+ "l10n": "django.templatetags.l10n",
15
16
  }
16
17
 
17
18
 
@@ -123,7 +124,10 @@ class ImagesTestCase(TestCase):
123
124
  cls.engine = Engine(
124
125
  app_dirs=True,
125
126
  libraries=LIBRARIES,
126
- builtins=[LIBRARIES["wagtailimages_tags"]],
127
+ builtins=[
128
+ LIBRARIES["wagtailimages_tags"],
129
+ LIBRARIES["l10n"],
130
+ ],
127
131
  )
128
132
 
129
133
  @classmethod
@@ -275,8 +279,8 @@ class SrcsetImageTagTestCase(ImagesTestCase):
275
279
  def test_srcset_image_assignment(self):
276
280
  template = (
277
281
  "{% srcset_image myimage width-{30,60} as bg %}"
278
- "width: {{ bg.renditions.0.width }}, url: {{ bg.renditions.0.url }} "
279
- "width: {{ bg.renditions.1.width }}, url: {{ bg.renditions.1.url }} "
282
+ "width: {{ bg.renditions.0.width|unlocalize }}, url: {{ bg.renditions.0.url }} "
283
+ "width: {{ bg.renditions.1.width|unlocalize }}, url: {{ bg.renditions.1.url }} "
280
284
  )
281
285
  rendered = self.render(template, {"myimage": self.image})
282
286
  expected = f"""
@@ -403,10 +407,10 @@ class PictureTagTestCase(ImagesTestCase):
403
407
  def test_picture_assignment(self):
404
408
  template = (
405
409
  "{% picture myimage width-{550,600} format-{jpeg,webp} as bg %}"
406
- "width: {{ bg.formats.jpeg.0.width }}, url: {{ bg.formats.jpeg.0.url }} "
407
- "width: {{ bg.formats.jpeg.1.width }}, url: {{ bg.formats.jpeg.1.url }} "
408
- "width: {{ bg.formats.webp.0.width }}, url: {{ bg.formats.webp.0.url }} "
409
- "width: {{ bg.formats.webp.1.width }}, url: {{ bg.formats.webp.1.url }} "
410
+ "width: {{ bg.formats.jpeg.0.width|unlocalize }}, url: {{ bg.formats.jpeg.0.url }} "
411
+ "width: {{ bg.formats.jpeg.1.width|unlocalize }}, url: {{ bg.formats.jpeg.1.url }} "
412
+ "width: {{ bg.formats.webp.0.width|unlocalize }}, url: {{ bg.formats.webp.0.url }} "
413
+ "width: {{ bg.formats.webp.1.width|unlocalize }}, url: {{ bg.formats.webp.1.url }} "
410
414
  )
411
415
  rendered = self.render(template, {"myimage": self.image})
412
416
  expected = f"""
@@ -722,6 +722,7 @@ class TestGetImageForm(WagtailTestUtils, TestCase):
722
722
  [
723
723
  "title",
724
724
  "file",
725
+ "description",
725
726
  "collection",
726
727
  "tags",
727
728
  "focal_point_x",
@@ -739,6 +740,7 @@ class TestGetImageForm(WagtailTestUtils, TestCase):
739
740
  [
740
741
  "title",
741
742
  "file",
743
+ "description",
742
744
  "collection",
743
745
  "tags",
744
746
  "focal_point_x",
@@ -844,11 +846,13 @@ class TestDifferentUpload(TestCase):
844
846
  def test_upload_path(self):
845
847
  image = CustomImageFilePath.objects.create(
846
848
  title="Test image",
849
+ description="A test description",
847
850
  file=get_test_image_file(),
848
851
  )
849
852
 
850
853
  second_image = CustomImageFilePath.objects.create(
851
854
  title="Test Image",
855
+ description="A test description",
852
856
  file=get_test_image_file(colour="black"),
853
857
  )
854
858
 
@@ -4,12 +4,10 @@ from tempfile import SpooledTemporaryFile
4
4
  from django.conf import settings
5
5
  from django.core.exceptions import PermissionDenied
6
6
  from django.http import FileResponse, HttpResponse, JsonResponse
7
- from django.shortcuts import get_object_or_404, redirect
8
- from django.template.response import TemplateResponse
7
+ from django.shortcuts import get_object_or_404
9
8
  from django.urls import reverse
10
9
  from django.urls.exceptions import NoReverseMatch
11
10
  from django.utils.functional import cached_property
12
- from django.utils.http import urlencode
13
11
  from django.utils.translation import gettext as _
14
12
  from django.utils.translation import gettext_lazy, ngettext
15
13
  from django.views import View
@@ -65,7 +63,6 @@ class IndexView(generic.IndexView):
65
63
  index_results_url_name = "wagtailimages:index_results"
66
64
  add_url_name = "wagtailimages:add_multiple"
67
65
  edit_url_name = "wagtailimages:edit"
68
- _show_breadcrumbs = True
69
66
  template_name = "wagtailimages/images/index.html"
70
67
  results_template_name = "wagtailimages/images/index_results.html"
71
68
  columns = []
@@ -126,84 +123,84 @@ class IndexView(generic.IndexView):
126
123
  return context
127
124
 
128
125
 
129
- @permission_checker.require("change")
130
- def edit(request, image_id):
131
- Image = get_image_model()
132
- ImageForm = get_image_form(Image)
133
-
134
- image = get_object_or_404(Image, id=image_id)
126
+ class EditView(generic.EditView):
127
+ permission_policy = permission_policy
128
+ pk_url_kwarg = "image_id"
129
+ error_message = gettext_lazy("The image could not be saved due to errors.")
130
+ template_name = "wagtailimages/images/edit.html"
131
+ index_url_name = "wagtailimages:index"
132
+ edit_url_name = "wagtailimages:edit"
133
+ delete_url_name = "wagtailimages:delete"
134
+ url_generator_url_name = "wagtailimages:url_generator"
135
+ header_icon = "image"
136
+ context_object_name = "image"
137
+ _show_breadcrumbs = True
135
138
 
136
- if not permission_policy.user_has_permission_for_instance(
137
- request.user, "change", image
138
- ):
139
- raise PermissionDenied
139
+ @cached_property
140
+ def model(self):
141
+ return get_image_model()
140
142
 
141
- next_url = get_valid_next_url_from_request(request)
143
+ def get_form_class(self):
144
+ return get_image_form(self.model)
142
145
 
143
- if request.method == "POST":
144
- form = ImageForm(request.POST, request.FILES, instance=image, user=request.user)
145
- if form.is_valid():
146
- form.save()
146
+ def get_form_kwargs(self):
147
+ kwargs = super().get_form_kwargs()
148
+ kwargs["user"] = self.request.user
149
+ return kwargs
147
150
 
148
- edit_url = reverse("wagtailimages:edit", args=(image.id,))
149
- redirect_url = "wagtailimages:index"
150
- if next_url:
151
- edit_url = f"{edit_url}?{urlencode({'next': next_url})}"
152
- redirect_url = next_url
151
+ def get_object(self, queryset=None):
152
+ obj = super().get_object(queryset)
153
+ if not permission_policy.user_has_permission_for_instance(
154
+ self.request.user, "change", obj
155
+ ):
156
+ raise PermissionDenied
157
+ return obj
153
158
 
154
- messages.success(
155
- request,
156
- _("Image '%(image_title)s' updated.") % {"image_title": image.title},
157
- buttons=[messages.button(edit_url, _("Edit again"))],
158
- )
159
- return redirect(redirect_url)
160
- else:
161
- messages.error(request, _("The image could not be saved due to errors."))
162
- else:
163
- form = ImageForm(instance=image, user=request.user)
159
+ def get_success_message(self):
160
+ return _("Image '%(image_title)s' updated.") % {
161
+ "image_title": self.object.title
162
+ }
164
163
 
165
- # Check if we should enable the frontend url generator
166
- try:
167
- reverse("wagtailimages_serve", args=("foo", "1", "bar"))
168
- url_generator_enabled = True
169
- except NoReverseMatch:
170
- url_generator_enabled = False
171
-
172
- if image.is_stored_locally():
173
- # Give error if image file doesn't exist
174
- if not os.path.isfile(image.file.path):
175
- messages.error(
176
- request,
177
- _(
178
- "The source image file could not be found. Please change the source or delete the image."
179
- )
180
- % {"image_title": image.title},
181
- buttons=[
182
- messages.button(
183
- reverse("wagtailimages:delete", args=(image.id,)), _("Delete")
164
+ @cached_property
165
+ def next_url(self):
166
+ return get_valid_next_url_from_request(self.request)
167
+
168
+ def get_success_url(self):
169
+ return self.next_url or super().get_success_url()
170
+
171
+ def render_to_response(self, context, **response_kwargs):
172
+ if self.object.is_stored_locally():
173
+ # Give error if image file doesn't exist
174
+ if not os.path.isfile(self.object.file.path):
175
+ messages.error(
176
+ self.request,
177
+ _(
178
+ "The source image file could not be found. Please change the source or delete the image."
184
179
  )
185
- ],
180
+ % {"image_title": self.object.title},
181
+ buttons=[messages.button(self.get_delete_url(), _("Delete"))],
182
+ )
183
+
184
+ return super().render_to_response(context, **response_kwargs)
185
+
186
+ def get_context_data(self, **kwargs):
187
+ context = super().get_context_data(**kwargs)
188
+ context["next"] = self.next_url
189
+
190
+ try:
191
+ context["filesize"] = self.object.get_file_size()
192
+ except SourceImageIOError:
193
+ context["filesize"] = None
194
+
195
+ try:
196
+ reverse("wagtailimages_serve", args=("foo", "1", "bar"))
197
+ context["url_generator_url"] = reverse(
198
+ self.url_generator_url_name, args=(self.object.id,)
186
199
  )
200
+ except NoReverseMatch:
201
+ context["url_generator_url"] = None
187
202
 
188
- try:
189
- filesize = image.get_file_size()
190
- except SourceImageIOError:
191
- filesize = None
192
-
193
- return TemplateResponse(
194
- request,
195
- "wagtailimages/images/edit.html",
196
- {
197
- "image": image,
198
- "form": form,
199
- "url_generator_enabled": url_generator_enabled,
200
- "filesize": filesize,
201
- "user_can_delete": permission_policy.user_has_permission_for_instance(
202
- request.user, "delete", image
203
- ),
204
- "next": next_url,
205
- },
206
- )
203
+ return context
207
204
 
208
205
 
209
206
  class URLGeneratorView(generic.InspectView):
@@ -211,8 +208,11 @@ class URLGeneratorView(generic.InspectView):
211
208
  model = get_image_model()
212
209
  pk_url_kwarg = "image_id"
213
210
  header_icon = "image"
214
- page_title = "Generating URL"
211
+ page_title = gettext_lazy("Generate URL")
215
212
  template_name = "wagtailimages/images/url_generator.html"
213
+ index_url_name = "wagtailimages:index"
214
+ edit_url_name = "wagtailimages:edit"
215
+ _show_breadcrumbs = True
216
216
 
217
217
  def get_page_subtitle(self):
218
218
  return self.object.title
@@ -338,39 +338,33 @@ class DeleteView(generic.DeleteView):
338
338
  }
339
339
 
340
340
 
341
- @permission_checker.require("add")
342
- def add(request):
343
- ImageModel = get_image_model()
344
- ImageForm = get_image_form(ImageModel)
341
+ class CreateView(generic.CreateView):
342
+ permission_policy = permission_policy
343
+ index_url_name = "wagtailimages:index"
344
+ add_url_name = "wagtailimages:add"
345
+ edit_url_name = "wagtailimages:edit"
346
+ error_message = gettext_lazy("The image could not be created due to errors.")
347
+ template_name = "wagtailimages/images/add.html"
348
+ header_icon = "image"
349
+ _show_breadcrumbs = True
350
+
351
+ @cached_property
352
+ def model(self):
353
+ return get_image_model()
354
+
355
+ def get_form_class(self):
356
+ return get_image_form(self.model)
345
357
 
346
- if request.method == "POST":
347
- image = ImageModel(uploaded_by_user=request.user)
348
- form = ImageForm(request.POST, request.FILES, instance=image, user=request.user)
349
- if form.is_valid():
350
- form.save()
358
+ def get_form_kwargs(self):
359
+ kwargs = super().get_form_kwargs()
360
+ kwargs["user"] = self.request.user
361
+ return kwargs
351
362
 
352
- messages.success(
353
- request,
354
- _("Image '%(image_title)s' added.") % {"image_title": image.title},
355
- buttons=[
356
- messages.button(
357
- reverse("wagtailimages:edit", args=(image.id,)), _("Edit")
358
- )
359
- ],
360
- )
361
- return redirect("wagtailimages:index")
362
- else:
363
- messages.error(request, _("The image could not be created due to errors."))
364
- else:
365
- form = ImageForm(user=request.user)
363
+ def get_initial_form_instance(self):
364
+ return self.model(uploaded_by_user=self.request.user)
366
365
 
367
- return TemplateResponse(
368
- request,
369
- "wagtailimages/images/add.html",
370
- {
371
- "form": form,
372
- },
373
- )
366
+ def get_success_message(self, instance):
367
+ return _("Image '%(image_title)s' added.") % {"image_title": instance.title}
374
368
 
375
369
 
376
370
  class UsageView(generic.UsageView):
@@ -380,6 +374,11 @@ class UsageView(generic.UsageView):
380
374
  permission_policy = permission_policy
381
375
  permission_required = "change"
382
376
  header_icon = "image"
377
+ index_url_name = "wagtailimages:index"
378
+ edit_url_name = "wagtailimages:edit"
379
+
380
+ def get_base_object_queryset(self):
381
+ return super().get_base_object_queryset().select_related("uploaded_by_user")
383
382
 
384
383
  def user_has_permission(self, permission):
385
384
  return self.permission_policy.user_has_permission_for_instance(
@@ -2,7 +2,10 @@ import os.path
2
2
 
3
3
  from django.template.loader import render_to_string
4
4
  from django.urls import reverse
5
+ from django.utils.text import capfirst
6
+ from django.utils.translation import gettext_lazy
5
7
 
8
+ from wagtail.admin.views.generic.base import WagtailAdminTemplateMixin
6
9
  from wagtail.admin.views.generic.multiple_upload import AddView as BaseAddView
7
10
  from wagtail.admin.views.generic.multiple_upload import (
8
11
  CreateFromUploadView as BaseCreateFromUploadView,
@@ -19,10 +22,14 @@ from wagtail.images.permissions import ImagesPermissionPolicyGetter, permission_
19
22
  from wagtail.images.utils import find_image_duplicates
20
23
 
21
24
 
22
- class AddView(BaseAddView):
25
+ class AddView(WagtailAdminTemplateMixin, BaseAddView):
23
26
  permission_policy = ImagesPermissionPolicyGetter()
24
27
  template_name = "wagtailimages/multiple/add.html"
28
+ header_icon = "image"
29
+ page_title = gettext_lazy("Add images")
30
+ _show_breadcrumbs = True
25
31
 
32
+ index_url_name = "wagtailimages:index"
26
33
  edit_object_url_name = "wagtailimages:edit_multiple"
27
34
  delete_object_url_name = "wagtailimages:delete_multiple"
28
35
  edit_object_form_prefix = "image"
@@ -35,6 +42,15 @@ class AddView(BaseAddView):
35
42
  context_upload_name = "uploaded_image"
36
43
  context_upload_id_name = "uploaded_file_id"
37
44
 
45
+ def get_breadcrumbs_items(self):
46
+ return self.breadcrumbs_items + [
47
+ {
48
+ "url": reverse(self.index_url_name),
49
+ "label": capfirst(self.model._meta.verbose_name_plural),
50
+ },
51
+ {"url": "", "label": self.get_page_title()},
52
+ ]
53
+
38
54
  def get_model(self):
39
55
  return get_image_model()
40
56
 
Binary file
@@ -40,6 +40,9 @@ msgstr "Cyfrinair"
40
40
  msgid "Comment"
41
41
  msgstr "Sylw"
42
42
 
43
+ msgid "Locked"
44
+ msgstr "Wedi' gloi"
45
+
43
46
  msgid "Default"
44
47
  msgstr "Diofyn"
45
48