wagtail 6.0.1__py3-none-any.whl → 6.1rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (512) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/admin/checks.py +51 -0
  3. wagtail/admin/compare.py +1 -1
  4. wagtail/admin/filters.py +70 -1
  5. wagtail/admin/forms/account.py +1 -1
  6. wagtail/admin/forms/collections.py +15 -0
  7. wagtail/admin/forms/pages.py +49 -0
  8. wagtail/admin/locale/ca/LC_MESSAGES/django.mo +0 -0
  9. wagtail/admin/locale/ca/LC_MESSAGES/django.po +122 -0
  10. wagtail/admin/locale/de/LC_MESSAGES/django.mo +0 -0
  11. wagtail/admin/locale/de/LC_MESSAGES/django.po +5 -5
  12. wagtail/admin/locale/en/LC_MESSAGES/django.po +474 -385
  13. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +3 -3
  14. wagtail/admin/locale/es/LC_MESSAGES/django.mo +0 -0
  15. wagtail/admin/locale/es/LC_MESSAGES/django.po +6 -6
  16. wagtail/admin/locale/fr/LC_MESSAGES/django.mo +0 -0
  17. wagtail/admin/locale/fr/LC_MESSAGES/django.po +70 -3
  18. wagtail/admin/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  19. wagtail/admin/locale/he_IL/LC_MESSAGES/django.po +2 -6
  20. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.mo +0 -0
  21. wagtail/admin/locale/he_IL/LC_MESSAGES/djangojs.po +2 -2
  22. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  23. wagtail/admin/locale/hr_HR/LC_MESSAGES/django.po +4 -0
  24. wagtail/admin/locale/hu/LC_MESSAGES/django.mo +0 -0
  25. wagtail/admin/locale/hu/LC_MESSAGES/django.po +142 -2
  26. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  27. wagtail/admin/locale/it/LC_MESSAGES/django.po +80 -8
  28. wagtail/admin/locale/it/LC_MESSAGES/djangojs.mo +0 -0
  29. wagtail/admin/locale/it/LC_MESSAGES/djangojs.po +14 -2
  30. wagtail/admin/locale/lv/LC_MESSAGES/django.mo +0 -0
  31. wagtail/admin/locale/lv/LC_MESSAGES/django.po +154 -1
  32. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  33. wagtail/admin/locale/pt_PT/LC_MESSAGES/django.po +73 -2
  34. wagtail/admin/locale/ro/LC_MESSAGES/django.mo +0 -0
  35. wagtail/admin/locale/ro/LC_MESSAGES/django.po +3 -3
  36. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  37. wagtail/admin/locale/sl/LC_MESSAGES/django.po +145 -2
  38. wagtail/admin/locale/sv/LC_MESSAGES/django.mo +0 -0
  39. wagtail/admin/locale/sv/LC_MESSAGES/django.po +77 -3
  40. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  41. wagtail/admin/locale/zh_Hant/LC_MESSAGES/django.po +17 -1
  42. wagtail/admin/panels/comment_panel.py +1 -1
  43. wagtail/admin/panels/field_panel.py +1 -1
  44. wagtail/admin/rich_text/converters/editor_html.py +3 -1
  45. wagtail/admin/rich_text/editors/draftail/__init__.py +28 -2
  46. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  47. wagtail/admin/static/wagtailadmin/css/panels/draftail.css +1 -1
  48. wagtail/admin/static/wagtailadmin/images/favicon.ico +0 -0
  49. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  50. wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
  51. wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
  52. wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
  53. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  54. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  55. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +1 -1
  56. wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
  57. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  58. wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
  59. wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
  60. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  61. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  62. wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
  63. wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
  64. wagtail/admin/static/wagtailadmin/js/preview-panel.js +1 -1
  65. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  66. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  67. wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
  68. wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
  69. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  70. wagtail/admin/static/wagtailadmin/js/telepath/telepath.js +1 -1
  71. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  72. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  73. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  74. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +4 -4
  75. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  76. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  77. wagtail/admin/staticfiles.py +1 -0
  78. wagtail/admin/templates/wagtailadmin/admin_base.html +1 -0
  79. wagtail/admin/templates/wagtailadmin/base.html +1 -0
  80. wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +3 -1
  81. wagtail/admin/templates/wagtailadmin/collections/edit.html +0 -1
  82. wagtail/admin/templates/wagtailadmin/collections/index_results.html +10 -0
  83. wagtail/admin/templates/wagtailadmin/generic/base.html +1 -9
  84. wagtail/admin/templates/wagtailadmin/generic/form.html +4 -2
  85. wagtail/admin/templates/wagtailadmin/generic/history/action_cell.html +27 -0
  86. wagtail/admin/templates/wagtailadmin/generic/index_results.html +8 -0
  87. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +3 -4
  88. wagtail/admin/templates/wagtailadmin/icons/keyboard.svg +1 -0
  89. wagtail/admin/templates/wagtailadmin/page_privacy/set_privacy.html +3 -1
  90. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -15
  91. wagtail/admin/templates/wagtailadmin/pages/action_menu/save_draft.html +3 -1
  92. wagtail/admin/templates/wagtailadmin/pages/choose_parent.html +17 -0
  93. wagtail/admin/templates/wagtailadmin/pages/explorable_index.html +8 -0
  94. wagtail/admin/templates/wagtailadmin/pages/history.html +1 -61
  95. wagtail/admin/templates/wagtailadmin/pages/index.html +1 -5
  96. wagtail/admin/templates/wagtailadmin/pages/listing/_locked_indicator.html +2 -2
  97. wagtail/admin/templates/wagtailadmin/pages/listing/_page_title_column_header.html +25 -27
  98. wagtail/admin/templates/wagtailadmin/pages/page_listing_header.html +2 -1
  99. wagtail/admin/templates/wagtailadmin/panels/multi_field_panel_child.html +1 -1
  100. wagtail/admin/templates/wagtailadmin/panels/publishing/schedule_publishing_panel.html +3 -1
  101. wagtail/admin/templates/wagtailadmin/panels/tabbed_interface.html +1 -1
  102. wagtail/admin/templates/wagtailadmin/shared/active_filters.html +2 -1
  103. wagtail/admin/templates/wagtailadmin/shared/breadcrumbs.html +8 -0
  104. wagtail/admin/templates/wagtailadmin/shared/forms/single_checkbox.html +1 -1
  105. wagtail/admin/templates/wagtailadmin/shared/headers/page_edit_header.html +1 -1
  106. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +21 -9
  107. wagtail/admin/templates/wagtailadmin/shared/human_readable_date.html +1 -1
  108. wagtail/admin/templates/wagtailadmin/shared/keyboard_shortcuts_dialog.html +29 -0
  109. wagtail/admin/templates/wagtailadmin/shared/side_panel_toggle.html +2 -1
  110. wagtail/admin/templates/wagtailadmin/skeleton.html +2 -1
  111. wagtail/admin/templates/wagtailadmin/tables/related_objects_cell.html +9 -0
  112. wagtail/admin/templates/wagtailadmin/tables/title_cell.html +9 -7
  113. wagtail/admin/templates/wagtailadmin/widgets/draftail_rich_text_area.html +1 -1
  114. wagtail/admin/templates/wagtailadmin/workflows/create.html +6 -23
  115. wagtail/admin/templates/wagtailadmin/workflows/create_task.html +6 -15
  116. wagtail/admin/templates/wagtailadmin/workflows/edit.html +6 -23
  117. wagtail/admin/templates/wagtailadmin/workflows/edit_task.html +6 -13
  118. wagtail/admin/templates/wagtailadmin/workflows/includes/task_usage_cell.html +4 -4
  119. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_tasks_cell.html +18 -0
  120. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_title_cell.html +7 -0
  121. wagtail/admin/templates/wagtailadmin/workflows/includes/workflow_used_by_cell.html +25 -0
  122. wagtail/admin/templates/wagtailadmin/workflows/index.html +0 -99
  123. wagtail/admin/templates/wagtailadmin/workflows/index_results.html +10 -0
  124. wagtail/admin/templates/wagtailadmin/workflows/task_index.html +0 -30
  125. wagtail/admin/templates/wagtailadmin/workflows/task_index_results.html +10 -0
  126. wagtail/admin/templates/wagtailadmin/workflows/usage.html +1 -1
  127. wagtail/admin/templatetags/wagtailadmin_tags.py +116 -39
  128. wagtail/admin/tests/api/test_pages.py +26 -10
  129. wagtail/admin/tests/pages/test_create_page.py +10 -4
  130. wagtail/admin/tests/pages/test_custom_listing.py +37 -0
  131. wagtail/admin/tests/pages/test_edit_page.py +6 -6
  132. wagtail/admin/tests/pages/test_explorer_view.py +19 -18
  133. wagtail/admin/tests/pages/test_move_page.py +1 -1
  134. wagtail/admin/tests/pages/test_page_usage.py +50 -2
  135. wagtail/admin/tests/pages/test_parent_page_chooser_view.py +119 -0
  136. wagtail/admin/tests/pages/test_preview.py +18 -4
  137. wagtail/admin/tests/test_account_management.py +20 -1
  138. wagtail/admin/tests/test_audit_log.py +172 -5
  139. wagtail/admin/tests/test_checks.py +92 -0
  140. wagtail/admin/tests/test_collections_views.py +19 -5
  141. wagtail/admin/tests/test_compare.py +6 -6
  142. wagtail/admin/tests/test_dashboard.py +404 -0
  143. wagtail/admin/tests/test_dbwhitelister.py +4 -5
  144. wagtail/admin/tests/test_edit_handlers.py +2 -2
  145. wagtail/admin/tests/test_keyboard_shortcuts.py +84 -0
  146. wagtail/admin/tests/test_page_chooser.py +31 -18
  147. wagtail/admin/tests/test_privacy.py +36 -2
  148. wagtail/admin/tests/test_rich_text.py +168 -23
  149. wagtail/admin/tests/test_templatetags.py +411 -43
  150. wagtail/admin/tests/test_views.py +4 -2
  151. wagtail/admin/tests/test_workflows.py +531 -9
  152. wagtail/admin/tests/tests.py +3 -1
  153. wagtail/admin/tests/ui/test_tables.py +48 -1
  154. wagtail/admin/tests/viewsets/test_model_viewset.py +130 -23
  155. wagtail/admin/ui/side_panels.py +3 -1
  156. wagtail/admin/ui/tables/__init__.py +13 -1
  157. wagtail/admin/ui/tables/pages.py +17 -6
  158. wagtail/admin/urls/__init__.py +8 -3
  159. wagtail/admin/urls/pages.py +5 -0
  160. wagtail/admin/urls/workflows.py +10 -0
  161. wagtail/admin/views/chooser.py +20 -24
  162. wagtail/admin/views/collections.py +17 -1
  163. wagtail/admin/views/generic/base.py +34 -4
  164. wagtail/admin/views/generic/history.py +220 -51
  165. wagtail/admin/views/generic/mixins.py +7 -4
  166. wagtail/admin/views/generic/models.py +54 -47
  167. wagtail/admin/views/generic/multiple_upload.py +17 -8
  168. wagtail/admin/views/generic/usage.py +17 -11
  169. wagtail/admin/views/home.py +15 -12
  170. wagtail/admin/views/mixins.py +30 -0
  171. wagtail/admin/views/pages/choose_parent.py +73 -0
  172. wagtail/admin/views/pages/history.py +54 -66
  173. wagtail/admin/views/pages/listing.py +187 -106
  174. wagtail/admin/views/pages/usage.py +6 -1
  175. wagtail/admin/views/pages/utils.py +70 -1
  176. wagtail/admin/views/workflows.py +150 -21
  177. wagtail/admin/viewsets/model.py +2 -2
  178. wagtail/admin/viewsets/pages.py +77 -0
  179. wagtail/admin/wagtail_hooks.py +40 -2
  180. wagtail/admin/widgets/button.py +10 -10
  181. wagtail/api/v2/filters.py +1 -1
  182. wagtail/api/v2/tests/test_pages.py +1 -1
  183. wagtail/blocks/base.py +18 -9
  184. wagtail/blocks/field_block.py +9 -7
  185. wagtail/blocks/list_block.py +16 -6
  186. wagtail/blocks/static_block.py +3 -0
  187. wagtail/blocks/stream_block.py +58 -23
  188. wagtail/blocks/struct_block.py +15 -9
  189. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +39 -47
  190. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  191. wagtail/contrib/forms/locale/he_IL/LC_MESSAGES/django.po +2 -2
  192. wagtail/contrib/forms/models.py +5 -5
  193. wagtail/contrib/forms/templates/wagtailforms/list_submissions.html +44 -33
  194. wagtail/contrib/forms/templates/wagtailforms/submissions_index.html +2 -63
  195. wagtail/contrib/forms/tests/test_models.py +26 -0
  196. wagtail/contrib/forms/urls.py +6 -0
  197. wagtail/contrib/forms/views.py +52 -49
  198. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.mo +0 -0
  199. wagtail/contrib/redirects/locale/ca/LC_MESSAGES/django.po +3 -3
  200. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +34 -42
  201. wagtail/contrib/redirects/locale/fr/LC_MESSAGES/django.po +2 -2
  202. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  203. wagtail/contrib/redirects/locale/he_IL/LC_MESSAGES/django.po +2 -2
  204. wagtail/contrib/redirects/signal_handlers.py +1 -1
  205. wagtail/contrib/redirects/templates/wagtailredirects/index.html +1 -36
  206. wagtail/contrib/redirects/templates/wagtailredirects/index_results.html +18 -0
  207. wagtail/contrib/redirects/templates/wagtailredirects/redirect_target_cell.html +8 -0
  208. wagtail/contrib/redirects/tests/test_import_command.py +1 -1
  209. wagtail/contrib/redirects/tests/test_redirects.py +79 -8
  210. wagtail/contrib/redirects/urls.py +2 -1
  211. wagtail/contrib/redirects/views.py +85 -55
  212. wagtail/contrib/search_promotions/admin_urls.py +2 -1
  213. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +41 -64
  214. wagtail/contrib/search_promotions/locale/fr/LC_MESSAGES/django.po +2 -2
  215. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  216. wagtail/contrib/search_promotions/locale/he_IL/LC_MESSAGES/django.po +2 -2
  217. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  218. wagtail/contrib/search_promotions/locale/hr_HR/LC_MESSAGES/django.po +41 -2
  219. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.mo +0 -0
  220. wagtail/contrib/search_promotions/locale/it/LC_MESSAGES/django.po +9 -3
  221. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index.html +1 -16
  222. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/index_results.html +11 -0
  223. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/list.html +0 -51
  224. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/results.html +3 -16
  225. wagtail/contrib/search_promotions/templates/wagtailsearchpromotions/search_promotion_column.html +15 -0
  226. wagtail/contrib/search_promotions/tests.py +122 -9
  227. wagtail/contrib/search_promotions/views.py +66 -65
  228. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +3 -3
  229. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  230. wagtail/contrib/settings/locale/he_IL/LC_MESSAGES/django.po +2 -2
  231. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.mo +0 -0
  232. wagtail/contrib/settings/locale/tr/LC_MESSAGES/django.po +6 -2
  233. wagtail/contrib/settings/registry.py +10 -5
  234. wagtail/contrib/settings/tests/generic/test_admin.py +9 -0
  235. wagtail/contrib/settings/tests/site_specific/test_admin.py +10 -1
  236. wagtail/contrib/settings/tests/site_specific/test_model.py +3 -3
  237. wagtail/contrib/settings/tests/site_specific/test_templates.py +1 -1
  238. wagtail/contrib/settings/views.py +3 -1
  239. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  240. wagtail/contrib/simple_translation/tests/test_wagtail_hooks.py +2 -2
  241. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  242. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  243. wagtail/contrib/styleguide/locale/he_IL/LC_MESSAGES/django.po +2 -2
  244. wagtail/contrib/table_block/blocks.py +2 -2
  245. wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
  246. wagtail/contrib/table_block/locale/ca/LC_MESSAGES/django.po +27 -2
  247. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  248. wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
  249. wagtail/contrib/table_block/locale/hu/LC_MESSAGES/django.po +27 -2
  250. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  251. wagtail/contrib/table_block/locale/it/LC_MESSAGES/django.po +27 -2
  252. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  253. wagtail/contrib/table_block/tests.py +6 -0
  254. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.mo +0 -0
  255. wagtail/contrib/typed_table_block/locale/ca/LC_MESSAGES/django.po +12 -2
  256. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
  257. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.mo +0 -0
  258. wagtail/contrib/typed_table_block/locale/hu/LC_MESSAGES/django.po +12 -2
  259. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.mo +0 -0
  260. wagtail/contrib/typed_table_block/locale/it/LC_MESSAGES/django.po +12 -2
  261. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  262. wagtail/coreutils.py +3 -2
  263. wagtail/documents/admin_urls.py +2 -2
  264. wagtail/documents/locale/en/LC_MESSAGES/django.po +22 -22
  265. wagtail/documents/locale/fr/LC_MESSAGES/django.po +2 -2
  266. wagtail/documents/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  267. wagtail/documents/locale/he_IL/LC_MESSAGES/django.po +2 -2
  268. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  269. wagtail/documents/locale/hr_HR/LC_MESSAGES/django.po +19 -2
  270. wagtail/documents/locale/hu/LC_MESSAGES/django.mo +0 -0
  271. wagtail/documents/locale/hu/LC_MESSAGES/django.po +16 -2
  272. wagtail/documents/locale/it/LC_MESSAGES/django.mo +0 -0
  273. wagtail/documents/locale/it/LC_MESSAGES/django.po +19 -2
  274. wagtail/documents/migrations/0013_delete_uploadeddocument.py +16 -0
  275. wagtail/documents/models.py +1 -20
  276. wagtail/documents/rich_text/__init__.py +11 -7
  277. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  278. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  279. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  280. wagtail/documents/templates/wagtaildocs/documents/index.html +0 -16
  281. wagtail/documents/tests/test_admin_views.py +155 -23
  282. wagtail/documents/tests/test_collection_privacy.py +55 -1
  283. wagtail/documents/tests/test_rich_text.py +14 -0
  284. wagtail/documents/views/documents.py +25 -22
  285. wagtail/documents/views/multiple.py +6 -7
  286. wagtail/documents/views/serve.py +16 -1
  287. wagtail/documents/wagtail_hooks.py +20 -15
  288. wagtail/embeds/blocks.py +5 -0
  289. wagtail/embeds/locale/en/LC_MESSAGES/django.po +2 -2
  290. wagtail/embeds/locale/fr/LC_MESSAGES/django.po +2 -2
  291. wagtail/embeds/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  292. wagtail/embeds/locale/he_IL/LC_MESSAGES/django.po +2 -2
  293. wagtail/embeds/rich_text/__init__.py +1 -1
  294. wagtail/embeds/tests/test_rich_text.py +14 -0
  295. wagtail/embeds/wagtail_hooks.py +4 -14
  296. wagtail/fields.py +3 -48
  297. wagtail/images/admin_urls.py +2 -2
  298. wagtail/images/check_files/wagtail.jpg +0 -0
  299. wagtail/images/check_files/wagtail.png +0 -0
  300. wagtail/images/fields.py +2 -0
  301. wagtail/images/image_operations.py +1 -1
  302. wagtail/images/locale/ca/LC_MESSAGES/django.mo +0 -0
  303. wagtail/images/locale/ca/LC_MESSAGES/django.po +12 -0
  304. wagtail/images/locale/en/LC_MESSAGES/django.po +33 -45
  305. wagtail/images/locale/fr/LC_MESSAGES/django.po +2 -2
  306. wagtail/images/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  307. wagtail/images/locale/he_IL/LC_MESSAGES/django.po +2 -2
  308. wagtail/images/locale/hu/LC_MESSAGES/django.mo +0 -0
  309. wagtail/images/locale/hu/LC_MESSAGES/django.po +28 -2
  310. wagtail/images/locale/it/LC_MESSAGES/django.mo +0 -0
  311. wagtail/images/locale/it/LC_MESSAGES/django.po +14 -2
  312. wagtail/images/locale/pt_PT/LC_MESSAGES/django.mo +0 -0
  313. wagtail/images/locale/pt_PT/LC_MESSAGES/django.po +4 -0
  314. wagtail/images/migrations/0026_delete_uploadedimage.py +16 -0
  315. wagtail/images/models.py +49 -43
  316. wagtail/images/rich_text/__init__.py +18 -8
  317. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  318. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  319. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  320. wagtail/images/templates/wagtailimages/images/image_listing_header.html +6 -0
  321. wagtail/images/templates/wagtailimages/images/index.html +11 -51
  322. wagtail/images/tests/test_admin_views.py +119 -62
  323. wagtail/images/tests/test_image_operations.py +10 -0
  324. wagtail/images/tests/test_models.py +35 -33
  325. wagtail/images/tests/test_rich_text.py +14 -0
  326. wagtail/images/tests/utils.py +1 -1
  327. wagtail/images/views/images.py +35 -64
  328. wagtail/images/views/multiple.py +6 -7
  329. wagtail/images/wagtail_hooks.py +4 -14
  330. wagtail/locale/en/LC_MESSAGES/django.po +150 -136
  331. wagtail/locale/es/LC_MESSAGES/django.mo +0 -0
  332. wagtail/locale/es/LC_MESSAGES/django.po +3 -2
  333. wagtail/locale/fr/LC_MESSAGES/django.po +2 -2
  334. wagtail/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  335. wagtail/locale/he_IL/LC_MESSAGES/django.po +2 -2
  336. wagtail/locale/it/LC_MESSAGES/django.mo +0 -0
  337. wagtail/locale/it/LC_MESSAGES/django.po +5 -5
  338. wagtail/locale/sl/LC_MESSAGES/django.mo +0 -0
  339. wagtail/locale/sl/LC_MESSAGES/django.po +27 -2
  340. wagtail/locales/locale/ar/LC_MESSAGES/django.po +1 -1
  341. wagtail/locales/locale/be/LC_MESSAGES/django.po +1 -1
  342. wagtail/locales/locale/bg/LC_MESSAGES/django.po +1 -1
  343. wagtail/locales/locale/ca/LC_MESSAGES/django.po +1 -1
  344. wagtail/locales/locale/cs/LC_MESSAGES/django.po +1 -1
  345. wagtail/locales/locale/cy/LC_MESSAGES/django.po +1 -1
  346. wagtail/locales/locale/da/LC_MESSAGES/django.po +1 -1
  347. wagtail/locales/locale/de/LC_MESSAGES/django.po +1 -1
  348. wagtail/locales/locale/el/LC_MESSAGES/django.po +1 -1
  349. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  350. wagtail/locales/locale/es/LC_MESSAGES/django.po +1 -1
  351. wagtail/locales/locale/et/LC_MESSAGES/django.po +2 -2
  352. wagtail/locales/locale/fa/LC_MESSAGES/django.po +1 -1
  353. wagtail/locales/locale/fi/LC_MESSAGES/django.po +1 -1
  354. wagtail/locales/locale/fr/LC_MESSAGES/django.po +1 -1
  355. wagtail/locales/locale/gl/LC_MESSAGES/django.po +1 -1
  356. wagtail/locales/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  357. wagtail/locales/locale/he_IL/LC_MESSAGES/django.po +3 -3
  358. wagtail/locales/locale/hr_HR/LC_MESSAGES/django.po +1 -1
  359. wagtail/locales/locale/hu/LC_MESSAGES/django.po +1 -1
  360. wagtail/locales/locale/id_ID/LC_MESSAGES/django.po +1 -1
  361. wagtail/locales/locale/is_IS/LC_MESSAGES/django.po +1 -1
  362. wagtail/locales/locale/it/LC_MESSAGES/django.po +1 -1
  363. wagtail/locales/locale/ja/LC_MESSAGES/django.po +1 -1
  364. wagtail/locales/locale/ko/LC_MESSAGES/django.po +1 -1
  365. wagtail/locales/locale/lt/LC_MESSAGES/django.po +1 -1
  366. wagtail/locales/locale/lv/LC_MESSAGES/django.po +1 -1
  367. wagtail/locales/locale/mi/LC_MESSAGES/django.po +1 -1
  368. wagtail/locales/locale/mn/LC_MESSAGES/django.po +1 -1
  369. wagtail/locales/locale/my/LC_MESSAGES/django.po +1 -1
  370. wagtail/locales/locale/nb/LC_MESSAGES/django.po +1 -1
  371. wagtail/locales/locale/nl/LC_MESSAGES/django.po +1 -1
  372. wagtail/locales/locale/pl/LC_MESSAGES/django.po +1 -1
  373. wagtail/locales/locale/pt_BR/LC_MESSAGES/django.po +1 -1
  374. wagtail/locales/locale/pt_PT/LC_MESSAGES/django.po +1 -1
  375. wagtail/locales/locale/ro/LC_MESSAGES/django.po +1 -1
  376. wagtail/locales/locale/ru/LC_MESSAGES/django.po +1 -1
  377. wagtail/locales/locale/sk_SK/LC_MESSAGES/django.po +1 -1
  378. wagtail/locales/locale/sl/LC_MESSAGES/django.po +1 -1
  379. wagtail/locales/locale/sv/LC_MESSAGES/django.po +1 -1
  380. wagtail/locales/locale/tet/LC_MESSAGES/django.po +1 -1
  381. wagtail/locales/locale/th/LC_MESSAGES/django.po +1 -1
  382. wagtail/locales/locale/tr/LC_MESSAGES/django.po +1 -1
  383. wagtail/locales/locale/tr_TR/LC_MESSAGES/django.po +1 -1
  384. wagtail/locales/locale/uk/LC_MESSAGES/django.po +1 -1
  385. wagtail/locales/locale/vi/LC_MESSAGES/django.po +1 -1
  386. wagtail/locales/locale/zh/LC_MESSAGES/django.po +1 -1
  387. wagtail/locales/locale/zh_Hans/LC_MESSAGES/django.po +1 -1
  388. wagtail/locales/locale/zh_Hant/LC_MESSAGES/django.po +1 -1
  389. wagtail/locales/tests.py +18 -3
  390. wagtail/locales/views.py +0 -1
  391. wagtail/management/commands/rebuild_references_index.py +3 -1
  392. wagtail/migrations/0092_alter_collectionviewrestriction_password_and_more.py +33 -0
  393. wagtail/migrations/0093_uploadedfile.py +53 -0
  394. wagtail/models/__init__.py +147 -32
  395. wagtail/models/i18n.py +1 -1
  396. wagtail/models/{collections.py → media.py} +33 -2
  397. wagtail/models/reference_index.py +1 -1
  398. wagtail/models/view_restrictions.py +10 -3
  399. wagtail/project_template/project_name/settings/base.py +6 -0
  400. wagtail/project_template/requirements.txt +1 -1
  401. wagtail/rich_text/__init__.py +25 -8
  402. wagtail/rich_text/pages.py +19 -8
  403. wagtail/rich_text/rewriters.py +140 -68
  404. wagtail/search/backends/database/mysql/mysql.py +3 -3
  405. wagtail/search/backends/database/postgres/postgres.py +3 -3
  406. wagtail/search/backends/database/sqlite/sqlite.py +2 -2
  407. wagtail/search/backends/elasticsearch7.py +4 -0
  408. wagtail/search/locale/en/LC_MESSAGES/django.po +3 -3
  409. wagtail/search/tests/test_postgres_backend.py +50 -0
  410. wagtail/sites/locale/en/LC_MESSAGES/django.po +8 -8
  411. wagtail/sites/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  412. wagtail/sites/locale/he_IL/LC_MESSAGES/django.po +2 -2
  413. wagtail/sites/locale/ro/LC_MESSAGES/django.mo +0 -0
  414. wagtail/sites/locale/ro/LC_MESSAGES/django.po +3 -2
  415. wagtail/sites/tests.py +35 -9
  416. wagtail/sites/views.py +3 -1
  417. wagtail/snippets/locale/de/LC_MESSAGES/django.mo +0 -0
  418. wagtail/snippets/locale/de/LC_MESSAGES/django.po +7 -8
  419. wagtail/snippets/locale/en/LC_MESSAGES/django.po +16 -56
  420. wagtail/snippets/locale/fr/LC_MESSAGES/django.po +2 -2
  421. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  422. wagtail/snippets/locale/he_IL/LC_MESSAGES/django.po +2 -2
  423. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  424. wagtail/snippets/locale/hr_HR/LC_MESSAGES/django.po +6 -2
  425. wagtail/snippets/locale/lv/LC_MESSAGES/django.mo +0 -0
  426. wagtail/snippets/locale/lv/LC_MESSAGES/django.po +12 -0
  427. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.mo +0 -0
  428. wagtail/snippets/locale/zh_Hant/LC_MESSAGES/django.po +4 -0
  429. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  430. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  431. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/publish.html +3 -1
  432. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/save.html +3 -1
  433. wagtail/snippets/templates/wagtailsnippets/snippets/create.html +2 -3
  434. wagtail/snippets/templates/wagtailsnippets/snippets/edit.html +2 -3
  435. wagtail/snippets/tests/test_preview.py +13 -2
  436. wagtail/snippets/tests/test_snippets.py +41 -16
  437. wagtail/snippets/tests/test_viewset.py +95 -18
  438. wagtail/snippets/tests/test_workflows.py +12 -0
  439. wagtail/snippets/views/snippets.py +1 -40
  440. wagtail/templatetags/wagtailcore_tags.py +1 -1
  441. wagtail/test/demosite/models.py +1 -1
  442. wagtail/test/middleware.py +14 -1
  443. wagtail/test/testapp/fixtures/test.json +20 -0
  444. wagtail/test/testapp/migrations/0001_squashed_0073_revisablechildmodel_secret_text.py +8 -8
  445. wagtail/test/testapp/migrations/0023_snippetchoosermodel_full_featured.py +1 -0
  446. wagtail/test/testapp/migrations/0034_custompermissionmodel.py +44 -0
  447. wagtail/test/testapp/migrations/0035_modelwithcustommanager.py +30 -0
  448. wagtail/test/testapp/migrations/0036_complexdefaultstreampage.py +28 -0
  449. wagtail/test/testapp/models.py +79 -2
  450. wagtail/test/testapp/templates/tests/custom_docs_password_required.html +10 -0
  451. wagtail/test/testapp/templates/tests/custom_page_password_required.html +10 -0
  452. wagtail/test/testapp/views.py +24 -2
  453. wagtail/test/testapp/wagtail_hooks.py +19 -0
  454. wagtail/test/utils/wagtail_tests.py +2 -2
  455. wagtail/tests/test_blocks.py +262 -1
  456. wagtail/tests/test_migrations.py +1 -1
  457. wagtail/tests/test_page_model.py +77 -0
  458. wagtail/tests/test_page_privacy.py +18 -1
  459. wagtail/tests/test_rich_text.py +95 -5
  460. wagtail/tests/test_streamfield.py +43 -0
  461. wagtail/tests/test_utils.py +8 -2
  462. wagtail/tests/test_views.py +52 -1
  463. wagtail/tests/test_whitelist.py +7 -7
  464. wagtail/users/forms.py +3 -1
  465. wagtail/users/locale/en/LC_MESSAGES/django.po +124 -96
  466. wagtail/users/locale/fr/LC_MESSAGES/django.po +2 -2
  467. wagtail/users/locale/he_IL/LC_MESSAGES/django.mo +0 -0
  468. wagtail/users/locale/he_IL/LC_MESSAGES/django.po +2 -2
  469. wagtail/users/locale/hr_HR/LC_MESSAGES/django.mo +0 -0
  470. wagtail/users/locale/hr_HR/LC_MESSAGES/django.po +13 -2
  471. wagtail/users/migrations/0013_userprofile_density.py +23 -0
  472. wagtail/users/models.py +14 -3
  473. wagtail/users/templates/wagtailusers/groups/create.html +1 -7
  474. wagtail/users/templates/wagtailusers/groups/edit.html +1 -13
  475. wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +46 -2
  476. wagtail/users/templates/wagtailusers/groups/includes/group_form_js.html +0 -3
  477. wagtail/users/templates/wagtailusers/users/create.html +1 -14
  478. wagtail/users/templates/wagtailusers/users/edit.html +1 -14
  479. wagtail/users/templates/wagtailusers/users/index.html +2 -5
  480. wagtail/users/templates/wagtailusers/users/index_results.html +3 -13
  481. wagtail/users/templates/wagtailusers/users/user_cell.html +9 -0
  482. wagtail/users/templatetags/wagtailusers_tags.py +107 -20
  483. wagtail/users/tests/test_admin_views.py +669 -90
  484. wagtail/users/views/groups.py +58 -61
  485. wagtail/users/views/users.py +211 -92
  486. wagtail/users/wagtail_hooks.py +6 -38
  487. wagtail/users/widgets.py +3 -5
  488. wagtail/utils/text.py +1 -1
  489. wagtail/views.py +5 -9
  490. wagtail/whitelist.py +1 -1
  491. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/METADATA +5 -6
  492. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/RECORD +496 -477
  493. wagtail/admin/static/wagtailadmin/js/page-editor.js +0 -1
  494. wagtail/admin/static/wagtailadmin/js/vendor/mousetrap.min.js +0 -1
  495. wagtail/admin/static/wagtailadmin/js/vendor/urlify.js +0 -1
  496. wagtail/admin/static/wagtailadmin/js/vendor/xregexp.min.js +0 -1
  497. wagtail/admin/templates/wagtailadmin/collections/index.html +0 -34
  498. wagtail/admin/templates/wagtailadmin/pages/revisions/_actions.html +0 -22
  499. wagtail/admin/templates/wagtailadmin/shared/page_breadcrumbs.html +0 -55
  500. wagtail/admin/tests/pages/test_dashboard.py +0 -172
  501. wagtail/contrib/redirects/templates/wagtailredirects/results.html +0 -23
  502. wagtail/documents/templates/wagtaildocs/documents/list.html +0 -2
  503. wagtail/search/tests/test_postgres_stemming.py +0 -40
  504. wagtail/sites/templates/wagtailsites/create.html +0 -7
  505. wagtail/sites/templates/wagtailsites/edit.html +0 -7
  506. wagtail/snippets/templates/wagtailsnippets/snippets/revisions/_actions.html +0 -36
  507. wagtail/users/templates/wagtailusers/users/list.html +0 -62
  508. wagtail/users/urls/users.py +0 -12
  509. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/LICENSE +0 -0
  510. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/WHEEL +0 -0
  511. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/entry_points.txt +0 -0
  512. {wagtail-6.0.1.dist-info → wagtail-6.1rc1.dist-info}/top_level.txt +0 -0
