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
@@ -20,8 +20,8 @@ msgstr ""
20
20
  "Content-Type: text/plain; charset=UTF-8\n"
21
21
  "Content-Transfer-Encoding: 8bit\n"
22
22
  "Language: he_IL\n"
23
- "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
24
- "1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
23
+ "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
24
+ "1 == 0) ? 1: 2;\n"
25
25
 
26
26
  msgid "Collection"
27
27
  msgstr "אוסף"
@@ -3,14 +3,14 @@
3
3
  # This file is distributed under the same license as the PACKAGE package.
4
4
  #
5
5
  # Translators:
6
- # Dino Aljević <dino8890@protonmail.com>, 2020-2023
6
+ # Dino Aljević <dino8890@protonmail.com>, 2020-2024
7
7
  msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: Wagtail\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
11
  "POT-Creation-Date: 2024-01-24 13:51+0000\n"
12
12
  "PO-Revision-Date: 2014-02-20 21:06+0000\n"
13
- "Last-Translator: Dino Aljević <dino8890@protonmail.com>, 2020-2023\n"
13
+ "Last-Translator: Dino Aljević <dino8890@protonmail.com>, 2020-2024\n"
14
14
  "Language-Team: Croatian (Croatia) (http://app.transifex.com/torchbox/wagtail/"
15
15
  "language/hr_HR/)\n"
16
16
  "MIME-Version: 1.0\n"
@@ -241,6 +241,23 @@ msgstr ""
241
241
  "Nemate dokumenata. Zašto ne <a "
242
242
  "href=\"%(wagtaildocs_add_document_url)s\">dodate jedan</a>?"
243
243
 
244
+ #, python-format
245
+ msgid ""
246
+ "<span>%(total)s</span> Document <span class=\"w-sr-only\">created in "
247
+ "%(site_name)s</span>"
248
+ msgid_plural ""
249
+ "<span>%(total)s</span> Documents <span class=\"w-sr-only\">created in "
250
+ "%(site_name)s</span>"
251
+ msgstr[0] ""
252
+ "<span>%(total)s</span> Dokument <span class=\"w-sr-only\">je stvoren u "
253
+ "%(site_name)s</span>"
254
+ msgstr[1] ""
255
+ "<span>%(total)s</span> Dokumenata <span class=\"w-sr-only\">je stvoreno u "
256
+ "%(site_name)s</span>"
257
+ msgstr[2] ""
258
+ "<span>%(total)s</span> Dokumenata <span class=\"w-sr-only\">je stvoreno u "
259
+ "%(site_name)s</span>"
260
+
244
261
  msgid "Add multiple documents"
245
262
  msgstr "Dodaj više dokumenata"
246
263
 
@@ -3,7 +3,7 @@
3
3
  # This file is distributed under the same license as the PACKAGE package.
4
4
  #
5
5
  # Translators:
6
- # Istvan Farkas <istvan.farkas@gmail.com>, 2019-2022
6
+ # Istvan Farkas <istvan.farkas@gmail.com>, 2019-2022,2024
7
7
  # Laszlo Molnar <lazlowmiller@gmail.com>, 2016
8
8
  msgid ""
9
9
  msgstr ""
@@ -11,7 +11,7 @@ msgstr ""
11
11
  "Report-Msgid-Bugs-To: \n"
12
12
  "POT-Creation-Date: 2024-01-24 13:51+0000\n"
13
13
  "PO-Revision-Date: 2014-02-20 21:06+0000\n"
14
- "Last-Translator: Laszlo Molnar <lazlowmiller@gmail.com>, 2016\n"
14
+ "Last-Translator: Istvan Farkas <istvan.farkas@gmail.com>, 2019-2022,2024\n"
15
15
  "Language-Team: Hungarian (http://app.transifex.com/torchbox/wagtail/language/"
16
16
  "hu/)\n"
17
17
  "MIME-Version: 1.0\n"
@@ -231,6 +231,20 @@ msgstr ""
231
231
  "Még nem töltött fel dokumentumot. Nem szeretne <a "
232
232
  "href=\"%(wagtaildocs_add_document_url)s\">feltölteni egyet</a>?"
233
233
 
234
+ #, python-format
235
+ msgid ""
236
+ "<span>%(total)s</span> Document <span class=\"w-sr-only\">created in "
237
+ "%(site_name)s</span>"
238
+ msgid_plural ""
239
+ "<span>%(total)s</span> Documents <span class=\"w-sr-only\">created in "
240
+ "%(site_name)s</span>"
241
+ msgstr[0] ""
242
+ "<span>%(total)s</span> dokumentum létrehozva ezen az oldalon: <span "
243
+ "class=\"w-sr-only\">%(site_name)s</span>"
244
+ msgstr[1] ""
245
+ "<span>%(total)s</span> dokumentum létrehozva ezen az oldalon: <span "
246
+ "class=\"w-sr-only\">%(site_name)s</span>"
247
+
234
248
  msgid "Add multiple documents"
