wagtail 7.1.2__py3-none-any.whl → 7.2rc1__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 (332) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_page.py +1 -1
  3. wagtail/actions/create_alias.py +1 -1
  4. wagtail/actions/delete_page.py +1 -1
  5. wagtail/actions/publish_page_revision.py +1 -1
  6. wagtail/actions/publish_revision.py +1 -1
  7. wagtail/actions/revert_to_page_revision.py +1 -1
  8. wagtail/actions/unpublish.py +1 -1
  9. wagtail/actions/unpublish_page.py +1 -1
  10. wagtail/admin/auth.py +3 -1
  11. wagtail/admin/checks.py +2 -2
  12. wagtail/admin/filters.py +28 -1
  13. wagtail/admin/forms/collections.py +1 -1
  14. wagtail/admin/forms/comments.py +1 -1
  15. wagtail/admin/forms/models.py +1 -1
  16. wagtail/admin/forms/pages.py +1 -1
  17. wagtail/admin/forms/tags.py +1 -1
  18. wagtail/admin/locale/cs/LC_MESSAGES/django.mo +0 -0
  19. wagtail/admin/locale/cs/LC_MESSAGES/django.po +25 -1
  20. wagtail/admin/locale/en/LC_MESSAGES/django.po +278 -192
  21. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +29 -15
  22. wagtail/admin/locale/it/LC_MESSAGES/django.mo +0 -0
  23. wagtail/admin/locale/it/LC_MESSAGES/django.po +3 -2
  24. wagtail/admin/locale/nl/LC_MESSAGES/django.mo +0 -0
  25. wagtail/admin/locale/nl/LC_MESSAGES/django.po +57 -3
  26. wagtail/admin/locale/nl/LC_MESSAGES/djangojs.mo +0 -0
  27. wagtail/admin/locale/nl/LC_MESSAGES/djangojs.po +8 -2
  28. wagtail/admin/locale/ru/LC_MESSAGES/django.mo +0 -0
  29. wagtail/admin/locale/ru/LC_MESSAGES/django.po +58 -1
  30. wagtail/admin/locale/tr/LC_MESSAGES/django.mo +0 -0
  31. wagtail/admin/locale/tr/LC_MESSAGES/django.po +3 -2
  32. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  33. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  34. wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
  35. wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
  36. wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
  37. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  38. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  39. wagtail/admin/static/wagtailadmin/js/core.js.LICENSE.txt +2 -2
  40. wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
  41. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  42. wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
  43. wagtail/admin/static/wagtailadmin/js/icons.js +1 -1
  44. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  45. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  46. wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
  47. wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
  48. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  49. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  50. wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
  51. wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
  52. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  53. wagtail/admin/static/wagtailadmin/js/telepath/telepath.js +1 -1
  54. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  55. wagtail/admin/static/wagtailadmin/js/userbar.js +1 -1
  56. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +2 -2
  57. wagtail/admin/static/wagtailadmin/js/vendor/bootstrap-modal.js +1 -1
  58. wagtail/admin/static/wagtailadmin/js/vendor/bootstrap-transition.js +1 -1
  59. wagtail/admin/static/wagtailadmin/js/vendor/jquery-3.6.0.min.js +1 -1
  60. wagtail/admin/static/wagtailadmin/js/vendor/jquery-ui-1.13.2.min.js +1 -1
  61. wagtail/admin/static/wagtailadmin/js/vendor/jquery.datetimepicker.js +1 -1
  62. wagtail/admin/static/wagtailadmin/js/vendor/jquery.fileupload-process.js +1 -1
  63. wagtail/admin/static/wagtailadmin/js/vendor/jquery.fileupload.js +1 -1
  64. wagtail/admin/static/wagtailadmin/js/vendor/jquery.iframe-transport.js +1 -1
  65. wagtail/admin/static/wagtailadmin/js/vendor/tag-it.js +1 -1
  66. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  67. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +1 -1
  68. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  69. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  70. wagtail/admin/templates/wagtailadmin/account/account.html +2 -0
  71. wagtail/admin/templates/wagtailadmin/base.html +14 -0
  72. wagtail/admin/templates/wagtailadmin/generic/chooser/chooser.html +2 -1
  73. wagtail/admin/templates/wagtailadmin/generic/chooser/creation_form.html +2 -1
  74. wagtail/admin/templates/wagtailadmin/panels/multi_field_panel_child.html +1 -1
  75. wagtail/admin/templates/wagtailadmin/panels/object_list.html +1 -1
  76. wagtail/admin/templates/wagtailadmin/panels/tabbed_interface.html +3 -2
  77. wagtail/admin/templates/wagtailadmin/shared/formatted_field.html +1 -1
  78. wagtail/admin/templates/wagtailadmin/shared/forms/single_checkbox.html +1 -1
  79. wagtail/admin/templates/wagtailadmin/shared/keyboard_shortcuts_dialog.html +19 -0
  80. wagtail/admin/templates/wagtailadmin/shared/panel.html +1 -1
  81. wagtail/admin/templates/wagtailadmin/shared/set_privacy.html +15 -0
  82. wagtail/admin/templates/wagtailadmin/shared/side_panels/checks.html +28 -1
  83. wagtail/admin/templates/wagtailadmin/shared/workflow_history/detail.html +2 -2
  84. wagtail/admin/templates/wagtailadmin/{pages/listing/_ordering_header.html → tables/ordering_header.html} +2 -2
  85. wagtail/admin/templates/wagtailadmin/tables/title_cell.html +1 -1
  86. wagtail/admin/templates/wagtailadmin/widgets/{daterange_input.html → range_input.html} +1 -1
  87. wagtail/admin/templates/wagtailadmin/workflows/task_chooser/chooser.html +4 -2
  88. wagtail/admin/templatetags/wagtailadmin_tags.py +41 -22
  89. wagtail/admin/tests/api/test_pages.py +7 -7
  90. wagtail/admin/tests/api/test_renderer_classes.py +16 -0
  91. wagtail/admin/tests/pages/test_create_page.py +34 -2
  92. wagtail/admin/tests/pages/test_edit_page.py +128 -14
  93. wagtail/admin/tests/pages/test_explorer_view.py +34 -7
  94. wagtail/admin/tests/pages/test_reorder_page.py +11 -0
  95. wagtail/admin/tests/test_collections_views.py +12 -0
  96. wagtail/admin/tests/test_edit_handlers.py +3 -3
  97. wagtail/admin/tests/test_filters.py +2 -2
  98. wagtail/admin/tests/test_keyboard_shortcuts.py +52 -2
  99. wagtail/admin/tests/test_menu.py +0 -2
  100. wagtail/admin/tests/test_privacy.py +16 -16
  101. wagtail/admin/tests/test_templatetags.py +137 -0
  102. wagtail/admin/tests/test_workflows.py +34 -0
  103. wagtail/admin/tests/viewsets/test_model_viewset.py +322 -0
  104. wagtail/admin/ui/tables/orderable.py +73 -0
  105. wagtail/admin/ui/tables/pages.py +3 -13
  106. wagtail/admin/views/collection_privacy.py +6 -2
  107. wagtail/admin/views/generic/__init__.py +1 -0
  108. wagtail/admin/views/generic/mixins.py +20 -2
  109. wagtail/admin/views/generic/models.py +67 -1
  110. wagtail/admin/views/generic/ordering.py +79 -0
  111. wagtail/admin/views/home.py +3 -3
  112. wagtail/admin/views/page_privacy.py +5 -2
  113. wagtail/admin/views/pages/create.py +1 -1
  114. wagtail/admin/views/pages/edit.py +2 -2
  115. wagtail/admin/views/pages/listing.py +7 -42
  116. wagtail/admin/views/pages/move.py +1 -1
  117. wagtail/admin/views/pages/ordering.py +1 -1
  118. wagtail/admin/viewsets/base.py +1 -1
  119. wagtail/admin/viewsets/model.py +49 -1
  120. wagtail/admin/wagtail_hooks.py +2 -1
  121. wagtail/admin/widgets/slug.py +10 -10
  122. wagtail/api/v2/serializers.py +1 -1
  123. wagtail/api/v2/tests/test_renderer_classes.py +32 -0
  124. wagtail/apps.py +2 -0
  125. wagtail/bin/wagtail.py +1 -1
  126. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +14 -14
  127. wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.mo +0 -0
  128. wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.po +19 -2
  129. wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.mo +0 -0
  130. wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.po +18 -1
  131. wagtail/contrib/frontend_cache/tests.py +4 -2
  132. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +4 -4
  133. wagtail/contrib/redirects/tests/test_tmp_storages.py +20 -0
  134. wagtail/contrib/redirects/tmp_storages.py +1 -1
  135. wagtail/contrib/redirects/views.py +3 -3
  136. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +3 -3
  137. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.mo +0 -0
  138. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.po +43 -3
  139. wagtail/contrib/search_promotions/static/wagtailsearchpromotions/js/query-chooser-modal.js +1 -1
  140. wagtail/contrib/search_promotions/views/settings.py +2 -2
  141. wagtail/contrib/settings/locale/cs/LC_MESSAGES/django.mo +0 -0
  142. wagtail/contrib/settings/locale/cs/LC_MESSAGES/django.po +6 -1
  143. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +1 -1
  144. wagtail/contrib/settings/locale/nl/LC_MESSAGES/django.mo +0 -0
  145. wagtail/contrib/settings/locale/nl/LC_MESSAGES/django.po +6 -2
  146. wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.mo +0 -0
  147. wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.po +6 -1
  148. wagtail/contrib/settings/tests/site_specific/test_admin.py +40 -6
  149. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  150. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +1 -1
  151. wagtail/contrib/styleguide/templates/wagtailstyleguide/base.html +5 -5
  152. wagtail/contrib/table_block/blocks.py +1 -0
  153. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +5 -1
  154. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  155. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
  156. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  157. wagtail/coreutils.py +5 -5
  158. wagtail/documents/forms.py +18 -1
  159. wagtail/documents/locale/en/LC_MESSAGES/django.po +10 -10
  160. wagtail/documents/locale/nl/LC_MESSAGES/django.mo +0 -0
  161. wagtail/documents/locale/nl/LC_MESSAGES/django.po +9 -0
  162. wagtail/documents/locale/ru/LC_MESSAGES/django.mo +0 -0
  163. wagtail/documents/locale/ru/LC_MESSAGES/django.po +9 -0
  164. wagtail/documents/models.py +1 -1
  165. wagtail/documents/static/wagtaildocs/js/add-multiple.js +1 -1
  166. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  167. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  168. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  169. wagtail/documents/templates/wagtaildocs/documents/add.html +0 -34
  170. wagtail/documents/tests/test_admin_views.py +132 -26
  171. wagtail/documents/tests/test_collection_privacy.py +18 -4
  172. wagtail/documents/tests/test_form_overrides.py +1 -1
  173. wagtail/documents/tests/test_search.py +21 -8
  174. wagtail/documents/views/documents.py +1 -1
  175. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  176. wagtail/embeds/static/wagtailembeds/js/embed-chooser-modal.js +1 -1
  177. wagtail/images/forms.py +16 -1
  178. wagtail/images/locale/cs/LC_MESSAGES/django.mo +0 -0
  179. wagtail/images/locale/cs/LC_MESSAGES/django.po +12 -1
  180. wagtail/images/locale/en/LC_MESSAGES/django.po +57 -46
  181. wagtail/images/locale/nl/LC_MESSAGES/django.mo +0 -0
  182. wagtail/images/locale/nl/LC_MESSAGES/django.po +37 -14
  183. wagtail/images/locale/ru/LC_MESSAGES/django.mo +0 -0
  184. wagtail/images/locale/ru/LC_MESSAGES/django.po +20 -1
  185. wagtail/images/models.py +1 -1
  186. wagtail/images/static/wagtailimages/js/add-multiple.js +1 -1
  187. wagtail/images/static/wagtailimages/js/focal-point-chooser.js +1 -1
  188. wagtail/images/static/wagtailimages/js/image-block.js +1 -1
  189. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  190. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  191. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  192. wagtail/images/static/wagtailimages/js/image-url-generator.js +1 -1
  193. wagtail/images/static/wagtailimages/js/vendor/jquery.Jcrop.min.js +1 -1
  194. wagtail/images/static/wagtailimages/js/vendor/jquery.fileupload-image.js +1 -1
  195. wagtail/images/static/wagtailimages/js/vendor/jquery.fileupload-validate.js +1 -1
  196. wagtail/images/static/wagtailimages/js/vendor/load-image.min.js +1 -1
  197. wagtail/images/templates/wagtailimages/chooser/chooser.html +22 -13
  198. wagtail/images/templates/wagtailimages/chooser/image_preview_column_cell.html +10 -0
  199. wagtail/images/templates/wagtailimages/chooser/results.html +24 -20
  200. wagtail/images/templates/wagtailimages/chooser/title_column_cell.html +15 -0
  201. wagtail/images/templates/wagtailimages/images/add.html +0 -34
  202. wagtail/images/templates/wagtailimages/images/index.html +3 -3
  203. wagtail/images/templates/wagtailimages/images/index_results.html +1 -1
  204. wagtail/images/templates/wagtailimages/images/layout_toggle_button.html +8 -7
  205. wagtail/images/templatetags/wagtailimages_tags.py +2 -2
  206. wagtail/images/tests/test_admin_views.py +87 -0
  207. wagtail/images/tests/test_form_overrides.py +1 -1
  208. wagtail/images/tests/test_models.py +48 -9
  209. wagtail/images/views/chooser.py +66 -2
  210. wagtail/locale/en/LC_MESSAGES/django.po +55 -55
  211. wagtail/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  212. wagtail/locale/is_IS/LC_MESSAGES/django.po +3 -3
  213. wagtail/locale/nl/LC_MESSAGES/django.mo +0 -0
  214. wagtail/locale/nl/LC_MESSAGES/django.po +11 -2
  215. wagtail/locale/ru/LC_MESSAGES/django.mo +0 -0
  216. wagtail/locale/ru/LC_MESSAGES/django.po +11 -1
  217. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  218. wagtail/locales/locale/nl/LC_MESSAGES/django.mo +0 -0
  219. wagtail/locales/locale/nl/LC_MESSAGES/django.po +12 -1
  220. wagtail/locales/locale/ru/LC_MESSAGES/django.mo +0 -0
  221. wagtail/locales/locale/ru/LC_MESSAGES/django.po +10 -1
  222. wagtail/locales/views.py +2 -2
  223. wagtail/models/orderable.py +10 -0
  224. wagtail/models/pages.py +9 -11
  225. wagtail/models/sites.py +1 -1
  226. wagtail/models/workflows.py +8 -5
  227. wagtail/project_template/home/tests.py +6 -7
  228. wagtail/project_template/project_name/settings/base.py +9 -9
  229. wagtail/project_template/requirements.txt +1 -1
  230. wagtail/query.py +7 -2
  231. wagtail/rich_text/rewriters.py +1 -1
  232. wagtail/search/apps.py +4 -49
  233. wagtail/search/backends/__init__.py +1 -113
  234. wagtail/search/backends/base.py +1 -547
  235. wagtail/search/backends/database/__init__.py +1 -50
  236. wagtail/search/backends/database/fallback.py +1 -253
  237. wagtail/search/backends/database/mysql/mysql.py +1 -700
  238. wagtail/search/backends/database/mysql/query.py +1 -258
  239. wagtail/search/backends/database/postgres/postgres.py +1 -749
  240. wagtail/search/backends/database/postgres/query.py +1 -83
  241. wagtail/search/backends/database/postgres/weights.py +1 -63
  242. wagtail/search/backends/database/sqlite/query.py +1 -294
  243. wagtail/search/backends/database/sqlite/sqlite.py +1 -719
  244. wagtail/search/backends/database/sqlite/utils.py +1 -35
  245. wagtail/search/backends/deprecation.py +45 -0
  246. wagtail/search/backends/elasticsearch7.py +18 -1260
  247. wagtail/search/backends/elasticsearch8.py +21 -96
  248. wagtail/search/backends/elasticsearch9.py +35 -0
  249. wagtail/search/backends/opensearch2.py +35 -0
  250. wagtail/search/backends/opensearch3.py +35 -0
  251. wagtail/search/index.py +1 -358
  252. wagtail/search/locale/en/LC_MESSAGES/django.po +2 -10
  253. wagtail/search/management/commands/update_index.py +1 -205
  254. wagtail/search/management/commands/wagtail_update_index.py +1 -4
  255. wagtail/search/models.py +32 -158
  256. wagtail/search/query.py +1 -114
  257. wagtail/search/queryset.py +1 -43
  258. wagtail/search/signal_handlers.py +1 -24
  259. wagtail/search/tasks.py +1 -10
  260. wagtail/search/tests/test_elasticsearch.py +22 -0
  261. wagtail/search/utils.py +1 -206
  262. wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
  263. wagtail/snippets/locale/en/LC_MESSAGES/django.po +3 -3
  264. wagtail/snippets/locale/ru/LC_MESSAGES/django.mo +0 -0
  265. wagtail/snippets/locale/ru/LC_MESSAGES/django.po +8 -1
  266. wagtail/snippets/locale/tr/LC_MESSAGES/django.mo +0 -0
  267. wagtail/snippets/locale/tr/LC_MESSAGES/django.po +8 -1
  268. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  269. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  270. wagtail/snippets/tests/test_reordering.py +319 -0
  271. wagtail/snippets/tests/test_snippets.py +65 -12
  272. wagtail/snippets/views/snippets.py +16 -0
  273. wagtail/test/numberformat.py +30 -0
  274. wagtail/test/settings.py +35 -12
  275. wagtail/test/testapp/fields.py +12 -0
  276. wagtail/test/testapp/migrations/0056_commentablejsonpage.py +50 -0
  277. wagtail/test/testapp/migrations/0057_featurecompletetoy_sort_order.py +23 -0
  278. wagtail/test/testapp/migrations/0058_customlocktask.py +31 -0
  279. wagtail/test/testapp/models.py +27 -0
  280. wagtail/test/testapp/views.py +3 -1
  281. wagtail/test/utils/page_tests.py +17 -17
  282. wagtail/test/utils/template_tests.py +4 -6
  283. wagtail/test/utils/wagtail_tests.py +1 -2
  284. wagtail/tests/test_page_model.py +15 -0
  285. wagtail/{search/tests → tests}/test_page_search.py +29 -2
  286. wagtail/tests/test_search_fields.py +69 -0
  287. wagtail/tests/test_tests.py +62 -6
  288. wagtail/tests/test_workflow.py +25 -1
  289. wagtail/users/locale/cs/LC_MESSAGES/django.mo +0 -0
  290. wagtail/users/locale/cs/LC_MESSAGES/django.po +3 -0
  291. wagtail/users/locale/en/LC_MESSAGES/django.po +2 -2
  292. wagtail/users/locale/nl/LC_MESSAGES/django.mo +0 -0
  293. wagtail/users/locale/nl/LC_MESSAGES/django.po +6 -3
  294. wagtail/users/locale/ru/LC_MESSAGES/django.mo +0 -0
  295. wagtail/users/locale/ru/LC_MESSAGES/django.po +5 -1
  296. wagtail/users/locale/tr/LC_MESSAGES/django.mo +0 -0
  297. wagtail/users/locale/tr/LC_MESSAGES/django.po +78 -4
  298. wagtail/users/templates/wagtailusers/users/create.html +2 -0
  299. wagtail/users/templates/wagtailusers/users/edit.html +2 -0
  300. wagtail/users/tests/test_admin_views.py +4 -0
  301. wagtail/users/views/users.py +1 -1
  302. {wagtail-7.1.2.dist-info → wagtail-7.2rc1.dist-info}/METADATA +7 -6
  303. {wagtail-7.1.2.dist-info → wagtail-7.2rc1.dist-info}/RECORD +309 -315
  304. wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +0 -13
  305. wagtail/admin/templates/wagtailadmin/page_privacy/set_privacy.html +0 -13
  306. wagtail/search/tests/__init__.py +0 -0
  307. wagtail/search/tests/elasticsearch_common_tests.py +0 -251
  308. wagtail/search/tests/test_backends.py +0 -1215
  309. wagtail/search/tests/test_db_backend.py +0 -62
  310. wagtail/search/tests/test_elasticsearch7_backend.py +0 -1452
  311. wagtail/search/tests/test_elasticsearch8_backend.py +0 -15
  312. wagtail/search/tests/test_index_functions.py +0 -256
  313. wagtail/search/tests/test_indexed_class.py +0 -157
  314. wagtail/search/tests/test_mysql_backend.py +0 -192
  315. wagtail/search/tests/test_postgres_backend.py +0 -210
  316. wagtail/search/tests/test_queries.py +0 -332
  317. wagtail/search/tests/test_related_fields.py +0 -102
  318. wagtail/search/tests/test_sqlite_backend.py +0 -52
  319. wagtail/test/search/__init__.py +0 -0
  320. wagtail/test/search/apps.py +0 -9
  321. wagtail/test/search/fixtures/search.json +0 -545
  322. wagtail/test/search/migrations/0001_initial.py +0 -146
  323. wagtail/test/search/migrations/0002_bookunindexed.py +0 -43
  324. wagtail/test/search/migrations/0003_book_summary.py +0 -18
  325. wagtail/test/search/migrations/__init__.py +0 -0
  326. wagtail/test/search/models.py +0 -137
  327. /wagtail/admin/templates/wagtailadmin/{pages/listing/_ordering_cell.html → tables/ordering_cell.html} +0 -0
  328. /wagtail/{search/checks.py → checks.py} +0 -0
  329. {wagtail-7.1.2.dist-info → wagtail-7.2rc1.dist-info}/WHEEL +0 -0
  330. {wagtail-7.1.2.dist-info → wagtail-7.2rc1.dist-info}/entry_points.txt +0 -0
  331. {wagtail-7.1.2.dist-info → wagtail-7.2rc1.dist-info}/licenses/LICENSE +0 -0
  332. {wagtail-7.1.2.dist-info → wagtail-7.2rc1.dist-info}/top_level.txt +0 -0