@@ -30,6 +30,9 @@ class StaticBlock(Block):
30
30
  def value_from_datadict(self, data, files, prefix):
31
31
  return None
32
32
 
33
+ def normalize(self, value):
34
+ return None
35
+
33
36
  class Meta:
34
37
  admin_text = None
35
38
  default = None
@@ -1,4 +1,5 @@
1
1
  import itertools
2
+ import json
2
3
  import uuid
3
4
  from collections import OrderedDict, defaultdict
4
5
  from collections.abc import Mapping, MutableSequence
@@ -88,16 +89,8 @@ class BaseStreamBlock(Block):
88
89
  block.set_name(name)
89
90
  self.child_blocks[name] = block
90
91
 
91
- def get_default(self):
92
- """
93
- Default values set on a StreamBlock should be a list of (type_name, value) tuples -
94
- we can't use StreamValue directly, because that would require a reference back to
95
- the StreamBlock that hasn't been built yet.
96
-
97
- For consistency, then, we need to convert it to a StreamValue here for StreamBlock
98
- to work with.
99
- """
100
- return StreamValue(self, self.meta.default)
92
+ def empty_value(self, raw_text=None):
93
+ return StreamValue(self, [], raw_text=raw_text)
101
94
 
102
95
  def sorted_child_blocks(self):