235
249
  msgstr "Több dokumentum hozzáadása"
236
250
 
@@ -7,7 +7,7 @@
7
7
  # giammi <gian-maria.daffre@giammi.org>, 2018
8
8
  # giammi <gian-maria.daffre@giammi.org>, 2018
9
9
  # LB (Ben Johnston) <mail@lb.ee>, 2019
10
- # Marco Badan <marco.badan@gmail.com>, 2021-2023
10
+ # Marco Badan <marco.badan@gmail.com>, 2021-2024
11
11
  # Sandro Badalamenti <sandro@mailinator.com>, 2019
12
12
  msgid ""
13
13
  msgstr ""
@@ -15,7 +15,7 @@ msgstr ""
15
15
  "Report-Msgid-Bugs-To: \n"
16
16
  "POT-Creation-Date: 2024-01-24 13:51+0000\n"
17
17
  "PO-Revision-Date: 2014-02-20 21:06+0000\n"
18
- "Last-Translator: Marco Badan <marco.badan@gmail.com>, 2021-2023\n"
18
+ "Last-Translator: Marco Badan <marco.badan@gmail.com>, 2021-2024\n"
19
19
  "Language-Team: Italian (http://app.transifex.com/torchbox/wagtail/language/"
20
20
  "it/)\n"
21
21
  "MIME-Version: 1.0\n"
@@ -247,6 +247,23 @@ msgstr ""
247
247
  "Non hai caricato alcun documento. Perché non <a "
248
248
  "href=\"%(wagtaildocs_add_document_url)s\">ne carichi uno adesso</a>?"
249
249
 
250
+ #, python-format
251
+ msgid ""
252
+ "<span>%(total)s</span> Document <span class=\"w-sr-only\">created in "
253
+ "%(site_name)s</span>"
254
+ msgid_plural ""
255
+ "<span>%(total)s</span> Documents <span class=\"w-sr-only\">created in "
256
+ "%(site_name)s</span>"
257
+ msgstr[0] ""
258
+ "<span>%(total)s</span> documento <span class=\"w-sr-only\">creato in "
259
+ "%(site_name)s</span>"
260
+ msgstr[1] ""
261
+ "<span>%(total)s</span> documenti <span class=\"w-sr-only\">creati in "
262
+ "%(site_name)s</span>"
263
+ msgstr[2] ""
264
+ "<span>%(total)s</span> documenti <span class=\"w-sr-only\">creati in "
265
+ "%(site_name)s</span>"
266
+
250
267
  msgid "Add multiple documents"
251
268
  msgstr "Aggiungi documenti multipli"
252
269
 