@@ -301,6 +301,96 @@ class TestDocumentIndexView(WagtailTestUtils, TestCase):
301
301
  "?p=3&tag=even" in response_body or "?tag=even&p=3" in response_body
302
302
  )
303
303
 
304
+ def test_usage_count_column(self):
305
+ used_document = models.Document.objects.create(title="Used document")
306
+ unused_document = models.Document.objects.create(title="Unused document")
307
+ with self.captureOnCommitCallbacks(execute=True):
308
+ VariousOnDeleteModel.objects.create(protected_document=used_document)
309
+
310
+ response = self.client.get(reverse("wagtaildocs:index"))
311
+ self.assertEqual(response.status_code, 200)
312
+ soup = self.get_soup(response.content)
313
+
314
+ expected_url = reverse(
315
+ "wagtaildocs:document_usage",
316
+ args=(used_document.pk,),
317
+ )
318
+ link = soup.select_one(f"a[href='{expected_url}']")
319
+ self.assertIsNotNone(link)
320
+ self.assertEqual(link.text.strip(), "Used 1 time")
321
+
322
+ expected_url = reverse(
323
+ "wagtaildocs:document_usage",
324
+ args=(unused_document.pk,),
325
+ )
326
+ link = soup.select_one(f"a[href='{expected_url}']")
327
+ self.assertIsNotNone(link)
328
+ self.assertEqual(link.text.strip(), "Used 0 times")
329
+
330
+ def test_order_by_usage_count(self):
331
+ doc1 = models.Document.objects.create(title="Used twice document")
332
+ doc2 = models.Document.objects.create(title="Used once document")
333
+ with self.captureOnCommitCallbacks(execute=True):
334
+ VariousOnDeleteModel.objects.create(protected_document=doc1)
335
+ VariousOnDeleteModel.objects.create(protected_document=doc1)
336
+ VariousOnDeleteModel.objects.create(protected_document=doc2)
337
+
338
+ cases = {
339
+ "usage_count": [doc2, doc1],
340
+ "-usage_count": [doc1, doc2],
341
+ }
342
+ for ordering, expected_order in cases.items():
343
+ with self.subTest(ordering=ordering):
344
+ response = self.client.get(
345
+ reverse("wagtaildocs:index"),
346
+ {"ordering": ordering},
347
+ )
348
+ self.assertEqual(response.status_code, 200)
349
+ context = response.context
350
+ self.assertSequenceEqual(
351
+ context["page_obj"].object_list,
352
+ expected_order,
353
+ )
354
+
355
+ def test_filter_by_usage_count(self):
356
+ doc1 = models.Document.objects.create(title="Used twice document")
357
+ doc2 = models.Document.objects.create(title="Used once document")
358
+ doc3 = models.Document.objects.create(title="Unused document")
359
+ with self.captureOnCommitCallbacks(execute=True):
360
+ VariousOnDeleteModel.objects.create(protected_document=doc1)
361
+ VariousOnDeleteModel.objects.create(protected_document=doc1)
362
+ VariousOnDeleteModel.objects.create(protected_document=doc2)
363
+
364
+ response = self.client.get(
365
+ reverse("wagtaildocs:index"),
366
+ {"usage_count_min": "1"},
367
+ )
368
+ self.assertEqual(response.status_code, 200)
369
+ self.assertCountEqual(
370
+ response.context["page_obj"].object_list,
371
+ [doc1, doc2],
372
+ )
373
+
374
+ response = self.client.get(
375
+ reverse("wagtaildocs:index"),
376
+ {"usage_count_min": "1", "usage_count_max": "1"},
377
+ )
378
+ self.assertEqual(response.status_code, 200)
379
+ self.assertCountEqual(
380
+ response.context["page_obj"].object_list,
381
+ [doc2],
382
+ )
383
+
384
+ response = self.client.get(
385
+ reverse("wagtaildocs:index"),
386
+ {"usage_count_max": "0"},
387
+ )
388
+ self.assertEqual(response.status_code, 200)
389
+ self.assertCountEqual(
390
+ response.context["page_obj"].object_list,
391
+ [doc3],
392
+ )
393
+
304
394
 