103
96
  """Child blocks, sorted in to their groups."""
@@ -230,19 +223,58 @@ class BaseStreamBlock(Block):
230
223
  return StreamValue(self, cleaned_data)
231
224
 
232
225
  def to_python(self, value):
233
- # the incoming JSONish representation is a list of dicts, each with a 'type' and 'value' field
234
- # (and possibly an 'id' too).
235
- # This is passed to StreamValue to be expanded lazily - but first we reject any unrecognised
236
- # block types from the list
237
- return StreamValue(
238
- self,
239
- [
240
- child_data
241
- for child_data in value
242
- if child_data["type"] in self.child_blocks
243
- ],
244
- is_lazy=True,
245
- )
226
+ if isinstance(value, StreamValue):
227
+ return value
228
+ elif isinstance(value, str) and value:
229
+ try:
230
+ value = json.loads(value)
231
+ except ValueError:
232
+ # value is not valid JSON; most likely, this field was previously a
233
+ # rich text field before being migrated to StreamField, and the data
234
+ # was left intact in the migration. Return an empty stream instead
235
+ # (but keep the raw text available as an attribute, so that it can be
236
+ # used to migrate that data to StreamField)
237
+ return self.empty_value(raw_text=value)
238
+
239
+ if not value:
240
+ return self.empty_value()
241
+
242
+ # ensure value is a list and not some other kind of iterable
243
+ value = list(value)
244
+
245
+ if isinstance(value[0], dict):
246
+ # value is in JSONish representation - a dict with 'type' and 'value' keys.
247
+ # This is passed to StreamValue to be expanded lazily - but first we reject any unrecognised
248
+ # block types from the list
249
+ return StreamValue(
250
+ self,
251
+ [
252
+ child_data
253
+ for child_data in value
254
+ if child_data["type"] in self.child_blocks
255
+ ],
256
+ is_lazy=True,
257
+ )
258
+ else:
259
+ # See if it looks like the standard non-smart representation of a
260
+ # StreamField value: a list of (block_name, value) tuples
261
+ try:
262
+ [None for (x, y) in value]
263
+ except (TypeError, ValueError) as exc:
264
+ # Give up trying to make sense of the value
265
+ raise TypeError(
266
+ f"Cannot handle {value!r} (type {type(value)!r}) as a value of a StreamBlock"
267
+ ) from exc
268
+
269
+ # Test succeeded, so return as a StreamValue-ified version of that value
270
+ return StreamValue(
271
+ self,
272
+ [
273
+ (k, self.child_blocks[k].normalize(v))
274
+ for k, v in value
275
+ if k in self.child_blocks
276
+ ],
277
+ )
246
278
 
