wagtail 6.3.1__py3-none-any.whl → 6.4rc1__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 (307) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/publish_revision.py +4 -5
  3. wagtail/admin/auth.py +0 -2
  4. wagtail/admin/checks.py +1 -1
  5. wagtail/admin/filters.py +3 -1
  6. wagtail/admin/forms/account.py +21 -11
  7. wagtail/admin/forms/collections.py +2 -9
  8. wagtail/admin/forms/formsets.py +32 -0
  9. wagtail/admin/forms/pages.py +5 -1
  10. wagtail/admin/forms/workflows.py +2 -13
  11. wagtail/admin/locale/ar/LC_MESSAGES/django.mo +0 -0
  12. wagtail/admin/locale/ar/LC_MESSAGES/django.po +68 -1
  13. wagtail/admin/locale/ar/LC_MESSAGES/djangojs.mo +0 -0
  14. wagtail/admin/locale/ar/LC_MESSAGES/djangojs.po +5 -1
  15. wagtail/admin/locale/en/LC_MESSAGES/django.po +312 -356
  16. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +21 -16
  17. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.mo +0 -0
  18. wagtail/admin/locale/gl/LC_MESSAGES/djangojs.po +5 -5
  19. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  20. wagtail/admin/locale/pt_BR/LC_MESSAGES/django.po +29 -0
  21. wagtail/admin/menu.py +0 -13
  22. wagtail/admin/panels/base.py +2 -2
  23. wagtail/admin/panels/group.py +4 -1
  24. wagtail/admin/panels/inline_panel.py +5 -2
  25. wagtail/admin/panels/model_utils.py +36 -0
  26. wagtail/admin/panels/page_utils.py +2 -40
  27. wagtail/admin/panels/signal_handlers.py +0 -2
  28. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  29. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  30. wagtail/admin/static/wagtailadmin/css/panels/streamfield.css +1 -1
  31. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  32. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  33. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -8
  34. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  35. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  36. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  37. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  38. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  39. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  40. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  41. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +1 -1
  42. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  43. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +7 -0
  44. wagtail/admin/templates/wagtailadmin/404.html +4 -0
  45. wagtail/admin/templates/wagtailadmin/chooser/browse.html +2 -1
  46. wagtail/admin/templates/wagtailadmin/chooser/tables/parent_page_cell.html +1 -1
  47. wagtail/admin/templates/wagtailadmin/collections/_privacy_switch.html +8 -1
  48. wagtail/admin/templates/wagtailadmin/generic/confirm_delete.html +15 -9
  49. wagtail/admin/templates/wagtailadmin/generic/confirm_unpublish.html +21 -25
  50. wagtail/admin/templates/wagtailadmin/generic/form.html +1 -1
  51. wagtail/admin/templates/wagtailadmin/generic/preview_error.html +3 -0
  52. wagtail/admin/templates/wagtailadmin/generic/revisions/compare.html +63 -76
  53. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -2
  54. wagtail/admin/templates/wagtailadmin/pages/edit.html +1 -5
  55. wagtail/admin/templates/wagtailadmin/panels/inline_panel_child.html +1 -0
  56. wagtail/admin/templates/wagtailadmin/permissions/includes/collection_member_permissions_form.html +1 -1
  57. wagtail/admin/templates/wagtailadmin/permissions/includes/collection_member_permissions_formset.html +6 -22
  58. wagtail/admin/templates/wagtailadmin/shared/formatted_field.html +2 -2
  59. wagtail/admin/templates/wagtailadmin/shared/header.html +2 -2
  60. wagtail/admin/templates/wagtailadmin/shared/page_status_tag_new.html +32 -39
  61. wagtail/admin/templates/wagtailadmin/shared/revisions/confirm_unschedule.html +13 -17
  62. wagtail/admin/templates/wagtailadmin/shared/side_panels/includes/status/privacy.html +15 -3
  63. wagtail/admin/templates/wagtailadmin/shared/side_panels/preview.html +1 -1
  64. wagtail/admin/templates/wagtailadmin/skeleton.html +4 -2
  65. wagtail/admin/templates/wagtailadmin/workflows/create.html +1 -1
  66. wagtail/admin/templates/wagtailadmin/workflows/edit.html +1 -1
  67. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_pages_form.html +1 -1
  68. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_pages_formset.html +6 -23
  69. wagtail/admin/templatetags/wagtailadmin_tags.py +12 -0
  70. wagtail/admin/templatetags/wagtailuserbar.py +2 -3
  71. wagtail/admin/tests/pages/test_create_page.py +110 -1
  72. wagtail/admin/tests/pages/test_edit_page.py +3 -2
  73. wagtail/admin/tests/pages/test_explorer_view.py +18 -0
  74. wagtail/admin/tests/pages/test_page_usage.py +24 -20
  75. wagtail/admin/tests/pages/test_preview.py +69 -1
  76. wagtail/admin/tests/pages/test_revisions.py +40 -6
  77. wagtail/admin/tests/test_account_management.py +39 -1
  78. wagtail/admin/tests/test_audit_log.py +4 -2
  79. wagtail/admin/tests/test_block_preview.py +224 -0
  80. wagtail/admin/tests/test_edit_handlers.py +23 -6
  81. wagtail/admin/tests/test_page_chooser.py +50 -3
  82. wagtail/admin/tests/test_privacy.py +49 -26
  83. wagtail/admin/tests/test_site_summary.py +15 -10
  84. wagtail/admin/tests/test_templatetags.py +19 -0
  85. wagtail/admin/tests/test_userbar.py +82 -1
  86. wagtail/admin/tests/test_views_generic.py +27 -12
  87. wagtail/admin/tests/test_workflows.py +69 -0
  88. wagtail/admin/tests/tests.py +23 -4
  89. wagtail/admin/tests/ui/test_sidebar.py +1 -1
  90. wagtail/admin/tests/viewsets/test_model_viewset.py +15 -13
  91. wagtail/admin/ui/side_panels.py +7 -4
  92. wagtail/admin/urls/__init__.py +6 -0
  93. wagtail/admin/urls/pages.py +1 -1
  94. wagtail/admin/userbar.py +21 -1
  95. wagtail/admin/views/account.py +5 -0
  96. wagtail/admin/views/chooser.py +5 -1
  97. wagtail/admin/views/collections.py +0 -2
  98. wagtail/admin/views/generic/base.py +20 -10
  99. wagtail/admin/views/generic/history.py +0 -1
  100. wagtail/admin/views/generic/models.py +79 -21
  101. wagtail/admin/views/generic/preview.py +50 -1
  102. wagtail/admin/views/mixins.py +4 -2
  103. wagtail/admin/views/pages/bulk_actions/delete.py +11 -23
  104. wagtail/admin/views/pages/bulk_actions/page_bulk_action.py +17 -0
  105. wagtail/admin/views/pages/bulk_actions/publish.py +11 -31
  106. wagtail/admin/views/pages/bulk_actions/unpublish.py +11 -31
  107. wagtail/admin/views/pages/create.py +1 -0
  108. wagtail/admin/views/pages/edit.py +38 -30
  109. wagtail/admin/views/pages/revisions.py +43 -114
  110. wagtail/admin/views/pages/utils.py +0 -1
  111. wagtail/admin/views/tags.py +6 -2
  112. wagtail/admin/views/workflows.py +8 -6
  113. wagtail/admin/viewsets/model.py +0 -4
  114. wagtail/admin/viewsets/pages.py +0 -1
  115. wagtail/admin/widgets/tags.py +1 -0
  116. wagtail/api/v2/tests/test_documents.py +4 -2
  117. wagtail/api/v2/tests/test_images.py +4 -2
  118. wagtail/api/v2/tests/test_pages.py +8 -4
  119. wagtail/blocks/base.py +59 -1
  120. wagtail/blocks/field_block.py +6 -0
  121. wagtail/blocks/list_block.py +4 -0
  122. wagtail/blocks/static_block.py +3 -0
  123. wagtail/blocks/stream_block.py +5 -1
  124. wagtail/blocks/struct_block.py +6 -0
  125. wagtail/compat.py +16 -0
  126. wagtail/contrib/forms/forms.py +27 -7
  127. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +2 -2
  128. wagtail/contrib/forms/locale/gl/LC_MESSAGES/django.mo +0 -0
  129. wagtail/contrib/forms/locale/gl/LC_MESSAGES/django.po +4 -4
  130. wagtail/contrib/forms/tests/test_models.py +7 -5
  131. wagtail/contrib/forms/tests/test_views.py +75 -0
  132. wagtail/contrib/frontend_cache/backends/cloudfront.py +1 -1
  133. wagtail/contrib/frontend_cache/tasks.py +83 -0
  134. wagtail/contrib/frontend_cache/tests.py +48 -33
  135. wagtail/contrib/frontend_cache/utils.py +2 -70
  136. wagtail/contrib/redirects/base_formats.py +2 -2
  137. wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.mo +0 -0
  138. wagtail/contrib/redirects/locale/ar/LC_MESSAGES/django.po +3 -0
  139. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +24 -37
  140. wagtail/contrib/redirects/templates/wagtailredirects/add.html +1 -24
  141. wagtail/contrib/redirects/templates/wagtailredirects/confirm_delete.html +3 -13
  142. wagtail/contrib/redirects/tests/test_redirects.py +122 -110
  143. wagtail/contrib/redirects/tests/test_signal_handlers.py +75 -69
  144. wagtail/contrib/redirects/urls.py +2 -2
  145. wagtail/contrib/redirects/views.py +35 -73
  146. wagtail/contrib/search_promotions/admin_urls.py +10 -3
  147. wagtail/contrib/search_promotions/forms.py +55 -26
  148. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +44 -54
  149. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/add.html +21 -31
  150. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/confirm_delete.html +3 -12
  151. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/edit.html +11 -34
  152. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/includes/searchpromotion_form.html +1 -0
  153. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/includes/searchpromotions_formset.js +2 -1
  154. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index.html +0 -1
  155. wagtail/contrib/search_promotions/tests.py +814 -13
  156. wagtail/contrib/search_promotions/views/__init__.py +1 -0
  157. wagtail/contrib/search_promotions/views/reports.py +56 -0
  158. wagtail/contrib/search_promotions/views/settings.py +258 -0
  159. wagtail/contrib/search_promotions/wagtail_hooks.py +12 -1
  160. wagtail/contrib/settings/locale/ar/LC_MESSAGES/django.mo +0 -0
  161. wagtail/contrib/settings/locale/ar/LC_MESSAGES/django.po +6 -1
  162. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +3 -3
  163. wagtail/contrib/settings/templates/wagtailsettings/edit.html +1 -5
  164. wagtail/contrib/settings/tests/generic/test_admin.py +2 -5
  165. wagtail/contrib/settings/tests/generic/test_register.py +1 -1
  166. wagtail/contrib/settings/tests/site_specific/test_admin.py +2 -5
  167. wagtail/contrib/settings/tests/site_specific/test_register.py +1 -1
  168. wagtail/contrib/settings/views.py +9 -23
  169. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  170. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +1 -1
  171. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  172. wagtail/contrib/table_block/tests.py +4 -1
  173. wagtail/contrib/typed_table_block/blocks.py +3 -0
  174. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  175. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  176. wagtail/contrib/typed_table_block/tests.py +33 -0
  177. wagtail/documents/locale/en/LC_MESSAGES/django.po +26 -26
  178. wagtail/documents/migrations/0011_add_choose_permissions.py +1 -0
  179. wagtail/documents/models.py +1 -0
  180. wagtail/documents/signal_handlers.py +6 -2
  181. wagtail/documents/static/wagtaildocs/js/add-multiple.js +1 -1
  182. wagtail/documents/templates/wagtaildocs/documents/edit.html +1 -3
  183. wagtail/documents/templates/wagtaildocs/multiple/add.html +7 -1
  184. wagtail/documents/tests/test_admin_views.py +74 -33
  185. wagtail/documents/tests/test_views.py +21 -12
  186. wagtail/documents/views/chooser.py +1 -0
  187. wagtail/documents/views/documents.py +1 -2
  188. wagtail/documents/views/multiple.py +0 -1
  189. wagtail/documents/views/serve.py +9 -2
  190. wagtail/documents/wagtail_hooks.py +6 -1
  191. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  192. wagtail/embeds/oembed_providers.py +0 -64
  193. wagtail/fields.py +3 -0
  194. wagtail/images/apps.py +2 -1
  195. wagtail/images/blocks.py +14 -2
  196. wagtail/images/forms.py +40 -3
  197. wagtail/images/locale/ar/LC_MESSAGES/django.mo +0 -0
  198. wagtail/images/locale/ar/LC_MESSAGES/django.po +4 -0
  199. wagtail/images/locale/en/LC_MESSAGES/django.po +49 -49
  200. wagtail/images/migrations/0023_add_choose_permissions.py +1 -0
  201. wagtail/images/rich_text/contentstate.py +1 -0
  202. wagtail/images/rich_text/editor_html.py +1 -0
  203. wagtail/images/signal_handlers.py +17 -10
  204. wagtail/images/static/wagtailimages/js/add-multiple.js +1 -1
  205. wagtail/images/static/wagtailimages/js/image-block.js +1 -1
  206. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  207. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  208. wagtail/images/static/wagtailimages/js/image-url-generator.js +1 -1
  209. wagtail/images/static/wagtailimages/js/vendor/jquery.fileupload-image.js +1 -1
  210. wagtail/images/tasks.py +18 -0
  211. wagtail/images/templates/wagtailimages/images/edit.html +1 -3
  212. wagtail/images/templates/wagtailimages/images/url_generator.html +1 -1
  213. wagtail/images/templates/wagtailimages/multiple/add.html +7 -2
  214. wagtail/images/templates/wagtailimages/widgets/image_chooser.html +1 -1
  215. wagtail/images/tests/test_admin_views.py +53 -29
  216. wagtail/images/tests/test_blocks.py +34 -2
  217. wagtail/images/tests/test_models.py +12 -10
  218. wagtail/images/tests/tests.py +10 -0
  219. wagtail/images/views/chooser.py +1 -0
  220. wagtail/images/views/images.py +1 -3
  221. wagtail/images/views/multiple.py +0 -1
  222. wagtail/images/views/serve.py +18 -2
  223. wagtail/images/widgets.py +3 -0
  224. wagtail/locale/en/LC_MESSAGES/django.po +228 -216
  225. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  226. wagtail/management/commands/publish_scheduled.py +1 -1
  227. wagtail/migrations/0087_alter_grouppagepermission_unique_together_and_more.py +16 -8
  228. wagtail/models/__init__.py +300 -119
  229. wagtail/models/i18n.py +2 -2
  230. wagtail/models/panels.py +37 -0
  231. wagtail/models/sites.py +7 -6
  232. wagtail/permission_policies/pages.py +2 -2
  233. wagtail/project_template/project_name/settings/base.py +4 -0
  234. wagtail/project_template/requirements.txt +1 -1
  235. wagtail/query.py +145 -0
  236. wagtail/search/backends/database/mysql/mysql.py +25 -17
  237. wagtail/search/backends/database/postgres/postgres.py +44 -83
  238. wagtail/search/backends/database/sqlite/sqlite.py +25 -17
  239. wagtail/search/backends/elasticsearch7.py +4 -0
  240. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  241. wagtail/search/query.py +8 -2
  242. wagtail/search/signal_handlers.py +6 -9
  243. wagtail/search/tasks.py +10 -0
  244. wagtail/search/tests/test_elasticsearch7_backend.py +21 -0
  245. wagtail/search/tests/test_index_functions.py +10 -6
  246. wagtail/search/tests/test_postgres_backend.py +0 -14
  247. wagtail/signal_handlers.py +5 -20
  248. wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
  249. wagtail/snippets/locale/en/LC_MESSAGES/django.po +3 -13
  250. wagtail/snippets/locale/sv/LC_MESSAGES/django.mo +0 -0
  251. wagtail/snippets/locale/sv/LC_MESSAGES/django.po +4 -3
  252. wagtail/snippets/tests/test_preview.py +5 -0
  253. wagtail/snippets/tests/test_snippets.py +100 -45
  254. wagtail/snippets/tests/test_usage.py +29 -24
  255. wagtail/snippets/tests/test_viewset.py +1 -1
  256. wagtail/snippets/views/snippets.py +0 -12
  257. wagtail/tasks.py +41 -0
  258. wagtail/templates/wagtailcore/shared/block_preview.html +29 -0
  259. wagtail/test/earlypage/__init__.py +0 -0
  260. wagtail/test/earlypage/migrations/0001_initial.py +37 -0
  261. wagtail/test/earlypage/migrations/__init__.py +0 -0
  262. wagtail/test/earlypage/models.py +14 -0
  263. wagtail/test/settings.py +3 -0
  264. wagtail/test/testapp/fixtures/test.json +7 -0
  265. wagtail/test/testapp/fixtures/test_specific.json +6 -3
  266. wagtail/test/testapp/models.py +58 -44
  267. wagtail/test/testapp/templates/tests/custom_block_preview.html +16 -0
  268. wagtail/test/testapp/templates/tests/static_block_preview.html +5 -0
  269. wagtail/test/testapp/wagtail_hooks.py +9 -0
  270. wagtail/tests/test_blocks.py +189 -2
  271. wagtail/tests/test_hooks.py +166 -1
  272. wagtail/tests/test_management_commands.py +54 -13
  273. wagtail/tests/test_page_allowed_http_methods.py +32 -0
  274. wagtail/tests/test_page_model.py +68 -0
  275. wagtail/tests/test_page_privacy.py +10 -0
  276. wagtail/tests/test_page_queryset.py +79 -0
  277. wagtail/tests/test_reference_index.py +84 -75
  278. wagtail/tests/test_streamfield.py +30 -0
  279. wagtail/tests/test_utils.py +61 -0
  280. wagtail/users/forms.py +2 -9
  281. wagtail/users/locale/en/LC_MESSAGES/django.po +17 -17
  282. wagtail/users/locale/nl/LC_MESSAGES/django.mo +0 -0
  283. wagtail/users/locale/nl/LC_MESSAGES/django.po +4 -3
  284. wagtail/users/templates/wagtailusers/groups/create.html +0 -5
  285. wagtail/users/templates/wagtailusers/groups/includes/page_permissions_form.html +1 -1
  286. wagtail/users/templates/wagtailusers/groups/includes/page_permissions_formset.html +6 -6
  287. wagtail/users/tests/test_admin_views.py +96 -4
  288. wagtail/users/tests/test_utils.py +76 -0
  289. wagtail/users/utils.py +43 -11
  290. wagtail/utils/setup.py +2 -2
  291. wagtail/utils/templates.py +26 -0
  292. wagtail/utils/widgets.py +1 -0
  293. wagtail/views.py +9 -1
  294. wagtail/wagtail_hooks.py +67 -29
  295. {wagtail-6.3.1.dist-info → wagtail-6.4rc1.dist-info}/METADATA +2 -2
  296. {wagtail-6.3.1.dist-info → wagtail-6.4rc1.dist-info}/RECORD +300 -287
  297. wagtail/admin/static/wagtailadmin/js/expanding-formset.js +0 -1
  298. wagtail/admin/static/wagtailadmin/js/vendor/rangy-core.js +0 -1
  299. wagtail/admin/static/wagtailadmin/js/vendor/uuidv4.min.js +0 -1
  300. wagtail/contrib/search_promotions/views.py +0 -323
  301. wagtail/images/static/wagtailimages/js/vendor/canvas-to-blob.min.js +0 -1
  302. wagtail/users/static/wagtailusers/js/group-form.js +0 -1
  303. wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -3
  304. {wagtail-6.3.1.dist-info → wagtail-6.4rc1.dist-info}/LICENSE +0 -0
  305. {wagtail-6.3.1.dist-info → wagtail-6.4rc1.dist-info}/WHEEL +0 -0
  306. {wagtail-6.3.1.dist-info → wagtail-6.4rc1.dist-info}/entry_points.txt +0 -0
  307. {wagtail-6.3.1.dist-info → wagtail-6.4rc1.dist-info}/top_level.txt +0 -0