305
395
  class TestDocumentIndexViewSearch(WagtailTestUtils, TransactionTestCase):
306
396
  def setUp(self):
@@ -469,6 +559,25 @@ class TestDocumentAddView(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
469
559
  response.content,
470
560
  )
471
561
 
562
+ soup = self.get_soup(response.content)
563
+ form = soup.select_one("main form")
564
+ self.assertIsNotNone(form)
565
+ title_input = form.select_one('input[type="text"][name="title"]')
566
+ self.assertIsNotNone(title_input)
567
+ self.assertEqual(title_input.get("id"), "id_title")
568
+ file_input = form.select_one('input[type="file"][name="file"]')
569
+ self.assertIsNotNone(file_input)
570
+ expected_attributes = {
571
+ "data-controller": "w-sync",
572
+ "data-action": "change->w-sync#apply",
573
+ "data-w-sync-bubbles-param": "true",
574
+ "data-w-sync-name-value": "wagtail:documents-upload",
575
+ "data-w-sync-normalize-value": "true",
576
+ "data-w-sync-target-value": "#id_title",
577
+ }
578
+ for attr, expected_value in expected_attributes.items():
579
+ self.assertEqual(file_input.get(attr), expected_value)
580
+
472
581
  def test_get_with_collections(self):
473
582
  root_collection = Collection.get_first_root_node()