247
279
  def bulk_to_python(self, values):
248
280
  # 'values' is a list of streams, each stream being a list of dicts with 'type', 'value' and
@@ -304,6 +336,9 @@ class BaseStreamBlock(Block):
304
336
  # round-trips to the full data representation and back)
305
337
  return value.get_prep_value()
306
338
 
339
+ def normalize(self, value):
340
+ return self.to_python(value)
341
+
307
342
  def get_form_state(self, value):
308
343
  if not value:
309
344
  return []
@@ -125,16 +125,14 @@ class BaseStructBlock(Block):
125
125
  rather than a StructValue; for consistency, we need to convert it to a StructValue
126
126
  for StructBlock to work with
127
127
  """
128
- return self._to_struct_value(
129
- [
130
- (
131
- name,
132
- self.meta.default[name]
133
- if name in self.meta.default
134
- else block.get_default(),
135
- )
128
+
129
+ return self.normalize(
130
+ {
131
+ name: self.meta.default[name]
132
+ if name in self.meta.default
133
+ else block.get_default()
136
134
  for name, block in self.child_blocks.items()
137
- ]
135
+ }
138
136
  )
139
137
 
140
138
  def value_from_datadict(self, data, files, prefix):
@@ -238,6 +236,14 @@ class BaseStructBlock(Block):
238
236
  for name, val in value.items()
239
237
  }
240
238
 
239
+ def normalize(self, value):
240
+ if isinstance(value, self.meta.value_class):
241
+ return value
242
+
243
+ return self._to_struct_value(
244
+ {k: self.child_blocks[k].normalize(v) for k, v in value.items()}
245
+ )
246
+
241
247
  def get_form_state(self, value):
242
248
  return {
243
249
  name: self.child_blocks[name].get_form_state(val)
@@ -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"
@@ -37,118 +37,118 @@ msgid ""
37
37
  "them."
38
38
  msgstr ""
39
39
 
40
- #: models.py:21
40
+ #: models.py:20
41
41
  msgid "Single line text"
42
42
  msgstr ""
43
43
 
44
- #: models.py:22
44
+ #: models.py:21
45
45
  msgid "Multi-line text"
46
46
  msgstr ""
47
47
 
48
- #: models.py:23
48
+ #: models.py:22
49
49
  msgid "Email"
50
50
  msgstr ""
51
51
 
52
- #: models.py:24
52
+ #: models.py:23
53
53
  msgid "Number"
54
54
  msgstr ""
55
55
 
56
- #: models.py:25
56
+ #: models.py:24
57
57
  msgid "URL"
58
58
  msgstr ""
59
59
 
60
- #: models.py:26
60
+ #: models.py:25
61
61
  msgid "Checkbox"
62
62
  msgstr ""
63
63
 
64
- #: models.py:27
64
+ #: models.py:26
65
65
  msgid "Checkboxes"
66
66
  msgstr ""
67
67
 
68
- #: models.py:28
68
+ #: models.py:27
69
69
  msgid "Drop down"
70
70
  msgstr ""
71
71
 
72
- #: models.py:29
72
+ #: models.py:28
73
73
  msgid "Multiple select"
74
74
  msgstr ""
75
75
 
76
- #: models.py:30
76
+ #: models.py:29
77
77
  msgid "Radio buttons"
78
78
  msgstr ""
79
79
 
80
- #: models.py:31
80
+ #: models.py:30
81
81
  msgid "Date"
82
82
  msgstr ""
83
83
 
84
- #: models.py:32
84
+ #: models.py:31
85
85
  msgid "Date/time"
86
86
  msgstr ""
87
87
 
88
- #: models.py:33
88
+ #: models.py:32
89
89
  msgid "Hidden field"
90
90
  msgstr ""
91
91
 
92
- #: models.py:48
92
+ #: models.py:47
93
93
  msgid "submit time"
94
94
  msgstr ""
95
95
 
96
- #: models.py:67
96
+ #: models.py:66
97
97
  msgid "form submission"
98
98
  msgstr ""
99
99
 
100
- #: models.py:68
100
+ #: models.py:67
101
101
  msgid "form submissions"
102
102
  msgstr ""
103
103
 
104
- #: models.py:81
104
+ #: models.py:80
105
105
  msgid "name"
106
106
  msgstr ""
107
107
 
108
- #: models.py:86
108
+ #: models.py:85
109
109
  msgid "Safe name of the form field, the label converted to ascii_snake_case"
110
110
  msgstr ""
111
111
 
112
- #: models.py:90
112
+ #: models.py:89
113
113
  msgid "label"
114
114
  msgstr ""
115
115
 
116
- #: models.py:92
116
+ #: models.py:91
117
117
  msgid "The label of the form field"
118
118
  msgstr ""
119
119
 
120
- #: models.py:95
120
+ #: models.py:94
121
121
  msgid "field type"
122
122
  msgstr ""
123
123
 
124
- #: models.py:97
124
+ #: models.py:96
125
125
  msgid "required"
126
126
  msgstr ""
127
127
 
128
- #: models.py:99
128
+ #: models.py:98
129
129
  msgid "choices"
130
130
  msgstr ""
131
131
 
132
- #: models.py:102
132
+ #: models.py:101
133
133
  msgid ""
134
134
  "Comma or new line separated list of choices. Only applicable in checkboxes, "
135
135
  "radio and dropdown."
136
136
  msgstr ""
137
137
 
138
- #: models.py:106
138
+ #: models.py:105
139
139
  msgid "default value"
140
140
  msgstr ""
141
141
 
142
- #: models.py:109
142
+ #: models.py:108
143
143
  msgid ""
144
144
  "Default value. Comma or new line separated values supported for checkboxes."
145
145
  msgstr ""
146
146
 
147
- #: models.py:113
147
+ #: models.py:112
148
148
  msgid "help text"
149
149
  msgstr ""
150
150
 
151
- #: models.py:196
151
+ #: models.py:195 views.py:149
152
152
  msgid "Submission date"
153
153
  msgstr ""
154
154
 
@@ -202,10 +202,15 @@ msgstr[1] ""
202
202
  msgid "Delete"
203
203
  msgstr ""
204
204
 
205
- #: templates/wagtailforms/list_submissions.html:10
205
+ #: templates/wagtailforms/list_submissions.html:36
206
206
  msgid "Delete selected submissions"
207
207
  msgstr ""
208
208
 
209
+ #: templates/wagtailforms/list_submissions.html:44
210
+ #, python-format
211
+ msgid "There have been no submissions of the '%(title)s' form."
212
+ msgstr ""
213
+
209
214
  #: templates/wagtailforms/panels/form_responses_panel.html:2
210
215
  msgid "Total submissions"
211
216
  msgstr ""
@@ -219,28 +224,15 @@ msgstr ""
219
224
  msgid "Submissions of %(form_title)s"
220
225
  msgstr ""
221
226
 
222
- #: templates/wagtailforms/submissions_index.html:42
223
- #, python-format
224
- msgid "There have been no submissions of the '%(title)s' form."
225
- msgstr ""
226
-
227
- #: templates/wagtailforms/submissions_index.html:46
228
- msgid "Filter"
229
- msgstr ""
230
-
231
- #: templates/wagtailforms/submissions_index.html:54
232
- msgid "Apply filters"
233
- msgstr ""
234
-
235
- #: views.py:50 wagtail_hooks.py:26
227
+ #: views.py:52 views.py:267 wagtail_hooks.py:26
236
228
  msgid "Forms"
237
229
  msgstr ""
238
230
 
239
- #: views.py:57
231
+ #: views.py:59
240
232
  msgid "Title"
241
233
  msgstr ""
242
234
 
243
- #: views.py:64
235
+ #: views.py:66
244
236
  msgid "Origin"
245
237
  msgstr ""
246
238
 
@@ -255,6 +247,6 @@ msgid_plural "%(count)d submissions have been deleted."
255
247
  msgstr[0] ""
256
248
  msgstr[1] ""
257
249
 
258
- #: views.py:159
250
+ #: views.py:168
259
251
  msgid "Form data"
260
252
  msgstr ""
@@ -17,8 +17,8 @@ msgstr ""
17
17
  "Content-Type: text/plain; charset=UTF-8\n"
18
18
  "Content-Transfer-Encoding: 8bit\n"
19
19
  "Language: he_IL\n"
20
- "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
21
- "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
20
+ "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
21
+ "1 == 0) ? 1: 2;\n"
22
22
 
23
23
  msgid "Date from"
24
24
  msgstr "מתאריך"
@@ -1,7 +1,6 @@
1
1
  import datetime
2
2
  import os
3
3
 
4
- from django.conf import settings
5
4
  from django.core.serializers.json import DjangoJSONEncoder
6
5
  from django.core.validators import validate_email
7
6
  from django.db import models
@@ -264,10 +263,11 @@ class FormMixin:
264
263
  """