@@ -162,7 +162,6 @@ class CreateView(generic.CreateView):
162
162
  error_message = gettext_lazy("The document could not be created due to errors.")
163
163
  template_name = "wagtaildocs/documents/add.html"
164
164
  header_icon = "doc-full-inverse"
165
- _show_breadcrumbs = True
166
165
 
167
166
  @cached_property
168
167
  def model(self):
@@ -197,7 +196,6 @@ class EditView(generic.EditView):
197
196
  delete_url_name = "wagtaildocs:delete"
198
197
  header_icon = "doc-full-inverse"
199
198
  context_object_name = "document"
200
- _show_breadcrumbs = True
201
199
 
202
200
  @cached_property
203
201
  def model(self):
@@ -253,6 +251,7 @@ class EditView(generic.EditView):
253
251
 
254
252
  def get_context_data(self, **kwargs):
255
253
  context = super().get_context_data(**kwargs)
254
+ context["usage_count_val"] = self.object.get_usage().count()
256
255
  context["filesize"] = self.object.get_file_size()
257
256
  context["next"] = self.next_url
258
257
  return context
@@ -25,7 +25,6 @@ class AddView(WagtailAdminTemplateMixin, BaseAddView):
25
25
  template_name = "wagtaildocs/multiple/add.html"
26
26
  header_icon = "doc-full-inverse"