474
583
  root_collection.add_child(name="Evil plans")
@@ -1791,6 +1900,29 @@ class TestDocumentChooserView(WagtailTestUtils, TestCase):
1791
1900
  # draftail should NOT be a standard JS include on this page
1792
1901
  self.assertNotIn("wagtailadmin/js/draftail.js", response_json["html"])
1793
1902
 
1903
+ soup = self.get_soup(response_json["html"])
1904
+ form = soup.select_one("form[data-chooser-modal-creation-form]")
1905
+ self.assertIsNotNone(form)
1906
+ title_input = form.select_one(
1907
+ 'input[type="text"][name="document-chooser-upload-title"]'
1908
+ )
1909
+ self.assertIsNotNone(title_input)
1910
+ self.assertEqual(title_input.get("id"), "id_document-chooser-upload-title")
1911
+ file_input = form.select_one(
1912
+ 'input[type="file"][name="document-chooser-upload-file"]'
1913
+ )
1914
+ self.assertIsNotNone(file_input)
1915
+ expected_attributes = {
1916
+ "data-controller": "w-sync",
1917
+ "data-action": "change->w-sync#apply",
1918
+ "data-w-sync-bubbles-param": "true",
1919
+ "data-w-sync-name-value": "wagtail:documents-upload",
1920
+ "data-w-sync-normalize-value": "true",
1921
+ "data-w-sync-target-value": "#id_document-chooser-upload-title",
1922
+ }
1923
+ for attr, expected_value in expected_attributes.items():
1924
+ self.assertEqual(file_input.get(attr), expected_value)
1925
+
1794
1926
  def test_simple_with_collection_nesting(self):