265
264
  Returns list submissions view for admin.
266
265
 
267
- `list_submissions_view_class` can bse set to provide custom view class.
266
+ `list_submissions_view_class` can be set to provide custom view class.
268
267
  Your class must be inherited from SubmissionsListView.
269
268
  """
270
- view = self.get_submissions_list_view_class().as_view()
269
+ results_only = kwargs.pop("results_only", False)
270
+ view = self.get_submissions_list_view_class().as_view(results_only=results_only)
271
271
  return view(request, form_page=self, *args, **kwargs)
272
272
 
273
273
  def serve(self, request, *args, **kwargs):
@@ -365,9 +365,9 @@ class EmailFormMixin(models.Model):
365
365
 
366
366
  # Format dates and datetime(s) with SHORT_DATE(TIME)_FORMAT
367
367
  if isinstance(value, datetime.datetime):
368
- value = date_format(value, settings.SHORT_DATETIME_FORMAT)
368
+ value = date_format(value, "SHORT_DATETIME_FORMAT")
369
369
  elif isinstance(value, datetime.date):
370
- value = date_format(value, settings.SHORT_DATE_FORMAT)
370
+ value = date_format(value, "SHORT_DATE_FORMAT")
371
371
 
372
372
  content.append(f"{field.label}: {value}")
373
373
 
@@ -1,37 +1,48 @@
1
+ {% extends "wagtailadmin/generic/index_results.html" %}
1
2
  {% load i18n %}
2
- <div class="w-overflow-auto">
3
- <table class="listing" data-controller="w-bulk" data-w-bulk-action-inactive-class="w-invisible">
4
- <col />
5
- <col />
6
- <col />
7
- <thead>
8
- <tr>
9
- <th colspan="{{ data_headings|length|add:1 }}">
10
- <button class="button no w-invisible" data-w-bulk-target="action">{% trans "Delete selected submissions" %}</button>
11
- </th>
12
- </tr>
13
- <tr>
14
- <th><input type="checkbox" data-action="w-bulk#toggleAll" data-w-bulk-target="all" /></th>
15
- {% for heading in data_headings %}
16
- <th id="{{ heading.name }}" class="{% if heading.order %}ordered icon {% if heading.order == 'ascending' %}icon-arrow-up-after{% else %}icon-arrow-down-after{% endif %}{% endif %}">
17
- {% if heading.order %}<a href="?order_by={% if heading.order == 'ascending' %}-{% endif %}{{ heading.name }}">{{ heading.label }}</a>{% else %}{{ heading.label }}{% endif %}
18
- </th>
19
- {% endfor %}
20
- </tr>
21
- </thead>
22
- <tbody>
23
- {% for row in data_rows %}
3
+ {% block results %}
4
+ <form class="w-overflow-auto" data-controller="w-bulk" data-w-bulk-action-inactive-class="w-invisible" action="{% url 'wagtailforms:delete_submissions' form_page.id %}" method="get">
5
+ <table class="listing">
6
+ <col />
7
+ <col />
8
+ <col />
9
+ <thead>
24
10
  <tr>
25
- <td>
26
- <input type="checkbox" name="selected-submissions" class="select-submission" value="{{ row.model_id }}" data-action="w-bulk#toggle" data-w-bulk-target="item" />
27
- </td>
28
- {% for cell in row.fields %}
29
- <td>
30
- {{ cell }}
31
- </td>
11
+ <th><input type="checkbox" data-action="w-bulk#toggleAll" data-w-bulk-target="all" /></th>
12
+ {% for heading in data_headings %}
13
+ <th id="{{ heading.name }}" class="{% if heading.order %}ordered icon {% if heading.order == 'ascending' %}icon-arrow-up-after{% else %}icon-arrow-down-after{% endif %}{% endif %}">
14
+ {% if heading.order %}<a href="?order_by={% if heading.order == 'ascending' %}-{% endif %}{{ heading.name }}">{{ heading.label }}</a>{% else %}{{ heading.label }}{% endif %}
15
+ </th>
32
16
  {% endfor %}
33
17
  </tr>
34
- {% endfor %}
35
- </tbody>
36
- </table>
37
- </div>
18
+ </thead>
19
+ <tbody>
20
+ {% for row in data_rows %}
21
+ <tr>
22
+ <td>
23
+ <input type="checkbox" name="selected-submissions" class="select-submission" value="{{ row.model_id }}" data-action="w-bulk#toggle" data-w-bulk-target="item" />
24
+ </td>
25
+ {% for cell in row.fields %}
26
+ <td>
27
+ {{ cell }}
28
+ </td>
29
+ {% endfor %}
30
+ </tr>
31
+ {% endfor %}
32
+ </tbody>
33
+ </table>
34
+ <div class="nice-padding">
35
+ <button class="button no w-invisible" data-w-bulk-target="action">
36
+ {% trans "Delete selected submissions" %}
37
+ </button>
38
+ </div>
39
+ </form>
40
+ {% endblock %}
41
+
42
+ {% block no_results_message %}
43
+ <p>
44
+ {% blocktrans trimmed with title=form_page.title %}
45
+ There have been no submissions of the '{{ title }}' form.
46
+ {% endblocktrans %}
47
+ </p>
48
+ {% endblock %}
@@ -1,64 +1,3 @@
1
- {% extends "wagtailadmin/base.html" %}
2
- {% load i18n wagtailadmin_tags %}
1
+ {% extends "wagtailadmin/generic/listing.html" %}
2
+ {% load i18n %}
3
3
  {% block titletag %}{% blocktrans trimmed with form_title=form_page.title|capfirst %}Submissions of {{ form_title }}{% endblocktrans %}{% endblock %}
4
- {% block extra_js %}
5
- {{ block.super }}
6
-
7
- <script>
8
- $.fn.datetimepicker.defaults.i18n.wagtail_custom_locale = {
9
- months: wagtailConfig.STRINGS.MONTHS,
10
- dayOfWeek: wagtailConfig.STRINGS.WEEKDAYS,
11
- dayOfWeekShort: wagtailConfig.STRINGS.WEEKDAYS_SHORT,
12
- }
13
- $.datetimepicker.setLocale('wagtail_custom_locale');
14
-
15
- $(function() {
16
- $('#id_date_from').datetimepicker({
17
- timepicker: false,
18
- format: 'Y-m-d',
19
- });
20
- $('#id_date_to').datetimepicker({
21
- timepicker: false,
22
- format: 'Y-m-d',
23
- });
24
- });
25
- </script>
26
- {% endblock %}
27
- {% block content %}
28
- {% fragment as form_actions %}
29
- {% include view.export_buttons_template_name %}
30
- {% endfragment %}
31
-
32
- {% include "wagtailadmin/shared/header.html" with classname="w-header--no-border" title=page_title subtitle=form_page.title|capfirst icon="form" merged=1 extra_actions=form_actions %}
33
-
34
- <div class="report filterable">
35
- <div class="report__results w-overflow-y-hidden w-overflow-x-scroll w-pb-6">
36
- {% if submissions %}
37
- <form action="{% url 'wagtailforms:delete_submissions' form_page.id %}" method="get">
38
- {% include "wagtailforms/list_submissions.html" %}
39
- {% include "wagtailadmin/shared/pagination_nav.html" with items=page_obj %}
40
- </form>
41
- {% else %}
42
- <p class="no-results-message">{% blocktrans trimmed with title=form_page.title %}There have been no submissions of the '{{ title }}' form.{% endblocktrans %}</p>
43
- {% endif %}
44
- </div>
45
- <div class="filterable__filters">
46
- <h2>{% trans 'Filter' %}</h2>
47
- <form action="" method="get" novalidate>
48
- <button
49
- class="button button-longrunning"
50
- type="submit"
51
- data-controller="w-progress"
52
- data-action="w-progress#activate"
53
- >
54
- {% icon name="spinner" %}{% trans 'Apply filters' %}
55
- </button>
56
- {% for field in select_date_form %}
57
- <li>
58
- {% formattedfield field %}
59
- </li>
60
- {% endfor %}
61
- </form>
62
- </div>
63
- </div>
64
- {% endblock %}
@@ -770,6 +770,32 @@ class TestCleanedDataEmails(TestCase):
770
770
  self.assertEqual(len(mail.outbox), 3)
771
771
  self.assertIn("Datetime: 12/21/1910 9:19 p.m.", mail.outbox[2].body)
772
772
 
773
+ @override_settings(USE_I18N=True, LANGUAGE_CODE="de")
774
+ def test_date_localization(self):
775
+ self.client.post(
776
+ "/contact-us/",
777
+ {
778
+ "date": "2017-12-31",
779
+ },
780
+ )
781
+
782
+ # Check the email
783
+ self.assertEqual(len(mail.outbox), 1)
784
+ self.assertIn("Date: 31.12.2017", mail.outbox[0].body)
785
+
786
+ @override_settings(USE_I18N=True, LANGUAGE_CODE="de")
787
+ def test_datetime_localization(self):
788
+ self.client.post(
789
+ "/contact-us/",
790
+ {
791
+ "datetime": "1910-12-21 21:19:12",
792
+ },
793
+ )
794
+
795
+ # Check the email
796
+ self.assertEqual(len(mail.outbox), 1)
797
+ self.assertIn("Datetime: 21.12.1910 21:19", mail.outbox[0].body)
798
+
773
799
 
774
800
  class TestIssue798(WagtailTestUtils, TestCase):
775
801
  fixtures = ["test.json"]
@@ -15,6 +15,12 @@ urlpatterns = [
15
15
  path(
16
16
  "submissions/<int:page_id>/", get_submissions_list_view, name="list_submissions"
17
17
  ),
18
+ path(
19
+ "submissions/<int:page_id>/results/",
20
+ get_submissions_list_view,
21
+ {"results_only": True},
22
+ name="list_submissions_results",
23
+ ),
18
24
  path(
19
25
  "submissions/<int:page_id>/delete/",
20
26
  DeleteSubmissionsView.as_view(),