27
27
  page_title = gettext_lazy("Add documents")
28
- _show_breadcrumbs = True
29
28
 
30
29
  index_url_name = "wagtaildocs:index"
31
30
  edit_object_url_name = "wagtaildocs:edit_multiple"
@@ -90,7 +90,7 @@ def serve(request, document_id, document_filename):
90
90
  # Fallback to streaming backend if user hasn't specified SENDFILE_BACKEND
91
91
  sendfile_opts["backend"] = sendfile_streaming_backend.sendfile
92
92
 
93
- return sendfile(request, local_path, **sendfile_opts)
93
+ response = sendfile(request, local_path, **sendfile_opts)
94
94
 
95
95
  else:
96
96
  # We are using a storage backend which does not expose filesystem paths
@@ -107,7 +107,14 @@ def serve(request, document_id, document_filename):
107
107
  # FIXME: storage backends are not guaranteed to implement 'size'
108
108
  response["Content-Length"] = doc.file.size
109
109
 
110
- return response
110
+ # Add a CSP header to prevent inline execution
111
+ if getattr(settings, "WAGTAILDOCS_BLOCK_EMBEDDED_CONTENT", True):
112
+ response["Content-Security-Policy"] = "default-src 'none'"
113
+
114
+ # Prevent browsers from auto-detecting the content-type of a document
115
+ response["X-Content-Type-Options"] = "nosniff"
116
+
117
+ return response
111
118
 