1795
1927
  root_collection = Collection.get_first_root_node()
1796
1928
  evil_plans = root_collection.add_child(name="Evil plans")
@@ -2118,32 +2250,6 @@ class TestUsageCount(WagtailTestUtils, TestCase):
2118
2250
  response = self.client.get(reverse("wagtaildocs:edit", args=(1,)))
2119
2251
  self.assertContains(response, "Used 0 times")
2120
2252
 
2121
- def test_usage_count_column_with_document_usage(self):
2122
- with self.captureOnCommitCallbacks(execute=True):
2123
- doc = models.Document.objects.get(id=1)
2124
- page = EventPage.objects.get(id=4)
2125
- event_page_related_link = EventPageRelatedLink()
2126
- event_page_related_link.page = page
2127
- event_page_related_link.link_document = doc
2128
- event_page_related_link.save()
2129
-
2130
- response = self.client.get(reverse("wagtaildocs:index"), {"layout": "list"})
2131
- self.assertEqual(response.status_code, 200)
2132
-
2133
- self.assertContains(response, "Used 1 time")
2134
-
2135
- expected_url = "/admin/documents/usage/1/"
2136
- self.assertContains(response, expected_url)
2137
-
2138
- def test_usage_count_column_no_document_usage(self):
2139
- response = self.client.get(reverse("wagtaildocs:index"), {"layout": "list"})
2140
- self.assertEqual(response.status_code, 200)
2141
-
2142
- self.assertContains(response, "Used 0 times")
2143
-
2144
- expected_url = "/admin/documents/usage/1/"
2145
- self.assertContains(response, expected_url)
2146
-
2147
2253
 
2148
2254
  class TestGetUsage(AdminTemplateTestUtils, WagtailTestUtils, TestCase):
2149
2255
  fixtures = ["test.json"]
@@ -159,10 +159,12 @@ class TestCollectionPrivacyDocument(WagtailTestUtils, TestCase):
159
159
 
160
160
  def test_set_shared_password_with_logged_in_user(self):
161
161
  self.login()