@@ -0,0 +1,16 @@
1
+ # Generated by Django 5.0.1 on 2024-01-30 18:19
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wagtaildocs', '0012_uploadeddocument'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.DeleteModel(
14
+ name='UploadedDocument',
15
+ ),
16
+ ]
@@ -46,6 +46,7 @@ class AbstractDocument(CollectionMember, index.Indexed, models.Model):
46
46
  search_fields = CollectionMember.search_fields + [
47
47
  index.SearchField("title", boost=10),
48
48
  index.AutocompleteField("title"),
49
+ index.FilterField("id"),
49
50
  index.FilterField("title"),
50
51
  index.RelatedFields(
51
52
  "tags",
@@ -215,23 +216,3 @@ class Document(AbstractDocument):
215
216
 
216
217
  # provides args: request
217
218
  document_served = Signal()
218
-
219
-
220
- class UploadedDocument(models.Model):
221
- """
222
- Temporary storage for documents uploaded through the multiple doc uploader, when validation
223
- rules (e.g. required metadata fields) prevent creating a Document object from the document file
224
- alone. In this case, the document file is stored against this model, to be turned into a
225
- Document object once the full form has been filled in.
226
- """
227
-
228
- file = models.FileField(upload_to="uploaded_documents", max_length=200)
229
- uploaded_by_user = models.ForeignKey(
230
- settings.AUTH_USER_MODEL,
231
- verbose_name=_("uploaded by user"),
232
- null=True,
233
- blank=True,
234
- editable=False,
235
- on_delete=models.SET_NULL,
236
- )
237
- uploaded_by_user.wagtail_reference_index_ignore = True
@@ -1,4 +1,5 @@
1
- from django.core.exceptions import ObjectDoesNotExist
1
+ from typing import List
2
+
2
3
  from django.utils.html import escape
3
4
 
4
5
  from wagtail.documents import get_document_model
@@ -15,12 +16,15 @@ class DocumentLinkHandler(LinkHandler):
15
16
  return get_document_model()
16
17
 
17
18
  @classmethod
18
- def expand_db_attributes(cls, attrs):
19
- try:
20
- doc = cls.get_instance(attrs)
21
- return '<a href="%s">' % escape(doc.url)
22
- except (ObjectDoesNotExist, KeyError):
23
- return "<a>"
19
+ def expand_db_attributes(cls, attrs: dict) -> str:
20
+ return cls.expand_db_attributes_many([attrs])[0]
21
+
22
+ @classmethod
23
+ def expand_db_attributes_many(cls, attrs_list: List[dict]) -> List[str]:
24
+ return [
25
+ '<a href="%s">' % escape(doc.url) if doc else "<a>"
26
+ for doc in cls.get_many(attrs_list)
27
+ ]
24
28
 
25
29
  @classmethod
26
30
  def extract_references(cls, attrs):
@@ -1 +1 @@
1
- (()=>{"use strict";var e,o={5351:(e,o,r)=>{var t=r(5311),n=r.n(t),a=r(6024);class l extends a.D_{ajaxifyLinks(e,o){super.ajaxifyLinks(e,o),n()("a.upload-one-now").on("click",(e=>{const o=n()("#id_collection_id").val();o&&n()("#id_document-chooser-upload-collection").val(o),e.preventDefault()}))}}window.DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS=new l({searchInputDelay:50,creationFormFileFieldSelector:"#id_document-chooser-upload-file",creationFormTitleFieldSelector:"#id_document-chooser-upload-title",creationFormTabSelector:"#tab-upload",creationFormEventName:"wagtail:documents-upload"}).getOnLoadHandlers();class i extends a.sf{onloadHandlers=window.DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS}window.DocumentChooserModal=i},5311:e=>{e.exports=jQuery}},r={};function t(e){var n=r[e];if(void 0!==n)return n.exports;var a=r[e]={id:e,loaded:!1,exports:{}};return o[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}t.m=o,e=[],t.O=(o,r,n,a)=>{if(!r){var l=1/0;for(s=0;s<e.length;s++){for(var[r,n,a]=e[s],i=!0,d=0;d<r.length;d++)(!1&a||l>=a)&&Object.keys(t.O).every((e=>t.O[e](r[d])))?r.splice(d--,1):(i=!1,a<l&&(l=a));if(i){e.splice(s--,1);var c=n();void 0!==c&&(o=c)}}return o}a=a||0;for(var s=e.length;s>0&&e[s-1][2]>a;s--)e[s]=e[s-1];e[s]=[r,n,a]},t.n=e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},t.d=(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.j=882,(()=>{var e={882:0};t.O.j=o=>0===e[o];var o=(o,r)=>{var n,a,[l,i,d]=r,c=0;if(l.some((o=>0!==e[o]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(d)var s=d(t)}for(o&&o(r);c<l.length;c++)a=l[c],t.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return t.O(s)},r=globalThis.webpackChunkwagtail=globalThis.webpackChunkwagtail||[];r.forEach(o.bind(null,0)),r.push=o.bind(null,r.push.bind(r))})();var n=t.O(void 0,[751],(()=>t(5351)));n=t.O(n)})();
1
+ (()=>{"use strict";var e,o={4186:(e,o,r)=>{var t=r(1669),n=r.n(t),a=r(2614);class l extends a.C4{ajaxifyLinks(e,o){super.ajaxifyLinks(e,o),n()("a.upload-one-now").on("click",(e=>{const o=n()("#id_collection_id").val();o&&n()("#id_document-chooser-upload-collection").val(o),e.preventDefault()}))}}window.DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS=new l({searchInputDelay:50,creationFormFileFieldSelector:"#id_document-chooser-upload-file",creationFormTitleFieldSelector:"#id_document-chooser-upload-title",creationFormTabSelector:"#tab-upload",creationFormEventName:"wagtail:documents-upload"}).getOnLoadHandlers();class i extends a.ZZ{onloadHandlers=window.DOCUMENT_CHOOSER_MODAL_ONLOAD_HANDLERS}window.DocumentChooserModal=i},1669:e=>{e.exports=jQuery}},r={};function t(e){var n=r[e];if(void 0!==n)return n.exports;var a=r[e]={id:e,loaded:!1,exports:{}};return o[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}t.m=o,e=[],t.O=(o,r,n,a)=>{if(!r){var l=1/0;for(s=0;s<e.length;s++){for(var[r,n,a]=e[s],i=!0,d=0;d<r.length;d++)(!1&a||l>=a)&&Object.keys(t.O).every((e=>t.O[e](r[d])))?r.splice(d--,1):(i=!1,a<l&&(l=a));if(i){e.splice(s--,1);var c=n();void 0!==c&&(o=c)}}return o}a=a||0;for(var s=e.length;s>0&&e[s-1][2]>a;s--)e[s]=e[s-1];e[s]=[r,n,a]},t.n=e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},t.d=(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.j=884,(()=>{var e={884:0};t.O.j=o=>0===e[o];var o=(o,r)=>{var n,a,[l,i,d]=r,c=0;if(l.some((o=>0!==e[o]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(d)var s=d(t)}for(o&&o(r);c<l.length;c++)a=l[c],t.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return t.O(s)},r=globalThis.webpackChunkwagtail=globalThis.webpackChunkwagtail||[];r.forEach(o.bind(null,0)),r.push=o.bind(null,r.push.bind(r))})();var n=t.O(void 0,[321],(()=>t(4186)));n=t.O(n)})();
@@ -1 +1 @@
1
- (()=>{"use strict";var e,o={2658:(e,o,r)=>{var t=r(211);class n extends t.I{chooserModalClass=DocumentChooserModal}window.DocumentChooser=n;class a extends t.G{widgetClass=n;chooserModalClass=DocumentChooserModal}window.telepath.register("wagtail.documents.widgets.DocumentChooser",a)},5311:e=>{e.exports=jQuery}},r={};function t(e){var n=r[e];if(void 0!==n)return n.exports;var a=r[e]={id:e,loaded:!1,exports:{}};return o[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}t.m=o,e=[],t.O=(o,r,n,a)=>{if(!r){var l=1/0;for(u=0;u<e.length;u++){for(var[r,n,a]=e[u],i=!0,s=0;s<r.length;s++)(!1&a||l>=a)&&Object.keys(t.O).every((e=>t.O[e](r[s])))?r.splice(s--,1):(i=!1,a<l&&(l=a));if(i){e.splice(u--,1);var d=n();void 0!==d&&(o=d)}}return o}a=a||0;for(var u=e.length;u>0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[r,n,a]},t.n=e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},t.d=(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.j=488,(()=>{var e={488:0};t.O.j=o=>0===e[o];var o=(o,r)=>{var n,a,[l,i,s]=r,d=0;if(l.some((o=>0!==e[o]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(s)var u=s(t)}for(o&&o(r);d<l.length;d++)a=l[d],t.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return t.O(u)},r=globalThis.webpackChunkwagtail=globalThis.webpackChunkwagtail||[];r.forEach(o.bind(null,0)),r.push=o.bind(null,r.push.bind(r))})();var n=t.O(void 0,[751],(()=>t(2658)));n=t.O(n)})();
1
+ (()=>{"use strict";var e,o={3819:(e,o,r)=>{var t=r(9465);class n extends t.y{chooserModalClass=DocumentChooserModal}window.DocumentChooser=n;class a extends t._{widgetClass=n;chooserModalClass=DocumentChooserModal}window.telepath.register("wagtail.documents.widgets.DocumentChooser",a)},1669:e=>{e.exports=jQuery}},r={};function t(e){var n=r[e];if(void 0!==n)return n.exports;var a=r[e]={id:e,loaded:!1,exports:{}};return o[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}t.m=o,e=[],t.O=(o,r,n,a)=>{if(!r){var l=1/0;for(u=0;u<e.length;u++){for(var[r,n,a]=e[u],i=!0,s=0;s<r.length;s++)(!1&a||l>=a)&&Object.keys(t.O).every((e=>t.O[e](r[s])))?r.splice(s--,1):(i=!1,a<l&&(l=a));if(i){e.splice(u--,1);var d=n();void 0!==d&&(o=d)}}return o}a=a||0;for(var u=e.length;u>0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[r,n,a]},t.n=e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},t.d=(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.j=556,(()=>{var e={556:0};t.O.j=o=>0===e[o];var o=(o,r)=>{var n,a,[l,i,s]=r,d=0;if(l.some((o=>0!==e[o]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(s)var u=s(t)}for(o&&o(r);d<l.length;d++)a=l[d],t.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return t.O(u)},r=globalThis.webpackChunkwagtail=globalThis.webpackChunkwagtail||[];r.forEach(o.bind(null,0)),r.push=o.bind(null,r.push.bind(r))})();var n=t.O(void 0,[321],(()=>t(3819)));n=t.O(n)})();
@@ -1 +1 @@
1
- (()=>{"use strict";var e,r={3185:(e,r,o)=>{var t=o(211);class n extends t.I{chooserModalClass=DocumentChooserModal}window.DocumentChooser=n,window.DocumentChooser=n},5311:e=>{e.exports=jQuery}},o={};function t(e){var n=o[e];if(void 0!==n)return n.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}t.m=r,e=[],t.O=(r,o,n,a)=>{if(!o){var i=1/0;for(u=0;u<e.length;u++){for(var[o,n,a]=e[u],l=!0,s=0;s<o.length;s++)(!1&a||i>=a)&&Object.keys(t.O).every((e=>t.O[e](o[s])))?o.splice(s--,1):(l=!1,a<i&&(i=a));if(l){e.splice(u--,1);var d=n();void 0!==d&&(r=d)}}return r}a=a||0;for(var u=e.length;u>0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[o,n,a]},t.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.j=588,(()=>{var e={588:0};t.O.j=r=>0===e[r];var r=(r,o)=>{var n,a,[i,l,s]=o,d=0;if(i.some((r=>0!==e[r]))){for(n in l)t.o(l,n)&&(t.m[n]=l[n]);if(s)var u=s(t)}for(r&&r(o);d<i.length;d++)a=i[d],t.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return t.O(u)},o=globalThis.webpackChunkwagtail=globalThis.webpackChunkwagtail||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})();var n=t.O(void 0,[751],(()=>t(3185)));n=t.O(n)})();
1
+ (()=>{"use strict";var e,r={7023:(e,r,o)=>{var t=o(9465);class n extends t.y{chooserModalClass=DocumentChooserModal}window.DocumentChooser=n,window.DocumentChooser=n},1669:e=>{e.exports=jQuery}},o={};function t(e){var n=o[e];if(void 0!==n)return n.exports;var a=o[e]={id:e,loaded:!1,exports:{}};return r[e].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}t.m=r,e=[],t.O=(r,o,n,a)=>{if(!o){var i=1/0;for(u=0;u<e.length;u++){for(var[o,n,a]=e[u],l=!0,s=0;s<o.length;s++)(!1&a||i>=a)&&Object.keys(t.O).every((e=>t.O[e](o[s])))?o.splice(s--,1):(l=!1,a<i&&(i=a));if(l){e.splice(u--,1);var d=n();void 0!==d&&(r=d)}}return r}a=a||0;for(var u=e.length;u>0&&e[u-1][2]>a;u--)e[u]=e[u-1];e[u]=[o,n,a]},t.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),t.j=844,(()=>{var e={844:0};t.O.j=r=>0===e[r];var r=(r,o)=>{var n,a,[i,l,s]=o,d=0;if(i.some((r=>0!==e[r]))){for(n in l)t.o(l,n)&&(t.m[n]=l[n]);if(s)var u=s(t)}for(r&&r(o);d<i.length;d++)a=i[d],t.o(e,a)&&e[a]&&e[a][0](),e[a]=0;return t.O(u)},o=globalThis.webpackChunkwagtail=globalThis.webpackChunkwagtail||[];o.forEach(r.bind(null,0)),o.push=r.bind(null,o.push.bind(o))})();var n=t.O(void 0,[321],(()=>t(7023)));n=t.O(n)})();
@@ -9,22 +9,6 @@
9
9
  <script defer src="{% versioned_static 'wagtailadmin/js/bulk-actions.js' %}"></script>
10
10
  {% endblock %}
11
11
 
12
- {% block listing %}
13
- <div>
14
- {% if collections %}
15
- <form class="nice-padding" action="{{ index_url }}" method="GET" novalidate>
16
- <ul class="fields">
17
- <li>{% include "wagtailadmin/shared/collection_chooser.html" %}</li>
18
- </ul>
19
- </form>
20
- {% endif %}
21
-
22
- <div id="listing-results">
23
- {% include "wagtaildocs/documents/index_results.html" %}
24
- </div>
25
- </div>
26
- {% endblock %}
27
-
28
12
  {% block bulk_actions %}
29
13
  {% trans "Select all documents in listing" as select_all_text %}
30
14
  {% include 'wagtailadmin/bulk_actions/footer.html' with select_all_obj_text=select_all_text app_label=model_opts.app_label model_name=model_opts.model_name objects=page_obj parent=current_collection.id %}
@@ -2,6 +2,7 @@ import json
2
2
  from unittest import mock
3
3
 
4
4
  from django.contrib.auth.models import Group, Permission
5
+ from django.contrib.contenttypes.models import ContentType
5
6
  from django.core.files.uploadedfile import SimpleUploadedFile
6
7
  from django.test import TestCase, TransactionTestCase
7
8
  from django.test.utils import override_settings
@@ -12,7 +13,13 @@ from django.utils.http import urlencode
12
13
  from wagtail.admin.admin_url_finder import AdminURLFinder
13
14
  from wagtail.documents import get_document_model, models
14
15
  from wagtail.documents.tests.utils import get_test_document_file
15
- from wagtail.models import Collection, GroupCollectionPermission, Page, ReferenceIndex
16
+ from wagtail.models import (
17
+ Collection,
18
+ GroupCollectionPermission,
19
+ Page,
20
+ ReferenceIndex,
21
+ UploadedFile,
22
+ )
16
23
  from wagtail.test.testapp.models import (
17
24
  CustomDocument,
18
25
  CustomDocumentWithAuthor,
@@ -86,6 +93,9 @@ class TestDocumentIndexView(WagtailTestUtils, TestCase):
86
93
  response = self.get()
87
94
  self.assertNotContains(response, "<th>Collection</th>", html=True)
88
95
  self.assertNotContains(response, "<td>Root</td>", html=True)
96
+ soup = self.get_soup(response.content)
97
+ collection_select = soup.select_one('select[name="collection_id"]')
98
+ self.assertIsNone(collection_select)
89
99
 
90
100
  def test_index_with_collection(self):
91
101
  root_collection = Collection.get_first_root_node()
@@ -97,8 +107,18 @@ class TestDocumentIndexView(WagtailTestUtils, TestCase):
97
107
  response = self.get()
98
108
  self.assertContains(response, "<th>Collection</th>", html=True)
99
109
  self.assertContains(response, "<td>Root</td>", html=True)
110
+
111
+ response = self.get()
112
+ soup = self.get_soup(response.content)
113
+ collection_options = soup.select(
114
+ 'select[name="collection_id"] option[value]:not(option[value=""])'
115
+ )
116
+
100
117
  self.assertEqual(
101
- [collection.name for collection in response.context["collections"]],
118
+ [
119
+ collection.get_text(strip=True).lstrip("↳ ")
120
+ for collection in collection_options
121
+ ],
102
122
  ["Root", "Evil plans", "Good plans"],
103
123
  )
104
124
 
@@ -162,7 +182,7 @@ class TestDocumentIndexView(WagtailTestUtils, TestCase):
162
182
  def test_search_form_rendered(self):
163
183
  response = self.get()
164
184
  html = response.content.decode()
165
- search_url = reverse("wagtaildocs:index")
185
+ search_url = reverse("wagtaildocs:index_results")
166
186
 
167
187
  # Search form in the header should be rendered.
168
188
  self.assertTagInHTML(
@@ -172,6 +192,101 @@ class TestDocumentIndexView(WagtailTestUtils, TestCase):
172
192
  allow_extra_attrs=True,
173
193
  )
174
194
 
195
+ def test_tags(self):
196
+ document_two_tags = models.Document.objects.create(
197
+ title="Test document with two tags"
198
+ )
199
+ document_two_tags.tags.add("one", "two")
200
+
201
+ response = self.get()
202
+ self.assertEqual(response.status_code, 200)
203
+
204
+ soup = self.get_soup(response.content)
205
+ current_tags = soup.select("input[name=tag][checked]")
206
+ self.assertFalse(current_tags)
207
+
208
+ tags = soup.select("#id_tag label")
209
+ self.assertCountEqual(
210
+ [tags.get_text(strip=True) for tags in tags],
211
+ ["one", "two"],
212
+ )
213
+
214
+ def test_tag_filtering(self):
215
+ models.Document.objects.create(title="Test document with no tags")
216
+
217
+ document_one_tag = models.Document.objects.create(
218
+ title="Test document with one tag"
219
+ )
220
+ document_one_tag.tags.add("one")
221
+
222
+ document_two_tags = models.Document.objects.create(
223
+ title="Test document with two tags"
224
+ )
225
+ document_two_tags.tags.add("one", "two")
226
+
227
+ document_unrelated_tag = models.Document.objects.create(
228
+ title="Test document with a different tag"
229
+ )
230
+ document_unrelated_tag.tags.add("unrelated")
231
+
232
+ # no filtering
233
+ response = self.get()
234
+ # four documents created above
235
+ self.assertEqual(response.context["page_obj"].paginator.count, 4)
236
+
237
+ # filter all documents with tag 'one'
238
+ response = self.get({"tag": "one"})
239
+ self.assertEqual(response.context["page_obj"].paginator.count, 2)
240
+
241
+ # filter all documents with tag 'two'
242
+ response = self.get({"tag": "two"})
243
+ self.assertEqual(response.context["page_obj"].paginator.count, 1)
244
+
245
+ # filter all documents with tag 'one' or 'unrelated'
246
+ response = self.get({"tag": ["one", "unrelated"]})
247
+ self.assertEqual(response.context["page_obj"].paginator.count, 3)
248
+
249
+ soup = self.get_soup(response.content)
250
+
251
+ # Should check the 'one' and 'unrelated' tags checkboxes
252
+ tags = soup.select("#id_tag label")
253
+ self.assertCountEqual(
254
+ [
255
+ tag.get_text(strip=True)
256
+ for tag in tags
257
+ if tag.select_one("input[checked]") is not None
258
+ ],
259
+ ["one", "unrelated"],
260
+ )
261
+
262
+ # Should render the active filter pills separately for each tag
263
+ active_filters = soup.select('[data-w-active-filter-id="id_tag"]')
264
+ self.assertCountEqual(
265
+ [filter.get_text(separator=" ", strip=True) for filter in active_filters],
266
+ ["Tag: one", "Tag: unrelated"],
267
+ )
268
+
269
+ def test_tag_filtering_preserves_other_params(self):
270
+ for i in range(1, 130):
271
+ document = models.Document.objects.create(title="Test document %i" % i)
272
+ if i % 2 != 0:
273
+ document.tags.add("even")
274
+ document.save()
275
+
276
+ response = self.get({"tag": "even", "p": 2})
277
+ self.assertEqual(response.status_code, 200)
278
+
279
+ response_body = response.content.decode("utf8")
280
+
281
+ # prev link should exist and include tag
282
+ self.assertTrue(
283
+ "?p=1&amp;tag=even" in response_body or "?tag=even&amp;p=1" in response_body
284
+ )
285
+ # next link should exist and include tag
286
+ self.assertTrue(
287
+ "?p=3&amp;tag=even" in response_body or "?tag=even&amp;p=3" in response_body
288
+ )
289
+
175
290
 
176
291
  class TestDocumentIndexViewSearch(WagtailTestUtils, TransactionTestCase):
177
292
  def setUp(self):
@@ -225,6 +340,24 @@ class TestDocumentIndexViewSearch(WagtailTestUtils, TransactionTestCase):
225
340
  self.assertTemplateUsed(response, "wagtaildocs/documents/index.html")
226
341
  self.assertContains(response, "There are 50 matches")
227
342
 
343
+ def test_tag_filtering_with_search_term(self):
344
+ models.Document.objects.create(title="Test document with no tags")
345
+
346
+ document_one_tag = models.Document.objects.create(
347
+ title="Test document with one tag"
348
+ )
349
+ document_one_tag.tags.add("one")
350
+
351
+ document_two_tags = models.Document.objects.create(
352
+ title="Test document with two tags"
353
+ )
354
+ document_two_tags.tags.add("one", "two")
355
+
356
+ # The tag shouldn't be ignored, so the result should be the documents
357
+ # that have the "one" tag and "test" in the title.
358
+ response = self.get({"tag": "one", "q": "test"})
359
+ self.assertEqual(response.context["page_obj"].paginator.count, 2)
360
+
228
361
 
229
362
  class TestDocumentIndexResultsView(WagtailTestUtils, TransactionTestCase):
230
363
  def setUp(self):
@@ -1277,15 +1410,16 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1277
1410
  def setUp(self):
1278
1411
  super().setUp()
1279
1412
 
1280
- # Create an UploadedDocument for running tests on
1281
- self.uploaded_document = models.UploadedDocument.objects.create(
1413
+ # Create an UploadedFile for running tests on
1414
+ self.uploaded_document = UploadedFile.objects.create(
1415
+ for_content_type=ContentType.objects.get_for_model(get_document_model()),
1282
1416
  file=get_test_document_file(),
1283
1417
  uploaded_by_user=self.user,
1284
1418
  )
1285
1419
 
1286
1420
  def test_add_post(self):
1287
1421
  """
1288
- This tests that a POST request to the add view saves the document as an UploadedDocument
1422
+ This tests that a POST request to the add view saves the document as an UploadedFile
1289
1423
  and returns an edit form
1290
1424
  """
1291
1425
  response = self.client.post(
@@ -1326,11 +1460,11 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1326
1460
 
1327
1461
  # Check JSON
1328
1462
  response_json = json.loads(response.content.decode())
1329
- self.assertIn("uploaded_document_id", response_json)
1463
+ self.assertIn("uploaded_file_id", response_json)
1330
1464
  self.assertIn("form", response_json)
1331
1465
  self.assertIn("success", response_json)
1332
1466
  self.assertEqual(
1333
- response_json["uploaded_document_id"],
1467
+ response_json["uploaded_file_id"],
1334
1468
  response.context["uploaded_document"].id,
1335
1469
  )
1336
1470
  self.assertTrue(response_json["success"])
@@ -1363,10 +1497,10 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1363
1497
 
1364
1498
  # Check JSON
1365
1499
  response_json = json.loads(response.content.decode())
1366
- self.assertIn("uploaded_document_id", response_json)
1500
+ self.assertIn("uploaded_file_id", response_json)
1367
1501
  self.assertIn("form", response_json)
1368
1502
  self.assertEqual(
1369
- response_json["uploaded_document_id"],
1503
+ response_json["uploaded_file_id"],
1370
1504
  response.context["uploaded_document"].id,
1371
1505
  )
1372
1506
  self.assertTrue(response_json["success"])
@@ -1419,11 +1553,11 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1419
1553
 
1420
1554
  # Check JSON
1421
1555
  response_json = json.loads(response.content.decode())
1422
- self.assertIn("uploaded_document_id", response_json)
1556
+ self.assertIn("uploaded_file_id", response_json)
1423
1557
  self.assertIn("form", response_json)
1424
1558
  self.assertIn("success", response_json)
1425
1559
  self.assertEqual(
1426
- response_json["uploaded_document_id"],
1560
+ response_json["uploaded_file_id"],
1427
1561
  response.context["uploaded_document"].id,
1428
1562
  )
1429
1563
  self.assertTrue(response_json["success"])
@@ -1438,10 +1572,10 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1438
1572
  def test_create_from_upload_invalid_post(self):
1439
1573
  """
1440
1574
  Posting an invalid form to the create_from_uploaded_document view throws a validation error
1441
- and leaves the UploadedDocument intact
1575
+ and leaves the UploadedFile intact
1442
1576
  """
1443
1577
  doc_count_before = CustomDocumentWithAuthor.objects.count()
1444
- uploaded_doc_count_before = models.UploadedDocument.objects.count()
1578
+ uploaded_doc_count_before = UploadedFile.objects.count()
1445
1579
 
1446
1580
  # Send request
1447
1581
  response = self.client.post(
@@ -1459,9 +1593,9 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1459
1593
  )
1460
1594
 
1461
1595
  doc_count_after = CustomDocumentWithAuthor.objects.count()
1462
- uploaded_doc_count_after = models.UploadedDocument.objects.count()
1596
+ uploaded_doc_count_after = UploadedFile.objects.count()
1463
1597
 
1464
- # no changes to document / UploadedDocument count
1598
+ # no changes to document / UploadedFile count
1465
1599
  self.assertEqual(doc_count_after, doc_count_before)
1466
1600
  self.assertEqual(uploaded_doc_count_after, uploaded_doc_count_before)
1467
1601
 
@@ -1497,7 +1631,7 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1497
1631
  Posting a valid form to the create_from_uploaded_document view will create the document
1498
1632
  """
1499
1633
  doc_count_before = CustomDocumentWithAuthor.objects.count()
1500
- uploaded_doc_count_before = models.UploadedDocument.objects.count()
1634
+ uploaded_doc_count_before = UploadedFile.objects.count()
1501
1635
 
1502
1636
  # Send request
1503
1637
  response = self.client.post(
@@ -1519,7 +1653,7 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1519
1653
  )
1520
1654
 
1521
1655
  doc_count_after = CustomDocumentWithAuthor.objects.count()
1522
- uploaded_doc_count_after = models.UploadedDocument.objects.count()
1656
+ uploaded_doc_count_after = UploadedFile.objects.count()
1523
1657
 
1524
1658
  # Check response
1525
1659
  self.assertEqual(response.status_code, 200)
@@ -1530,7 +1664,7 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1530
1664
  self.assertIn("doc_id", response_json)
1531
1665
  self.assertTrue(response_json["success"])
1532
1666
 
1533
- # Document should have been created, UploadedDocument deleted
1667
+ # Document should have been created, UploadedFile deleted
1534
1668
  self.assertEqual(doc_count_after, doc_count_before + 1)
1535
1669
  self.assertEqual(uploaded_doc_count_after, uploaded_doc_count_before - 1)
1536
1670
 
@@ -1544,7 +1678,7 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1544
1678
 
1545
1679
  def test_delete_uploaded_document(self):
1546
1680
  """
1547
- This tests that a POST request to the delete view deletes the UploadedDocument
1681
+ This tests that a POST request to the delete view deletes the UploadedFile
1548
1682
  """
1549
1683
  # Send request
1550
1684
  response = self.client.post(
@@ -1559,9 +1693,7 @@ class TestMultipleCustomDocumentUploaderWithRequiredField(TestMultipleDocumentUp
1559
1693
 
1560
1694
  # Make sure the document is deleted
1561
1695
  self.assertFalse(
1562
- models.UploadedDocument.objects.filter(
1563
- id=self.uploaded_document.id
1564
- ).exists()
1696
+ UploadedFile.objects.filter(id=self.uploaded_document.id).exists()
1565
1697
  )
1566
1698
 
1567
1699
  # Check JSON