112
119
 
113
120
  def authenticate_with_password(request, restriction_id):
@@ -3,6 +3,7 @@ from warnings import warn
3
3
  from django.conf import settings
4
4
  from django.template.response import TemplateResponse
5
5
  from django.urls import include, path, reverse, reverse_lazy
6
+ from django.utils.cache import add_never_cache_headers
6
7
  from django.utils.translation import gettext, ngettext
7
8
  from django.utils.translation import gettext_lazy as _
8
9
 
@@ -200,7 +201,11 @@ def check_view_restrictions(document, request):
200
201
  )
201
202
 
202
203
  context = {"form": form, "action_url": action_url}
203
- return TemplateResponse(request, password_required_template, context)
204
+ response = TemplateResponse(
205
+ request, password_required_template, context
206
+ )
207
+ add_never_cache_headers(response)
208
+ return response
204
209
 
205
210
  elif restriction.restriction_type in [
206
211
  BaseViewRestriction.LOGIN,
@@ -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-10-21 17:53+0100\n"
11
+ "POT-Creation-Date: 2025-01-20 17:59+0000\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"
@@ -5,14 +5,6 @@ animoto = {
5
5
  ],
6
6
  }
7
7
 
8
- app_net = {
9
- "endpoint": "https://alpha-api.app.net/oembed",
10
- "urls": [
11
- r"^https?://alpha\.app\.net/[^#?/]+/post/.+$",
12
- r"^https?://photos\.app\.net/[^#?/]+/.+$",
13
- ],
14
- }
15
-
16
8
  audioboom = {
17
9
  "endpoint": "https://audioboom.com/publishing/oembed.{format}",
18
10
  "urls": [
@@ -21,22 +13,6 @@ audioboom = {
21
13
  ],
22
14
  }
23
15
 
24
- bambuser = {
25
- "endpoint": "http://api.bambuser.com/oembed.{format}",
26
- "urls": [
27
- r"^http://bambuser\.com/channel/[^#?/]+/broadcast/.+$",
28
- r"^http://bambuser\.com/channel/.+$",
29
- r"^http://bambuser\.com/v/.+$",
30
- ],
31
- }
32
-
33
- blip_tv = {
34
- "endpoint": "http://blip.tv/oembed/",
35
- "urls": [
36
- r"^http://[-\w]+\.blip\.tv/.+$",
37
- ],
38
- }
39
-
40
16
  cacoo = {
41
17
  "endpoint": "http://cacoo.com/oembed.{format}",
42
18
  "urls": [
@@ -392,24 +368,6 @@ pinterest = {
392
368
  }
393
369
 
394
370
 
395
- qik = {
396
- "endpoint": "http://qik.com/api/oembed.{format}",
397
- "urls": [
398
- r"^http://qik\.com/.+$",
399
- r"^http://qik\.ly/.+$",
400
- ],
401
- }
402
-
403
-
404
- rdio = {
405
- "endpoint": "http://www.rdio.com/api/oembed",
406
- "urls": [
407
- r"^http://(?:wwww\.)?rdio\.com/people/[^#?/]+/playlists/.+$",
408
- r"^http://[-\w]+\.rdio\.com/artist/[^#?/]+/album/.+$",
409
- ],
410
- }
411
-
412
-
413
371
  reddit = {
414
372
  "endpoint": "https://www.reddit.com/oembed",
415
373
  "urls": [
@@ -418,13 +376,6 @@ reddit = {
418
376
  }
419
377
 
420
378
 
421
- revision3 = {
422
- "endpoint": "http://revision3.com/api/oembed/",
423
- "urls": [
424
- r"^http://[-\w]+\.revision3\.com/.+$",
425
- ],
426
- }
427
-
428
379
  roomshare = {
429
380
  "endpoint": "https://roomshare.jp/oembed.{format}",
430
381
  "urls": [
@@ -574,14 +525,6 @@ ustream = {
574
525
  }
575
526
 
576
527
 
577
- vhx_tv = {
578
- "endpoint": "http://vhx.tv/services/oembed.{format}",
579
- "urls": [
580
- r"^https?://(?:www\.)?vhx\.tv/.+$",
581
- ],
582
- }
583
-
584
-
585
528
  videojug = {
586
529
  "endpoint": "http://www.videojug.com/oembed.{format}",
587
530
  "urls": [
@@ -680,10 +623,7 @@ youtube = {
680
623
 
681
624
  all_providers = [
682
625
  animoto,
683
- app_net,
684
626
  audioboom,
685
- bambuser,
686
- blip_tv,
687
627
  cacoo,
688
628
  chirb,
689
629
  circuitlab,
@@ -728,10 +668,7 @@ all_providers = [
728
668
  opera,
729
669
  photobucket,
730
670
  pinterest,
731
- qik,
732
- rdio,
733
671
  reddit,
734
- revision3,
735
672
  roomshare,
736
673
  sapo,
737
674
  screenr,
@@ -751,7 +688,6 @@ all_providers = [
751
688
  twitter,
752
689
  urtak,
753
690
  ustream,
754
- vhx_tv,
755
691
  viddler,
756
692
  videojug,
757
693
  vidyard,
wagtail/fields.py CHANGED
@@ -239,6 +239,9 @@ class StreamField(models.Field):
239
239
  defaults.update(kwargs)
240
240
  return super().formfield(**defaults)
241
241
 
242
+ def get_default(self):
243
+ return self.stream_block.normalize(super().get_default())
244
+
242
245
  def value_to_string(self, obj):
243
246
  # This method is used for serialization using django.core.serializers,
244
247
  # which is used by dumpdata and loaddata for serializing model objects.
wagtail/images/apps.py CHANGED
@@ -3,7 +3,6 @@ from django.db.models import ForeignKey
3
3
  from django.utils.translation import gettext_lazy as _
4
4
 
5
5
  from . import checks, get_image_model # NOQA: F401
6
- from .signal_handlers import register_signal_handlers
7
6
 
8
7
 
9
8
  class WagtailImagesAppConfig(AppConfig):
@@ -14,6 +13,8 @@ class WagtailImagesAppConfig(AppConfig):
14
13
  default_attrs = {}
15
14
 
16
15
  def ready(self):
16
+ from .signal_handlers import register_signal_handlers
17
+
17
18
  register_signal_handlers()
18
19
 
19
20
  # Set up model forms to use AdminImageChooser for any ForeignKey to the image model
wagtail/images/blocks.py CHANGED
@@ -140,7 +140,11 @@ class ImageBlock(StructBlock):
140
140
  # For backward compatibility with ImageChooserBlock
141
141
  if value is None or isinstance(value, int):
142
142
  image = self.child_blocks["image"].to_python(value)
143
- struct_value = {"image": image, "decorative": False, "alt_text": None}
143
+ struct_value = {
144
+ "image": image,
145
+ "decorative": False,
146
+ "alt_text": (image.default_alt_text if image else ""),
147
+ }
144
148
  else:
145
149
  struct_value = super().to_python(value)
146
150
  return self._struct_value_to_image(struct_value)
@@ -157,7 +161,7 @@ class ImageBlock(StructBlock):
157
161
  {
158
162
  "image": image,
159
163
  "decorative": False,
160
- "alt_text": None,
164
+ "alt_text": (image.default_alt_text if image else ""),
161
165
  }
162
166
  for image in image_values
163
167
  ]
@@ -242,6 +246,14 @@ class ImageBlock(StructBlock):
242
246
  def render_basic(self, value, context=None):
243
247
  return self.child_blocks["image"].render_basic(value, context=context)
244
248
 
249
+ def get_block_by_content_path(self, value, path_elements):
250
+ if path_elements:
251
+ return super().get_block_by_content_path(
252
+ self._image_to_struct_value(value), path_elements
253
+ )
254
+ else:
255
+ return self.bind(value)
256
+
245
257
  class Meta:
246
258
  icon = "image"
247
259
  template = "wagtailimages/widgets/image.html"
wagtail/images/forms.py CHANGED
@@ -1,3 +1,5 @@
1
+ import json
2
+
1
3
  from django import forms
2
4
  from django.conf import settings
3
5
  from django.forms.models import modelform_factory
@@ -190,9 +192,44 @@ class URLGeneratorForm(forms.Form):
190
192
  ("fill", _("Resize to fill")),
191
193
  ),
192
194
  )
193
- width = forms.IntegerField(label=_("Width"), min_value=0)
194
- height = forms.IntegerField(label=_("Height"), min_value=0)
195
- closeness = forms.IntegerField(label=_("Closeness"), min_value=0, initial=0)
195
+ width = forms.IntegerField(
196
+ label=_("Width"),
197
+ min_value=0,
198
+ widget=forms.NumberInput(
199
+ attrs={
200
+ "disabled": True,
201
+ "data-w-rules-target": "enable",
202
+ "data-w-rules": json.dumps(
203
+ {"filter_method": ["width", "max", "min", "fill"]}
204
+ ),
205
+ },
206
+ ),
207
+ )
208
+ height = forms.IntegerField(
209
+ label=_("Height"),
210
+ min_value=0,
211
+ widget=forms.NumberInput(
212
+ attrs={
213
+ "disabled": True,
214
+ "data-w-rules-target": "enable",
215
+ "data-w-rules": json.dumps(
216
+ {"filter_method": ["height", "max", "min", "fill"]}
217
+ ),
218
+ }
219
+ ),
220
+ )
221
+ closeness = forms.IntegerField(
222
+ label=_("Closeness"),
223
+ min_value=0,
224
+ initial=0,
225
+ widget=forms.NumberInput(
226
+ attrs={
227
+ "disabled": True,
228
+ "data-w-rules-target": "enable",
229
+ "data-w-rules": json.dumps({"filter_method": ["fill"]}),
230
+ }
231
+ ),
232
+ )
196
233
 
197
234
 
198
235
  GroupImagePermissionFormSet = collection_member_permission_formset_factory(
@@ -177,6 +177,10 @@ msgstr "جديد"
177
177
  msgid "Latest images"
178
178
  msgstr "احد الصور"
179
179
 
180
+ #, python-format
181
+ msgid "Select %(title)s"
182
+ msgstr "إختر %(title)s"
183
+
180
184
  msgid "Choose a format"
181
185
  msgstr "اختر شكلا"
182
186
 
@@ -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-10-21 17:53+0100\n"
11
+ "POT-Creation-Date: 2025-01-20 17:59+0000\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"
@@ -18,19 +18,19 @@ msgstr ""
18
18
  "Content-Transfer-Encoding: 8bit\n"
19
19
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
20
20
 
21
- #: apps.py:12
21
+ #: apps.py:11
22
22
  msgid "Wagtail images"
23
23
  msgstr ""
24
24
 
25
- #: blocks.py:72 blocks.py:83 forms.py:160
25
+ #: blocks.py:72 blocks.py:83 forms.py:162
26
26
  msgid "Image is decorative"
27
27
  msgstr ""
28
28
 
29
- #: blocks.py:74 blocks.py:86 forms.py:162
29
+ #: blocks.py:74 blocks.py:86 forms.py:164
30
30
  msgid "Alt text"
31
31
  msgstr ""
32
32
 
33
- #: blocks.py:194 forms.py:175
33
+ #: blocks.py:196 forms.py:177
34
34
  msgid "Please add some alt text for your image or mark it as decorative"
35
35
  msgstr ""
36
36
 
@@ -88,75 +88,75 @@ msgstr ""
88
88
  msgid "Right-aligned"
89
89
  msgstr ""
90
90
 
91
- #: forms.py:29 views/bulk_actions/add_to_collection.py:13
91
+ #: forms.py:31 views/bulk_actions/add_to_collection.py:13
92
92
  msgid "Collection"
93
93
  msgstr ""
94
94
 
95
- #: forms.py:155
95
+ #: forms.py:157
96
96
  msgid "Format"
97
97
  msgstr ""
98
98
 
99
- #: forms.py:183
99
+ #: forms.py:185
100
100
  msgid "Filter"
101
101
  msgstr ""
102
102
 
103
- #: forms.py:185
103
+ #: forms.py:187
104
104
  msgid "Original size"
105
105
  msgstr ""
106
106
 
107
- #: forms.py:186
107
+ #: forms.py:188
108
108
  msgid "Resize to width"
109
109
  msgstr ""
110
110
 
111
- #: forms.py:187
111
+ #: forms.py:189
112
112
  msgid "Resize to height"
113
113
  msgstr ""
114
114
 
115
- #: forms.py:188
115
+ #: forms.py:190
116
116
  msgid "Resize to min"
117
117
  msgstr ""
118
118
 
119
- #: forms.py:189
119
+ #: forms.py:191
120
120
  msgid "Resize to max"
121
121
  msgstr ""
122
122
 
123
- #: forms.py:190
123
+ #: forms.py:192
124
124
  msgid "Resize to fill"
125
125
  msgstr ""
126
126
 
127
- #: forms.py:193
127
+ #: forms.py:196
128
128
  msgid "Width"
129
129
  msgstr ""
130
130
 
131
- #: forms.py:194
131
+ #: forms.py:209
132
132
  msgid "Height"
133
133
  msgstr ""
134
134
 
135
- #: forms.py:195
135
+ #: forms.py:222
136
136
  msgid "Closeness"
137
137
  msgstr ""
138
138
 
139
- #: forms.py:201
139
+ #: forms.py:238
140
140
  msgid "Add"
141
141
  msgstr ""
142
142
 
143
- #: forms.py:201
143
+ #: forms.py:238
144
144
  msgid "Add/edit images you own"
145
145
  msgstr ""
146
146
 
147
- #: forms.py:202
147
+ #: forms.py:239
148
148
  msgid "Edit"
149
149
  msgstr ""
150
150
 
151
- #: forms.py:202
151
+ #: forms.py:239
152
152
  msgid "Edit any image"
153
153
  msgstr ""
154
154
 
155
- #: forms.py:203
155
+ #: forms.py:240
156
156
  msgid "Choose"
157
157
  msgstr ""
158
158
 
159
- #: forms.py:203
159
+ #: forms.py:240
160
160
  msgid "Select images in choosers"
161
161
  msgstr ""
162
162
 
@@ -270,14 +270,14 @@ msgid "Delete images"
270
270
  msgstr ""
271
271
 
272
272
  #: templates/wagtailimages/bulk_actions/confirm_bulk_delete.html:17
273
- #: views/images.py:330
273
+ #: views/images.py:329
274
274
  msgid "Are you sure you want to delete this image?"
275
275
  msgid_plural "Are you sure you want to delete these images?"
276
276
  msgstr[0] ""
277
277
  msgstr[1] ""
278
278
 
279
279
  #: templates/wagtailimages/bulk_actions/confirm_bulk_delete.html:28
280
- #: templates/wagtailimages/images/edit.html:67
280
+ #: templates/wagtailimages/images/edit.html:66
281
281
  #, python-format
282
282
  msgid "Used %(usage_count)s time"
283
283
  msgid_plural "Used %(usage_count)s times"
@@ -374,13 +374,13 @@ msgstr ""
374
374
  msgid "Add an image"
375
375
  msgstr ""
376
376
 
377
- #: templates/wagtailimages/images/add.html:45 views/chooser.py:52
378
- #: views/chooser.py:319
377
+ #: templates/wagtailimages/images/add.html:45 views/chooser.py:53
378
+ #: views/chooser.py:320
379
379
  msgid "Uploading…"
380
380
  msgstr ""
381
381
 
382
- #: templates/wagtailimages/images/add.html:48 views/chooser.py:51
383
- #: views/chooser.py:318
382
+ #: templates/wagtailimages/images/add.html:48 views/chooser.py:52
383
+ #: views/chooser.py:319
384
384
  msgid "Upload"
385
385
  msgstr ""
386
386
 
@@ -494,52 +494,52 @@ msgstr ""
494
494
  msgid "Add multiple images"
495
495
  msgstr ""
496
496
 
497
- #: templates/wagtailimages/multiple/add.html:14
497
+ #: templates/wagtailimages/multiple/add.html:20
498
498
  msgid "Drag and drop images into this area to upload immediately."
499
499
  msgstr ""
500
500
 
501
- #: templates/wagtailimages/multiple/add.html:19
501
+ #: templates/wagtailimages/multiple/add.html:25
502
502
  msgid "Or choose from your computer"
503
503
  msgstr ""
504
504
 
505
- #: templates/wagtailimages/multiple/add.html:34
505
+ #: templates/wagtailimages/multiple/add.html:40
506
506
  msgid "Add to collection:"
507
507
  msgstr ""
508
508
 
509
- #: templates/wagtailimages/multiple/add.html:67
509
+ #: templates/wagtailimages/multiple/add.html:73
510
510
  msgid ""
511
511
  "Please provide an image description to comply with best practices for "
512
512
  "accessibility."
513
513
  msgstr ""
514
514
 
515
- #: templates/wagtailimages/multiple/add.html:68
515
+ #: templates/wagtailimages/multiple/add.html:74
516
516
  msgid ""
517
517
  "Upload successful. Please update this image with a more appropriate title, "
518
518
  "if necessary. You may also delete the image completely if the upload wasn't "
519
519
  "required."
520
520
  msgstr ""
521
521
 
522
- #: templates/wagtailimages/multiple/add.html:70
522
+ #: templates/wagtailimages/multiple/add.html:76
523
523
  msgid ""
524
524
  "Upload successful. However, your new image seems to be a duplicate of this "
525
525
  "existing image. You may delete it if it wasn't required."
526
526
  msgstr ""
527
527
 
528
- #: templates/wagtailimages/multiple/add.html:72
528
+ #: templates/wagtailimages/multiple/add.html:78
529
529
  msgid "Sorry, upload failed."
530
530
  msgstr ""
531
531
 
532
- #: templates/wagtailimages/multiple/add.html:74
532
+ #: templates/wagtailimages/multiple/add.html:80
533
533
  msgid "Server Error"
534
534
  msgstr ""
535
535
 
536
- #: templates/wagtailimages/multiple/add.html:75
536
+ #: templates/wagtailimages/multiple/add.html:81
537
537
  msgid ""
538
538
  "Report this error to your website administrator with the following "
539
539
  "information:"
540
540
  msgstr ""
541
541
 
542
- #: templates/wagtailimages/multiple/add.html:78
542
+ #: templates/wagtailimages/multiple/add.html:84
543
543
  msgid "Image updated."
544
544
  msgstr ""
545
545
 
@@ -585,7 +585,7 @@ msgid_plural "%(num_parent_objects)d images have been added to %(collection)s"
585
585
  msgstr[0] ""
586
586
  msgstr[1] ""
587
587
 
588
- #: views/bulk_actions/delete.py:8 views/images.py:181
588
+ #: views/bulk_actions/delete.py:8 views/images.py:180
589
589
  msgid "Delete"
590
590
  msgstr ""
591
591
 
@@ -600,15 +600,15 @@ msgid_plural "%(num_parent_objects)d images have been deleted"
600
600
  msgstr[0] ""
601
601
  msgstr[1] ""
602
602
 
603
- #: views/chooser.py:317 widgets.py:13
603
+ #: views/chooser.py:318 widgets.py:13
604
604
  msgid "Choose an image"
605
605
  msgstr ""
606
606
 
607
- #: views/chooser.py:320
607
+ #: views/chooser.py:321
608
608
  msgid "Choose another image"
609
609
  msgstr ""
610
610
 
611
- #: views/chooser.py:321 widgets.py:15
611
+ #: views/chooser.py:322 widgets.py:15
612
612
  msgid "Edit this image"
613
613
  msgstr ""
614
614
 
@@ -644,12 +644,12 @@ msgstr ""
644
644
  msgid "The image could not be saved due to errors."
645
645
  msgstr ""
646
646
 
647
- #: views/images.py:160
647
+ #: views/images.py:159
648
648
  #, python-format
649
649
  msgid "Image '%(image_title)s' updated."
650
650
  msgstr ""
651
651
 
652
- #: views/images.py:178
652
+ #: views/images.py:177
653
653
  msgid ""
654
654
  "The source image file could not be found. Please change the source or delete "
655
655
  "the image."
@@ -659,20 +659,20 @@ msgstr ""
659
659
  msgid "Generate URL"
660
660
  msgstr ""
661
661
 
662
- #: views/images.py:318
662
+ #: views/images.py:317
663
663
  msgid "Delete image"
664
664
  msgstr ""
665
665
 
666
- #: views/images.py:336
666
+ #: views/images.py:335
667
667
  #, python-format
668
668
  msgid "Image '%(image_title)s' deleted."
669
669
  msgstr ""
670
670
 
671
- #: views/images.py:346
671
+ #: views/images.py:345
672
672
  msgid "The image could not be created due to errors."
673
673
  msgstr ""
674
674
 
675
- #: views/images.py:367
675
+ #: views/images.py:365
676
676
  #, python-format
677
677
  msgid "Image '%(image_title)s' added."
678
678
  msgstr ""
@@ -80,6 +80,7 @@ class Migration(migrations.Migration):
80
80
 
81
81
  dependencies = [
82
82
  ("wagtailimages", "0022_uploadedimage"),
83
+ ("wagtailadmin", "0001_create_admin_access_permissions"),
83
84
  ]
84
85
 
85
86
  operations = [
@@ -1,6 +1,7 @@
1
1
  """
2
2
  Draftail / contentstate conversion
3
3
  """
4
+
4
5
  from draftjs_exporter.dom import DOM
5
6
 
6
7
  from wagtail.admin.rich_text.converters.contentstate_models import Entity
@@ -1,6 +1,7 @@
1
1
  """
2
2
  editor-html conversion for contenteditable editors
3
3
  """
4
+
4
5
  from wagtail.admin.rich_text.converters import editor_html
5
6
  from wagtail.images import get_image_model
6
7
  from wagtail.images.formats import get_image_format