162
- response = self.client.get(
163
- reverse("wagtailadmin_collections:set_privacy", args=(self.collection.id,)),
162
+ url = reverse(
163
+ "wagtailadmin_collections:set_privacy", args=(self.collection.id,)
164
164
  )
165
165
 
166
+ response = self.client.get(url)
167
+
166
168
  input_el = self.get_soup(response.content).select_one("[data-field-input]")
167
169
  self.assertEqual(response.status_code, 200)
168
170
 
@@ -172,14 +174,21 @@ class TestCollectionPrivacyDocument(WagtailTestUtils, TestCase):
172
174
  # check that the option for password is visible
173
175
  self.assertIsNotNone(input_el)
174
176
 
177
+ # check template used & data
178
+ self.assertTemplateUsed(response, "wagtailadmin/shared/set_privacy.html")
179
+ self.assertEqual(response.context["object"], self.collection)
180
+ self.assertEqual(response.context["action_url"], url)
181
+
175
182
  @override_settings(
176
183
  WAGTAILDOCS_PRIVATE_COLLECTION_OPTIONS={"SHARED_PASSWORD": False}
177
184
  )
178
185
  def test_unset_shared_password_with_logged_in_user(self):
179
186
  self.login()
180
- response = self.client.get(
181
- reverse("wagtailadmin_collections:set_privacy", args=(self.collection.id,)),
187
+ url = reverse(
188
+ "wagtailadmin_collections:set_privacy", args=(self.collection.id,)
182
189
  )
190
+
191
+ response = self.client.get(url)
183
192
  self.assertEqual(response.status_code, 200)
184
193
  self.assertNotIn("password", response.context["form"].fields)
185
194
  self.assertFalse(
@@ -187,3 +196,8 @@ class TestCollectionPrivacyDocument(WagtailTestUtils, TestCase):
187
196
  .fields["restriction_type"]
188
197
  .valid_value(CollectionViewRestriction.PASSWORD)
189
198
  )
199
+
200
+ # check template used & data
201
+ self.assertTemplateUsed(response, "wagtailadmin/shared/set_privacy.html")
202
+ self.assertEqual(response.context["object"], self.collection)
203
+ self.assertEqual(response.context["action_url"], url)
@@ -53,7 +53,7 @@ class TestDocumentFormOverride(TestCase):
53
53
  self.assertIn("tags", form.errors)
54
54
  self.assertEqual(
55
55
  form.errors["tags"][0],
56
- "Tag(s) ['{val}'] are over {max_tag_length} characters".format(
56
+ "Tag(s) ['{val}'] are over {max_tag_length} characters.".format(
57
57
  val=long_value,
58
58
  max_tag_length=taggit_models.TagBase._meta.get_field("name").max_length,
59
59
  ),
@@ -1,5 +1,7 @@
1
1
  import unittest
2
+ from io import StringIO
2
3
 
4
+ from django.core import management
3
5
  from django.core.files.base import ContentFile
4
6
  from django.test import TestCase
5
7
  from django.test.utils import override_settings
@@ -25,6 +27,13 @@ class TestIssue613(WagtailTestUtils, TestCase):
25
27
  self.search_backend = self.get_elasticsearch_backend()
26
28
  self.login()
27
29
 
30
+ management.call_command(
31
+ "update_index",
32
+ backend_name="elasticsearch",
33
+ stdout=StringIO(),
34
+ chunk_size=50,
35
+ )
36
+
28
37
  def add_document(self, **params):
29
38
  # Build a fake file
30
39
  fake_file = ContentFile(b"A boring example document")
@@ -77,13 +86,15 @@ class TestIssue613(WagtailTestUtils, TestCase):
77
86
  return doc.first()
78
87
 
79
88
  def test_issue_613_on_add(self):
80
- # Reset the search index
81
- self.search_backend.reset_index()
82
- self.search_backend.add_type(models.Document)
89
+ # Note to future developer troubleshooting this test...
90
+ # This test previously started by calling self.search_backend.reset_index(), but that was evidently redundant because
91
+ # this was broken on Elasticsearch prior to the fix in
92
+ # https://github.com/wagtail/wagtailsearch/commit/53a98169bccc3cef5b234944037f2b3f78efafd4 .
93
+ # If this turns out to be necessary after all, you might want to compare how wagtail.tests.test_page_search.PageSearchTests does it.
83
94
 
84
95
  # Add a document with some tags
85
96
  document = self.add_document(tags="hello")
86
- self.search_backend.refresh_index()
97
+ self.search_backend.refresh_indexes()
87
98
 
88
99
  # Search for it by tag
89
100
  results = self.search_backend.search("hello", models.Document)
@@ -93,13 +104,15 @@ class TestIssue613(WagtailTestUtils, TestCase):
93
104
  self.assertEqual(results[0].id, document.id)
94
105
 
95
106
  def test_issue_613_on_edit(self):
96
- # Reset the search index
97
- self.search_backend.reset_index()
98
- self.search_backend.add_type(models.Document)
107
+ # Note to future developer troubleshooting this test...
108
+ # This test previously started by calling self.search_backend.reset_index(), but that was evidently redundant because
109
+ # this was broken on Elasticsearch prior to the fix in
110
+ # https://github.com/wagtail/wagtailsearch/commit/53a98169bccc3cef5b234944037f2b3f78efafd4 .
111
+ # If this turns out to be necessary after all, you might want to compare how wagtail.tests.test_page_search.PageSearchTests does it.
99
112
 
100
113
  # Add a document with some tags
101
114
  document = self.edit_document(tags="hello")
102
- self.search_backend.refresh_index()
115
+ self.search_backend.refresh_indexes()
103
116
 
104
117
  # Search for it by tag
105
118
  results = self.search_backend.search("hello", models.Document)
@@ -256,7 +256,7 @@ class EditView(generic.EditView):
256
256
  messages.error(
257
257
  self.request,
258
258
  _(
259
- "The file could not be found. Please change the source or delete the document"
259
+ "The file could not be found. Please change the source or delete the document."
260
260
  ),
261
261
  buttons=[messages.button(self.get_delete_url(), _("Delete"))],
262
262
  )
@@ -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: 2025-07-24 16:20+0200\n"
11
+ "POT-Creation-Date: 2025-10-23 16:45+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"
@@ -1 +1 @@
1
- EMBED_CHOOSER_MODAL_ONLOAD_HANDLERS={chooser:function(e,t){$("form.embed-form",e.body).on("submit",(function(){var t=new FormData(this);return $.ajax({url:this.action,data:t,processData:!1,contentType:!1,type:"POST",dataType:"text",success:e.loadResponseText}),!1}))},embed_chosen:function(e,t){e.respond("embedChosen",t.embed_html,t.embed_data),e.close()}};
1
+ EMBED_CHOOSER_MODAL_ONLOAD_HANDLERS={chooser:function(e,t){$("form.embed-form",e.body).on("submit",function(){var t=new FormData(this);return $.ajax({url:this.action,data:t,processData:!1,contentType:!1,type:"POST",dataType:"text",success:e.loadResponseText}),!1})},embed_chosen:function(e,t){e.respond("embedChosen",t.embed_html,t.embed_data),e.close()}};
wagtail/images/forms.py CHANGED
@@ -44,6 +44,12 @@ class BaseImageForm(BaseCollectionMemberForm):
44
44
  def __init__(self, *args, **kwargs):
45
45
  super().__init__(*args, **kwargs)
46
46
  self.original_file = self.instance.file
47
+ # Dynamically set sync value target to the id of the file input rather
48
+ # than hardcoding it
49
+ if "title" in self.fields and "file" in self.fields:
50
+ self.fields["file"].widget.attrs["data-w-sync-target-value"] = (
51
+ f"#{self['title'].id_for_label}"
52
+ )
47
53
 
48
54
  def save(self, commit=True):
49
55
  if "file" in self.changed_data:
@@ -70,7 +76,15 @@ class BaseImageForm(BaseCollectionMemberForm):
70
76
  # a bit pointless here
71
77
  widgets = {
72
78
  "tags": AdminTagWidget,
73
- "file": forms.FileInput(),
79
+ "file": forms.FileInput(
80
+ attrs={
81
+ "data-controller": "w-sync",
82
+ "data-action": "change->w-sync#apply",
83
+ "data-w-sync-bubbles-param": "true",
84
+ "data-w-sync-name-value": "wagtail:images-upload",
85
+ "data-w-sync-normalize-value": "true",
86
+ }
87
+ ),
74
88
  "focal_point_x": forms.HiddenInput(attrs={"class": "focal_point_x"}),
75
89
  "focal_point_y": forms.HiddenInput(attrs={"class": "focal_point_y"}),
76
90
  "focal_point_width": forms.HiddenInput(
@@ -221,6 +235,7 @@ class URLGeneratorForm(forms.Form):
221
235
  closeness = forms.IntegerField(
222
236
  label=_("Closeness"),
223
237
  min_value=0,
238
+ max_value=100,
224
239
  initial=0,
225
240
  widget=forms.NumberInput(
226
241
  attrs={
@@ -8,6 +8,7 @@
8
8
  # IT Management <hudan@itmanagement.cz>, 2020
9
9
  # Jan Feřtek, 2023
10
10
  # Jan Feřtek, 2023
11
+ # Jan Zelený <janzeleny@outlook.com>, 2025
11
12
  # Jiri Stepanek <stepiiicz@gmail.com>, 2015
12
13
  # Marek Turnovec <aesculap@gmail.com>, 2016
13
14
  # Matt Westcott <matthew@torchbox.com>, 2022
@@ -18,7 +19,7 @@ msgstr ""
18
19
  "Report-Msgid-Bugs-To: \n"
19
20
  "POT-Creation-Date: 2025-07-24 16:20+0200\n"
20
21
  "PO-Revision-Date: 2014-02-20 21:05+0000\n"
21
- "Last-Translator: Matt Westcott <matthew@torchbox.com>, 2022\n"
22
+ "Last-Translator: Jan Zelený <janzeleny@outlook.com>, 2025\n"
22
23
  "Language-Team: Czech (http://app.transifex.com/torchbox/wagtail/language/"
23
24
  "cs/)\n"
24
25
  "MIME-Version: 1.0\n"
@@ -221,6 +222,9 @@ msgstr[3] "Přidat %(counter)s obrázků do nové kolekce"
221
222
  msgid "Add images to collection"
222
223
  msgstr "Přidat obrázky do kolekce"
223
224
 
225
+ msgid "Delete images"
226
+ msgstr "Smazat obrázky"
227
+
224
228
  msgid "Yes, delete"
225
229
  msgstr "Ano, smazat"
226
230
 
@@ -239,6 +243,10 @@ msgstr "Nový"
239
243
  msgid "Latest images"
240
244
  msgstr "Poslední obrázky"
241
245
 
246
+ #, python-format
247
+ msgid "Select %(title)s"
248
+ msgstr "Vybrat %(title)s"
249
+
242
250
  msgid "Choose a format"
243
251
  msgstr "Zvolte formát"
244
252
 
@@ -328,6 +336,9 @@ msgstr "Náhled"
328
336
  msgid "URL"
329
337
  msgstr "URL"
330
338
 
339
+ msgid "Copied to clipboard"
340
+ msgstr "Zkopírováno do schránky"
341
+
331
342
  msgid "Add multiple images"
332
343
  msgstr "Přidat více obrázků"
333
344
 
@@ -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: 2025-07-24 16:20+0200\n"
11
+ "POT-Creation-Date: 2025-10-23 16:45+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"
@@ -22,15 +22,15 @@ msgstr ""
22
22
  msgid "Wagtail images"
23
23
  msgstr ""
24
24
 
25
- #: blocks.py:72 blocks.py:83 forms.py:162
25
+ #: blocks.py:72 blocks.py:83 forms.py:176
26
26
  msgid "Image is decorative"
27
27
  msgstr ""
28
28
 
29
- #: blocks.py:74 blocks.py:86 forms.py:164
29
+ #: blocks.py:74 blocks.py:86 forms.py:178
30
30
  msgid "Alt text"
31
31
  msgstr ""
32
32
 
33
- #: blocks.py:196 forms.py:177
33
+ #: blocks.py:196 forms.py:191
34
34
  msgid "Please add some alt text for your image or mark it as decorative"
35
35
  msgstr ""
36
36
 
@@ -88,75 +88,76 @@ msgstr ""
88
88
  msgid "Right-aligned"
89
89
  msgstr ""
90
90
 
91
- #: forms.py:31 views/bulk_actions/add_to_collection.py:13 views/images.py:166
91
+ #: forms.py:31 views/bulk_actions/add_to_collection.py:13 views/chooser.py:175
92
+ #: views/images.py:166
92
93
  msgid "Collection"
93
94
  msgstr ""
94
95
 
95
- #: forms.py:157
96
+ #: forms.py:171
96
97
  msgid "Format"
97
98
  msgstr ""
98
99
 
99
- #: forms.py:185
100
+ #: forms.py:199
100
101
  msgid "Filter"
101
102
  msgstr ""
102
103
 
103
- #: forms.py:187
104
+ #: forms.py:201
104
105
  msgid "Original size"
105
106
  msgstr ""
106
107
 
107
- #: forms.py:188
108
+ #: forms.py:202
108
109
  msgid "Resize to width"
109
110
  msgstr ""
110
111
 
111
- #: forms.py:189
112
+ #: forms.py:203
112
113
  msgid "Resize to height"
113
114
  msgstr ""
114
115
 
115
- #: forms.py:190
116
+ #: forms.py:204
116
117
  msgid "Resize to min"
117
118
  msgstr ""
118
119
 
119
- #: forms.py:191
120
+ #: forms.py:205
120
121
  msgid "Resize to max"
121
122
  msgstr ""
122
123
 
123
- #: forms.py:192
124
+ #: forms.py:206
124
125
  msgid "Resize to fill"
125
126
  msgstr ""
126
127
 
127
- #: forms.py:196
128
+ #: forms.py:210
128
129
  msgid "Width"
129
130
  msgstr ""
130
131
 
131
- #: forms.py:209
132
+ #: forms.py:223
132
133
  msgid "Height"
133
134
  msgstr ""
134
135
 
135
- #: forms.py:222
136
+ #: forms.py:236
136
137
  msgid "Closeness"
137
138
  msgstr ""
138
139
 
139
- #: forms.py:238
140
+ #: forms.py:253
140
141
  msgid "Add"
141
142
  msgstr ""
142
143
 
143
- #: forms.py:238
144
+ #: forms.py:253
144
145
  msgid "Add/edit images you own"
145
146
  msgstr ""
146
147
 
147
- #: forms.py:239
148
+ #: forms.py:254
148
149
  msgid "Edit"
149
150
  msgstr ""
150
151
 
151
- #: forms.py:239
152
+ #: forms.py:254
152
153
  msgid "Edit any image"
153
154
  msgstr ""
154
155
 
155
- #: forms.py:240
156
+ #: forms.py:255
156
157
  msgid "Choose"
157
158
  msgstr ""
158
159
 
159
- #: forms.py:240
160
+ #: forms.py:255
160
161
  msgid "Select images in choosers"
161
162
  msgstr ""
162
163
 
@@ -292,10 +293,14 @@ msgstr ""
292
293
  msgid "No, don't delete"
293
294
  msgstr ""
294
295
 
295
- #: templates/wagtailimages/chooser/chooser.html:12
296
+ #: templates/wagtailimages/chooser/chooser.html:13
296
297
  msgid "Popular tags"
297
298
  msgstr ""
298
299
 
300
+ #: templates/wagtailimages/chooser/chooser.html:21
301
+ msgid "Layout"
302
+ msgstr ""
303
+
299
304
  #: templates/wagtailimages/chooser/confirm_duplicate_upload.html:6
300
305
  msgid ""
301
306
  "Upload successful. However, your new image seems to be a duplicate of an "
@@ -322,20 +327,20 @@ msgstr ""
322
327
  msgid "Latest images"
323
328
  msgstr ""
324
329
 
325
- #: templates/wagtailimages/chooser/results.html:14
330
+ #: templates/wagtailimages/chooser/results.html:17
326
331
  #, python-format
327
332
  msgid "Select %(title)s"
328
333
  msgstr ""
329
334
 
330
- #: templates/wagtailimages/chooser/results.html:32
335
+ #: templates/wagtailimages/chooser/results.html:36
331
336
  msgid "You haven't uploaded any images in this collection."
332
337
  msgstr ""
333
338
 
334
- #: templates/wagtailimages/chooser/results.html:34
339
+ #: templates/wagtailimages/chooser/results.html:38
335
340
  msgid "You haven't uploaded any images."
336
341
  msgstr ""
337
342
 
338
- #: templates/wagtailimages/chooser/results.html:37
343
+ #: templates/wagtailimages/chooser/results.html:41
339
344
  msgid ""
340
345
  "Why not <a class=\"upload-one-now\" href=\"#tab-upload\" data-action=\"w-"
341
346
  "tabs#select:prevent\" data-w-tabs-target=\"trigger\" data-w-tabs-focus-"
@@ -367,13 +372,13 @@ msgstr ""
367
372
  msgid "Add an image"
368
373
  msgstr ""
369
374
 
370
- #: templates/wagtailimages/images/add.html:45 views/chooser.py:53
371
- #: views/chooser.py:320
375
+ #: templates/wagtailimages/images/add.html:11 views/chooser.py:61
376
+ #: views/chooser.py:384
372
377
  msgid "Uploading…"
373
378
  msgstr ""
374
379
 
375
- #: templates/wagtailimages/images/add.html:48 views/chooser.py:52
376
- #: views/chooser.py:319
380
+ #: templates/wagtailimages/images/add.html:14 views/chooser.py:60
381
+ #: views/chooser.py:383
377
382
  msgid "Upload"
378
383
  msgstr ""
379
384
 
@@ -427,7 +432,8 @@ msgstr ""
427
432
  msgid "File not found"
428
433
  msgstr ""
429
434
 
430
- #: templates/wagtailimages/images/edit.html:65 views/images.py:174
435
+ #: templates/wagtailimages/images/edit.html:65 views/chooser.py:182
436
+ #: views/images.py:174
431
437
  msgid "Usage"
432
438
  msgstr ""
433
439
 
@@ -438,7 +444,7 @@ msgid_plural "Used %(usage_count)s times"
438
444
  msgstr[0] ""
439
445
  msgstr[1] ""
440
446
 
441
- #: templates/wagtailimages/images/index.html:14
447
+ #: templates/wagtailimages/images/index.html:11
442
448
  msgid "Sort by"
443
449
  msgstr ""
444
450
 
@@ -465,12 +471,17 @@ msgid ""
465
471
  "href=\"%(wagtailimages_add_image_url)s\">upload one now</a>?"
466
472
  msgstr ""
467
473
 
474
+ #: templates/wagtailimages/images/layout_toggle_button.html:5
475
+ msgid "Grid layout"
476
+ msgstr ""
477
+
468
478
  #: templates/wagtailimages/images/layout_toggle_button.html:9
469
- msgid "Toggle layout"
479
+ msgid "List layout"
470
480
  msgstr ""
471
481
 
472
482
  #: templates/wagtailimages/images/url_generator.html:16
473
- #: templates/wagtailimages/images/url_generator.html:20 views/images.py:154
483
+ #: templates/wagtailimages/images/url_generator.html:20 views/chooser.py:164
484
+ #: views/images.py:154
474
485
  msgid "Preview"
475
486
  msgstr ""
476
487
 
@@ -604,15 +615,23 @@ msgid_plural "%(num_parent_objects)d images have been deleted"
604
615
  msgstr[0] ""
605
616
  msgstr[1] ""
606
617
 
607
- #: views/chooser.py:318 widgets.py:13
618
+ #: views/chooser.py:170 views/images.py:160
619
+ msgid "Title"
620
+ msgstr ""
621
+
622
+ #: views/chooser.py:178 views/images.py:169
623
+ msgid "Created"
624
+ msgstr ""
625
+
626
+ #: views/chooser.py:382 widgets.py:13
608
627
  msgid "Choose an image"
609
628
  msgstr ""
610
629
 
611
- #: views/chooser.py:321
630
+ #: views/chooser.py:385
612
631
  msgid "Choose another image"
613
632
  msgstr ""
614
633
 
615
- #: views/chooser.py:322 widgets.py:15
634
+ #: views/chooser.py:386 widgets.py:15
616
635
  msgid "Edit this image"
617
636
  msgstr ""
618
637
 
@@ -652,14 +671,6 @@ msgstr ""
652
671
  msgid "Images"
653
672
  msgstr ""
654
673
 
655
- #: views/images.py:160
656
- msgid "Title"
657
- msgstr ""
658
-
659
- #: views/images.py:169
660
- msgid "Created"
661
- msgstr ""
662
-
663
674
  #: views/images.py:206
664
675
  msgid "The image could not be saved due to errors."
665
676
  msgstr ""