wagtail 7.1.1__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 (345) 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/generic/form.html +3 -1
  75. wagtail/admin/templates/wagtailadmin/panels/multi_field_panel_child.html +1 -1
  76. wagtail/admin/templates/wagtailadmin/panels/object_list.html +1 -1
  77. wagtail/admin/templates/wagtailadmin/panels/tabbed_interface.html +3 -2
  78. wagtail/admin/templates/wagtailadmin/shared/formatted_field.html +1 -1
  79. wagtail/admin/templates/wagtailadmin/shared/forms/single_checkbox.html +1 -1
  80. wagtail/admin/templates/wagtailadmin/shared/keyboard_shortcuts_dialog.html +19 -0
  81. wagtail/admin/templates/wagtailadmin/shared/panel.html +1 -1
  82. wagtail/admin/templates/wagtailadmin/shared/set_privacy.html +15 -0
  83. wagtail/admin/templates/wagtailadmin/shared/side_panels/checks.html +28 -1
  84. wagtail/admin/templates/wagtailadmin/shared/workflow_history/detail.html +2 -2
  85. wagtail/admin/templates/wagtailadmin/{pages/listing/_ordering_header.html → tables/ordering_header.html} +2 -2
  86. wagtail/admin/templates/wagtailadmin/tables/title_cell.html +1 -1
  87. wagtail/admin/templates/wagtailadmin/userbar/base.html +6 -3
  88. wagtail/admin/templates/wagtailadmin/userbar/item_admin.html +2 -2
  89. wagtail/admin/templates/wagtailadmin/userbar/item_page_add.html +2 -2
  90. wagtail/admin/templates/wagtailadmin/userbar/item_page_edit.html +2 -2
  91. wagtail/admin/templates/wagtailadmin/userbar/item_page_explore.html +2 -2
  92. wagtail/admin/templates/wagtailadmin/widgets/{daterange_input.html → range_input.html} +1 -1
  93. wagtail/admin/templates/wagtailadmin/workflows/task_chooser/chooser.html +4 -2
  94. wagtail/admin/templatetags/wagtailadmin_tags.py +56 -22
  95. wagtail/admin/tests/api/test_pages.py +7 -7
  96. wagtail/admin/tests/api/test_renderer_classes.py +16 -0
  97. wagtail/admin/tests/pages/test_create_page.py +34 -2
  98. wagtail/admin/tests/pages/test_edit_page.py +128 -14
  99. wagtail/admin/tests/pages/test_explorer_view.py +34 -7
  100. wagtail/admin/tests/pages/test_reorder_page.py +11 -0
  101. wagtail/admin/tests/test_collections_views.py +12 -0
  102. wagtail/admin/tests/test_edit_handlers.py +3 -3
  103. wagtail/admin/tests/test_filters.py +2 -2
  104. wagtail/admin/tests/test_keyboard_shortcuts.py +52 -2
  105. wagtail/admin/tests/test_menu.py +0 -2
  106. wagtail/admin/tests/test_privacy.py +16 -16
  107. wagtail/admin/tests/test_templatetags.py +137 -0
  108. wagtail/admin/tests/test_userbar.py +75 -35
  109. wagtail/admin/tests/test_views_generic.py +34 -0
  110. wagtail/admin/tests/test_workflows.py +34 -0
  111. wagtail/admin/tests/viewsets/test_model_viewset.py +322 -0
  112. wagtail/admin/ui/tables/orderable.py +73 -0
  113. wagtail/admin/ui/tables/pages.py +3 -13
  114. wagtail/admin/userbar.py +6 -1
  115. wagtail/admin/views/collection_privacy.py +6 -2
  116. wagtail/admin/views/generic/__init__.py +1 -0
  117. wagtail/admin/views/generic/mixins.py +20 -2
  118. wagtail/admin/views/generic/models.py +67 -1
  119. wagtail/admin/views/generic/ordering.py +79 -0
  120. wagtail/admin/views/home.py +3 -3
  121. wagtail/admin/views/page_privacy.py +5 -2
  122. wagtail/admin/views/pages/create.py +1 -1
  123. wagtail/admin/views/pages/edit.py +2 -2
  124. wagtail/admin/views/pages/listing.py +7 -42
  125. wagtail/admin/views/pages/move.py +1 -1
  126. wagtail/admin/views/pages/ordering.py +1 -1
  127. wagtail/admin/viewsets/base.py +1 -1
  128. wagtail/admin/viewsets/model.py +49 -1
  129. wagtail/admin/wagtail_hooks.py +2 -1
  130. wagtail/admin/widgets/slug.py +10 -10
  131. wagtail/api/v2/serializers.py +1 -1
  132. wagtail/api/v2/tests/test_renderer_classes.py +32 -0
  133. wagtail/apps.py +2 -0
  134. wagtail/bin/wagtail.py +1 -1
  135. wagtail/blocks/struct_block.py +2 -1
  136. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +14 -14
  137. wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.mo +0 -0
  138. wagtail/contrib/forms/locale/nl/LC_MESSAGES/django.po +19 -2
  139. wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.mo +0 -0
  140. wagtail/contrib/forms/locale/ru/LC_MESSAGES/django.po +18 -1
  141. wagtail/contrib/frontend_cache/tests.py +4 -2
  142. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +4 -4
  143. wagtail/contrib/redirects/tests/test_tmp_storages.py +20 -0
  144. wagtail/contrib/redirects/tmp_storages.py +1 -1
  145. wagtail/contrib/redirects/views.py +3 -3
  146. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +3 -3
  147. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.mo +0 -0
  148. wagtail/contrib/search_promotions/locale/tr/LC_MESSAGES/django.po +43 -3
  149. wagtail/contrib/search_promotions/static/wagtailsearchpromotions/js/query-chooser-modal.js +1 -1
  150. wagtail/contrib/search_promotions/views/settings.py +2 -2
  151. wagtail/contrib/settings/locale/cs/LC_MESSAGES/django.mo +0 -0
  152. wagtail/contrib/settings/locale/cs/LC_MESSAGES/django.po +6 -1
  153. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +1 -1
  154. wagtail/contrib/settings/locale/nl/LC_MESSAGES/django.mo +0 -0
  155. wagtail/contrib/settings/locale/nl/LC_MESSAGES/django.po +6 -2
  156. wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.mo +0 -0
  157. wagtail/contrib/settings/locale/ru/LC_MESSAGES/django.po +6 -1
  158. wagtail/contrib/settings/tests/site_specific/test_admin.py +40 -6
  159. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +1 -1
  160. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +1 -1
  161. wagtail/contrib/styleguide/templates/wagtailstyleguide/base.html +5 -5
  162. wagtail/contrib/table_block/blocks.py +1 -0
  163. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +5 -1
  164. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  165. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +1 -1
  166. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  167. wagtail/coreutils.py +5 -5
  168. wagtail/documents/forms.py +18 -1
  169. wagtail/documents/locale/en/LC_MESSAGES/django.po +10 -10
  170. wagtail/documents/locale/nl/LC_MESSAGES/django.mo +0 -0
  171. wagtail/documents/locale/nl/LC_MESSAGES/django.po +9 -0
  172. wagtail/documents/locale/ru/LC_MESSAGES/django.mo +0 -0
  173. wagtail/documents/locale/ru/LC_MESSAGES/django.po +9 -0
  174. wagtail/documents/models.py +1 -1
  175. wagtail/documents/static/wagtaildocs/js/add-multiple.js +1 -1
  176. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  177. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  178. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  179. wagtail/documents/templates/wagtaildocs/documents/add.html +0 -34
  180. wagtail/documents/tests/test_admin_views.py +132 -26
  181. wagtail/documents/tests/test_collection_privacy.py +18 -4
  182. wagtail/documents/tests/test_form_overrides.py +1 -1
  183. wagtail/documents/tests/test_search.py +21 -8
  184. wagtail/documents/views/documents.py +1 -1
  185. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  186. wagtail/embeds/static/wagtailembeds/js/embed-chooser-modal.js +1 -1
  187. wagtail/images/forms.py +16 -1
  188. wagtail/images/locale/cs/LC_MESSAGES/django.mo +0 -0
  189. wagtail/images/locale/cs/LC_MESSAGES/django.po +12 -1
  190. wagtail/images/locale/en/LC_MESSAGES/django.po +57 -46
  191. wagtail/images/locale/nl/LC_MESSAGES/django.mo +0 -0
  192. wagtail/images/locale/nl/LC_MESSAGES/django.po +37 -14
  193. wagtail/images/locale/ru/LC_MESSAGES/django.mo +0 -0
  194. wagtail/images/locale/ru/LC_MESSAGES/django.po +20 -1
  195. wagtail/images/models.py +1 -1
  196. wagtail/images/static/wagtailimages/js/add-multiple.js +1 -1
  197. wagtail/images/static/wagtailimages/js/focal-point-chooser.js +1 -1
  198. wagtail/images/static/wagtailimages/js/image-block.js +1 -1
  199. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  200. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  201. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  202. wagtail/images/static/wagtailimages/js/image-url-generator.js +1 -1
  203. wagtail/images/static/wagtailimages/js/vendor/jquery.Jcrop.min.js +1 -1
  204. wagtail/images/static/wagtailimages/js/vendor/jquery.fileupload-image.js +1 -1
  205. wagtail/images/static/wagtailimages/js/vendor/jquery.fileupload-validate.js +1 -1
  206. wagtail/images/static/wagtailimages/js/vendor/load-image.min.js +1 -1
  207. wagtail/images/templates/wagtailimages/chooser/chooser.html +22 -13
  208. wagtail/images/templates/wagtailimages/chooser/image_preview_column_cell.html +10 -0
  209. wagtail/images/templates/wagtailimages/chooser/results.html +24 -20
  210. wagtail/images/templates/wagtailimages/chooser/title_column_cell.html +15 -0
  211. wagtail/images/templates/wagtailimages/images/add.html +0 -34
  212. wagtail/images/templates/wagtailimages/images/index.html +3 -3
  213. wagtail/images/templates/wagtailimages/images/index_results.html +1 -1
  214. wagtail/images/templates/wagtailimages/images/layout_toggle_button.html +8 -7
  215. wagtail/images/templatetags/wagtailimages_tags.py +2 -2
  216. wagtail/images/tests/test_admin_views.py +87 -0
  217. wagtail/images/tests/test_form_overrides.py +1 -1
  218. wagtail/images/tests/test_models.py +48 -9
  219. wagtail/images/views/chooser.py +66 -2
  220. wagtail/locale/en/LC_MESSAGES/django.po +55 -55
  221. wagtail/locale/is_IS/LC_MESSAGES/django.mo +0 -0
  222. wagtail/locale/is_IS/LC_MESSAGES/django.po +3 -3
  223. wagtail/locale/nl/LC_MESSAGES/django.mo +0 -0
  224. wagtail/locale/nl/LC_MESSAGES/django.po +11 -2
  225. wagtail/locale/ru/LC_MESSAGES/django.mo +0 -0
  226. wagtail/locale/ru/LC_MESSAGES/django.po +11 -1
  227. wagtail/locales/locale/en/LC_MESSAGES/django.po +1 -1
  228. wagtail/locales/locale/nl/LC_MESSAGES/django.mo +0 -0
  229. wagtail/locales/locale/nl/LC_MESSAGES/django.po +12 -1
  230. wagtail/locales/locale/ru/LC_MESSAGES/django.mo +0 -0
  231. wagtail/locales/locale/ru/LC_MESSAGES/django.po +10 -1
  232. wagtail/locales/views.py +2 -2
  233. wagtail/models/orderable.py +10 -0
  234. wagtail/models/pages.py +9 -11
  235. wagtail/models/sites.py +1 -1
  236. wagtail/models/workflows.py +8 -5
  237. wagtail/project_template/home/tests.py +6 -7
  238. wagtail/project_template/project_name/settings/base.py +9 -9
  239. wagtail/project_template/requirements.txt +1 -1
  240. wagtail/query.py +7 -2
  241. wagtail/rich_text/rewriters.py +1 -1
  242. wagtail/search/apps.py +4 -49
  243. wagtail/search/backends/__init__.py +1 -113
  244. wagtail/search/backends/base.py +1 -547
  245. wagtail/search/backends/database/__init__.py +1 -50
  246. wagtail/search/backends/database/fallback.py +1 -253
  247. wagtail/search/backends/database/mysql/mysql.py +1 -700
  248. wagtail/search/backends/database/mysql/query.py +1 -258
  249. wagtail/search/backends/database/postgres/postgres.py +1 -749
  250. wagtail/search/backends/database/postgres/query.py +1 -83
  251. wagtail/search/backends/database/postgres/weights.py +1 -63
  252. wagtail/search/backends/database/sqlite/query.py +1 -294
  253. wagtail/search/backends/database/sqlite/sqlite.py +1 -719
  254. wagtail/search/backends/database/sqlite/utils.py +1 -35
  255. wagtail/search/backends/deprecation.py +45 -0
  256. wagtail/search/backends/elasticsearch7.py +18 -1260
  257. wagtail/search/backends/elasticsearch8.py +21 -96
  258. wagtail/search/backends/elasticsearch9.py +35 -0
  259. wagtail/search/backends/opensearch2.py +35 -0
  260. wagtail/search/backends/opensearch3.py +35 -0
  261. wagtail/search/index.py +1 -358
  262. wagtail/search/locale/en/LC_MESSAGES/django.po +2 -10
  263. wagtail/search/management/commands/update_index.py +1 -205
  264. wagtail/search/management/commands/wagtail_update_index.py +1 -4
  265. wagtail/search/models.py +32 -158
  266. wagtail/search/query.py +1 -114
  267. wagtail/search/queryset.py +1 -43
  268. wagtail/search/signal_handlers.py +1 -24
  269. wagtail/search/tasks.py +1 -10
  270. wagtail/search/tests/test_elasticsearch.py +22 -0
  271. wagtail/search/utils.py +1 -206
  272. wagtail/sites/locale/en/LC_MESSAGES/django.po +1 -1
  273. wagtail/snippets/locale/en/LC_MESSAGES/django.po +3 -3
  274. wagtail/snippets/locale/ru/LC_MESSAGES/django.mo +0 -0
  275. wagtail/snippets/locale/ru/LC_MESSAGES/django.po +8 -1
  276. wagtail/snippets/locale/tr/LC_MESSAGES/django.mo +0 -0
  277. wagtail/snippets/locale/tr/LC_MESSAGES/django.po +8 -1
  278. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  279. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  280. wagtail/snippets/tests/test_preview.py +5 -6
  281. wagtail/snippets/tests/test_reordering.py +319 -0
  282. wagtail/snippets/tests/test_snippets.py +65 -12
  283. wagtail/snippets/views/snippets.py +16 -0
  284. wagtail/test/numberformat.py +30 -0
  285. wagtail/test/settings.py +35 -12
  286. wagtail/test/testapp/fields.py +12 -0
  287. wagtail/test/testapp/migrations/0056_commentablejsonpage.py +50 -0
  288. wagtail/test/testapp/migrations/0057_featurecompletetoy_sort_order.py +23 -0
  289. wagtail/test/testapp/migrations/0058_customlocktask.py +31 -0
  290. wagtail/test/testapp/models.py +27 -0
  291. wagtail/test/testapp/urls.py +1 -0
  292. wagtail/test/testapp/views.py +18 -2
  293. wagtail/test/utils/page_tests.py +17 -17
  294. wagtail/test/utils/template_tests.py +4 -6
  295. wagtail/test/utils/wagtail_tests.py +1 -2
  296. wagtail/tests/test_blocks.py +15 -0
  297. wagtail/tests/test_page_model.py +15 -0
  298. wagtail/{search/tests → tests}/test_page_search.py +29 -2
  299. wagtail/tests/test_search_fields.py +69 -0
  300. wagtail/tests/test_tests.py +62 -6
  301. wagtail/tests/test_workflow.py +25 -1
  302. wagtail/users/locale/cs/LC_MESSAGES/django.mo +0 -0
  303. wagtail/users/locale/cs/LC_MESSAGES/django.po +3 -0
  304. wagtail/users/locale/en/LC_MESSAGES/django.po +2 -2
  305. wagtail/users/locale/nl/LC_MESSAGES/django.mo +0 -0
  306. wagtail/users/locale/nl/LC_MESSAGES/django.po +6 -3
  307. wagtail/users/locale/ru/LC_MESSAGES/django.mo +0 -0
  308. wagtail/users/locale/ru/LC_MESSAGES/django.po +5 -1
  309. wagtail/users/locale/tr/LC_MESSAGES/django.mo +0 -0
  310. wagtail/users/locale/tr/LC_MESSAGES/django.po +78 -4
  311. wagtail/users/templates/wagtailusers/users/create.html +2 -0
  312. wagtail/users/templates/wagtailusers/users/edit.html +2 -0
  313. wagtail/users/tests/test_admin_views.py +4 -0
  314. wagtail/users/views/users.py +1 -1
  315. {wagtail-7.1.1.dist-info → wagtail-7.2rc1.dist-info}/METADATA +7 -6
  316. {wagtail-7.1.1.dist-info → wagtail-7.2rc1.dist-info}/RECORD +322 -328
  317. wagtail/admin/templates/wagtailadmin/collection_privacy/set_privacy.html +0 -13
  318. wagtail/admin/templates/wagtailadmin/page_privacy/set_privacy.html +0 -13
  319. wagtail/search/tests/__init__.py +0 -0
  320. wagtail/search/tests/elasticsearch_common_tests.py +0 -251
  321. wagtail/search/tests/test_backends.py +0 -1215
  322. wagtail/search/tests/test_db_backend.py +0 -62
  323. wagtail/search/tests/test_elasticsearch7_backend.py +0 -1452
  324. wagtail/search/tests/test_elasticsearch8_backend.py +0 -15
  325. wagtail/search/tests/test_index_functions.py +0 -256
  326. wagtail/search/tests/test_indexed_class.py +0 -157
  327. wagtail/search/tests/test_mysql_backend.py +0 -192
  328. wagtail/search/tests/test_postgres_backend.py +0 -210
  329. wagtail/search/tests/test_queries.py +0 -332
  330. wagtail/search/tests/test_related_fields.py +0 -102
  331. wagtail/search/tests/test_sqlite_backend.py +0 -52
  332. wagtail/test/search/__init__.py +0 -0
  333. wagtail/test/search/apps.py +0 -9
  334. wagtail/test/search/fixtures/search.json +0 -545
  335. wagtail/test/search/migrations/0001_initial.py +0 -146
  336. wagtail/test/search/migrations/0002_bookunindexed.py +0 -43
  337. wagtail/test/search/migrations/0003_book_summary.py +0 -18
  338. wagtail/test/search/migrations/__init__.py +0 -0
  339. wagtail/test/search/models.py +0 -137
  340. /wagtail/admin/templates/wagtailadmin/{pages/listing/_ordering_cell.html → tables/ordering_cell.html} +0 -0
  341. /wagtail/{search/checks.py → checks.py} +0 -0
  342. {wagtail-7.1.1.dist-info → wagtail-7.2rc1.dist-info}/WHEEL +0 -0
  343. {wagtail-7.1.1.dist-info → wagtail-7.2rc1.dist-info}/entry_points.txt +0 -0
  344. {wagtail-7.1.1.dist-info → wagtail-7.2rc1.dist-info}/licenses/LICENSE +0 -0
  345. {wagtail-7.1.1.dist-info → wagtail-7.2rc1.dist-info}/top_level.txt +0 -0
@@ -1,15 +0,0 @@
1
- import unittest
2
-
3
- from django.test import TestCase
4
-
5
- from .elasticsearch_common_tests import ElasticsearchCommonSearchBackendTests
6
-
7
- try:
8
- from elasticsearch import VERSION as ELASTICSEARCH_VERSION
9
- except ImportError:
10
- ELASTICSEARCH_VERSION = (0, 0, 0)
11
-
12
-
13
- @unittest.skipIf(ELASTICSEARCH_VERSION[0] != 8, "Elasticsearch 8 required")
14
- class TestElasticsearch8SearchBackend(ElasticsearchCommonSearchBackendTests, TestCase):
15
- backend_path = "wagtail.search.backends.elasticsearch8"
@@ -1,256 +0,0 @@
1
- from datetime import date
2
- from unittest import mock
3
-
4
- from django.test import TestCase, override_settings
5
-
6
- from wagtail.models import Page
7
- from wagtail.search import index
8
- from wagtail.test.search import models
9
- from wagtail.test.testapp.models import AdvertWithCustomUUIDPrimaryKey, SimplePage
10
- from wagtail.test.utils import WagtailTestUtils
11
-
12
-
13
- class TestGetIndexedInstance(TestCase):
14
- fixtures = ["search"]
15
-
16
- def test_gets_instance(self):
17
- obj = models.Author.objects.get(id=1)
18
-
19
- # Should just return the object
20
- indexed_instance = index.get_indexed_instance(obj)
21
- self.assertEqual(indexed_instance, obj)
22
-
23
- def test_gets_specific_class(self):
24
- obj = models.Novel.objects.get(id=1)
25
-
26
- # Running the command with the parent class should find the specific class again
27
- indexed_instance = index.get_indexed_instance(obj.book_ptr)
28
- self.assertEqual(indexed_instance, obj)
29
-
30
- def test_blocks_not_in_indexed_objects(self):
31
- obj = models.Novel(
32
- title="Don't index me!",
33
- publication_date=date(2017, 10, 18),
34
- number_of_pages=100,
35
- )
36
- obj.save()
37
-
38
- # We've told it not to index anything with the title "Don't index me"
39
- # get_indexed_instance should return None
40
- indexed_instance = index.get_indexed_instance(obj.book_ptr)
41
- self.assertIsNone(indexed_instance)
42
-
43
-
44
- @mock.patch("wagtail.search.tests.DummySearchBackend", create=True)
45
- @override_settings(
46
- WAGTAILSEARCH_BACKENDS={
47
- "default": {"BACKEND": "wagtail.search.tests.DummySearchBackend"}
48
- }
49
- )
50
- class TestInsertOrUpdateObject(WagtailTestUtils, TestCase):
51
- def test_inserts_object(self, backend):
52
- obj = models.Book.objects.create(
53
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
54
- )
55
- backend().reset_mock()
56
-
57
- index.insert_or_update_object(obj)
58
-
59
- backend().add.assert_called_with(obj)
60
-
61
- def test_doesnt_insert_unsaved_object(self, backend):
62
- obj = models.Book(
63
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
64
- )
65
- backend().reset_mock()
66
-
67
- index.insert_or_update_object(obj)
68
-
69
- self.assertFalse(backend().add.mock_calls)
70
-
71
- def test_converts_to_specific_page(self, backend):
72
- root_page = Page.objects.get(id=1)
73
- page = root_page.add_child(
74
- instance=SimplePage(title="test", slug="test", content="test")
75
- )
76
-
77
- # Convert page into a generic "Page" object and add it into the index
78
- unspecific_page = page.page_ptr
79
-
80
- backend().reset_mock()
81
-
82
- index.insert_or_update_object(unspecific_page)
83
-
84
- # It should be automatically converted back to the specific version
85
- backend().add.assert_called_with(page)
86
-
87
- def test_catches_index_error(self, backend):
88
- obj = models.Book.objects.create(
89
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
90
- )
91
-
92
- backend().add.side_effect = ValueError("Test")
93
- backend().reset_mock()
94
-
95
- with self.assertLogs("wagtail.search.index", level="ERROR") as cm:
96
- index.insert_or_update_object(obj)
97
-
98
- self.assertEqual(len(cm.output), 1)
99
- self.assertIn(
100
- "Exception raised while adding <Book: Test> into the 'default' search backend",
101
- cm.output[0],
102
- )
103
- self.assertIn("Traceback (most recent call last):", cm.output[0])
104
- self.assertIn("ValueError: Test", cm.output[0])
105
-
106
-
107
- @mock.patch("wagtail.search.tests.DummySearchBackend", create=True)
108
- @override_settings(
109
- WAGTAILSEARCH_BACKENDS={
110
- "default": {"BACKEND": "wagtail.search.tests.DummySearchBackend"}
111
- }
112
- )
113
- class TestRemoveObject(WagtailTestUtils, TestCase):
114
- def test_removes_object(self, backend):
115
- obj = models.Book.objects.create(
116
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
117
- )
118
- backend().reset_mock()
119
-
120
- index.remove_object(obj)
121
-
122
- backend().delete.assert_called_with(obj)
123
-
124
- def test_removes_unsaved_object(self, backend):
125
- obj = models.Book(
126
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
127
- )
128
- backend().reset_mock()
129
-
130
- index.remove_object(obj)
131
-
132
- backend().delete.assert_called_with(obj)
133
-
134
- def test_catches_index_error(self, backend):
135
- obj = models.Book.objects.create(
136
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
137
- )
138
- backend().reset_mock()
139
-
140
- backend().delete.side_effect = ValueError("Test")
141
-
142
- with self.assertLogs("wagtail.search.index", level="ERROR") as cm:
143
- index.remove_object(obj)
144
-
145
- self.assertEqual(len(cm.output), 1)
146
- self.assertIn(
147
- "Exception raised while deleting <Book: Test> from the 'default' search backend",
148
- cm.output[0],
149
- )
150
- self.assertIn("Traceback (most recent call last):", cm.output[0])
151
- self.assertIn("ValueError: Test", cm.output[0])
152
-
153
-
154
- @mock.patch("wagtail.search.tests.DummySearchBackend", create=True)
155
- @override_settings(
156
- WAGTAILSEARCH_BACKENDS={
157
- "default": {"BACKEND": "wagtail.search.tests.DummySearchBackend"}
158
- }
159
- )
160
- class TestSignalHandlers(WagtailTestUtils, TestCase):
161
- def test_index_on_create(self, backend):
162
- backend().reset_mock()
163
- with self.captureOnCommitCallbacks(execute=True):
164
- obj = models.Book.objects.create(
165
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
166
- )
167
- backend().add.assert_called_with(obj)
168
-
169
- def test_index_on_create_with_uuid_primary_key(self, backend):
170
- backend().reset_mock()
171
- with self.captureOnCommitCallbacks(execute=True):
172
- obj = AdvertWithCustomUUIDPrimaryKey.objects.create(text="Test")
173
- backend().add.assert_called_with(obj)
174
-
175
- def test_index_on_update(self, backend):
176
- obj = models.Book.objects.create(
177
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
178
- )
179
-
180
- backend().reset_mock()
181
- obj.title = "Updated test"
182
- with self.captureOnCommitCallbacks(execute=True):
183
- obj.save()
184
-
185
- self.assertEqual(backend().add.call_count, 1)
186
- indexed_object = backend().add.call_args[0][0]
187
- self.assertEqual(indexed_object.title, "Updated test")
188
-
189
- def test_index_on_update_with_uuid_primary_key(self, backend):
190
- obj = AdvertWithCustomUUIDPrimaryKey.objects.create(text="Test")
191
-
192
- backend().reset_mock()
193
- obj.text = "Updated test"
194
- with self.captureOnCommitCallbacks(execute=True):
195
- obj.save()
196
-
197
- self.assertEqual(backend().add.call_count, 1)
198
- indexed_object = backend().add.call_args[0][0]
199
- self.assertEqual(indexed_object.text, "Updated test")
200
-
201
- def test_index_on_delete(self, backend):
202
- obj = models.Book.objects.create(
203
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
204
- )
205
-
206
- backend().reset_mock()
207
- with self.captureOnCommitCallbacks(execute=True):
208
- obj.delete()
209
- backend().delete.assert_called_with(obj)
210
-
211
- def test_index_on_delete_with_uuid_primary_key(self, backend):
212
- obj = AdvertWithCustomUUIDPrimaryKey.objects.create(text="Test")
213
-
214
- backend().reset_mock()
215
- with self.captureOnCommitCallbacks(execute=True):
216
- obj.delete()
217
- backend().delete.assert_called_with(obj)
218
-
219
- def test_do_not_index_fields_omitted_from_update_fields(self, backend):
220
- obj = models.Book.objects.create(
221
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
222
- )
223
-
224
- backend().reset_mock()
225
- obj.title = "Updated test"
226
- obj.publication_date = date(2001, 10, 19)
227
- with self.captureOnCommitCallbacks(execute=True):
228
- obj.save(update_fields=["title"])
229
-
230
- self.assertEqual(backend().add.call_count, 1)
231
- indexed_object = backend().add.call_args[0][0]
232
- self.assertEqual(indexed_object.title, "Updated test")
233
- self.assertEqual(indexed_object.publication_date, date(2017, 10, 18))
234
-
235
-
236
- @mock.patch("wagtail.search.tests.DummySearchBackend", create=True)
237
- @override_settings(
238
- WAGTAILSEARCH_BACKENDS={
239
- "default": {"BACKEND": "wagtail.search.tests.DummySearchBackend"}
240
- }
241
- )
242
- class TestSignalHandlersSearchDisabled(TestCase, WagtailTestUtils):
243
- def test_index_on_create_and_update(self, backend):
244
- obj = models.UnindexedBook.objects.create(
245
- title="Test", publication_date=date(2017, 10, 18), number_of_pages=100
246
- )
247
-
248
- self.assertEqual(backend().add.call_count, 0)
249
- self.assertIsNone(backend().add.call_args)
250
-
251
- backend().reset_mock()
252
- obj.title = "Updated test"
253
- obj.save()
254
-
255
- self.assertEqual(backend().add.call_count, 0)
256
- self.assertIsNone(backend().add.call_args)
@@ -1,157 +0,0 @@
1
- from contextlib import contextmanager
2
-
3
- from django.core import checks
4
- from django.test import TestCase
5
-
6
- from wagtail.models import Page
7
- from wagtail.search import index
8
- from wagtail.test.search import models
9
- from wagtail.test.testapp.models import (
10
- TaggedChildPage,
11
- TaggedGrandchildPage,
12
- TaggedPage,
13
- )
14
-
15
-
16
- @contextmanager
17
- def patch_search_fields(model, new_search_fields):
18
- """
19
- A context manager to allow testing of different search_fields configurations
20
- without permanently changing the models' search_fields.
21
- """
22
- old_search_fields = model.search_fields
23
- model.search_fields = new_search_fields
24
- yield
25
- model.search_fields = old_search_fields
26
-
27
-
28
- class TestContentTypeNames(TestCase):
29
- def test_base_content_type_name(self):
30
- name = models.Novel.indexed_get_toplevel_content_type()
31
- self.assertEqual(name, "searchtests_book")
32
-
33
- def test_qualified_content_type_name(self):
34
- name = models.Novel.indexed_get_content_type()
35
- self.assertEqual(name, "searchtests_book_searchtests_novel")
36
-
37
-
38
- class TestSearchFields(TestCase):
39
- def make_dummy_type(self, search_fields):
40
- return type("DummyType", (index.Indexed,), {"search_fields": search_fields})
41
-
42
- def get_checks_result(warning_id=None):
43
- """Run Django checks on any with the 'search' tag used when registering the check"""
44
- checks_result = checks.run_checks()
45
- if warning_id:
46
- return [warning for warning in checks_result if warning.id == warning_id]
47
- return checks_result
48
-
49
- def test_basic(self):
50
- cls = self.make_dummy_type(
51
- [
52
- index.SearchField("test", boost=100),
53
- index.FilterField("filter_test"),
54
- ]
55
- )
56
-
57
- self.assertEqual(len(cls.get_search_fields()), 2)
58
- self.assertEqual(len(cls.get_searchable_search_fields()), 1)
59
- self.assertEqual(len(cls.get_filterable_search_fields()), 1)
60
-
61
- def test_overriding(self):
62
- # If there are two fields with the same type and name
63
- # the last one should override all the previous ones. This ensures that the
64
- # standard convention of:
65
- #
66
- # class SpecificPageType(Page):
67
- # search_fields = Page.search_fields + [some_other_definitions]
68
- #
69
- # ...causes the definitions in some_other_definitions to override Page.search_fields
70
- # as intended.
71
- cls = self.make_dummy_type(
72
- [
73
- index.SearchField("test", boost=100),
74
- index.SearchField("test"),
75
- ]
76
- )
77
-
78
- self.assertEqual(len(cls.get_search_fields()), 1)
79
- self.assertEqual(len(cls.get_searchable_search_fields()), 1)
80
- self.assertEqual(len(cls.get_filterable_search_fields()), 0)
81
-
82
- field = cls.get_search_fields()[0]
83
- self.assertIsInstance(field, index.SearchField)
84
-
85
- # Boost should be reset to the default if it's not specified by the override
86
- self.assertIsNone(field.boost)
87
-
88
- def test_different_field_types_dont_override(self):
89
- # A search and filter field with the same name should be able to coexist
90
- cls = self.make_dummy_type(
91
- [
92
- index.SearchField("test", boost=100),
93
- index.FilterField("test"),
94
- ]
95
- )
96
-
97
- self.assertEqual(len(cls.get_search_fields()), 2)
98
- self.assertEqual(len(cls.get_searchable_search_fields()), 1)
99
- self.assertEqual(len(cls.get_filterable_search_fields()), 1)
100
-
101
- def test_checking_search_fields(self):
102
- with patch_search_fields(
103
- models.Book, models.Book.search_fields + [index.SearchField("foo")]
104
- ):
105
- expected_errors = [
106
- checks.Warning(
107
- "Book.search_fields contains non-existent field 'foo'",
108
- obj=models.Book,
109
- id="wagtailsearch.W004",
110
- )
111
- ]
112
- errors = models.Book.check()
113
- self.assertEqual(errors, expected_errors)
114
-
115
- def test_checking_core_page_fields_are_indexed(self):
116
- """Run checks to ensure that when core page fields are missing we get a warning"""
117
-
118
- # first confirm that errors show as TaggedPage (in test models) has no Page.search_fields
119
- errors = [
120
- error for error in checks.run_checks() if error.id == "wagtailsearch.W001"
121
- ]
122
-
123
- # should only ever get this warning on the sub-classes of the page model
124
- self.assertEqual(
125
- [TaggedPage, TaggedChildPage, TaggedGrandchildPage],
126
- [error.obj for error in errors],
127
- )
128
-
129
- for error in errors:
130
- self.assertEqual(
131
- error.msg,
132
- "Core Page fields missing in `search_fields`",
133
- )
134
- self.assertIn(
135
- "Page model search fields `search_fields = Page.search_fields + [...]`",
136
- error.hint,
137
- )
138
-
139
- # second check that we get no errors when setting up the models correctly
140
- with patch_search_fields(
141
- TaggedPage, Page.search_fields + TaggedPage.search_fields
142
- ):
143
- errors = [
144
- error
145
- for error in checks.run_checks()
146
- if error.id == "wagtailsearch.W001"
147
- ]
148
- self.assertEqual([], errors)
149
-
150
- # third check that we get no errors when disabling all model search
151
- with patch_search_fields(TaggedPage, []):
152
- errors = [
153
- error
154
- for error in checks.run_checks()
155
- if error.id == "wagtailsearch.W001"
156
- ]
157
- self.assertEqual([], errors)
@@ -1,192 +0,0 @@
1
- import unittest
2
- from unittest import skip
3
-
4
- from django.db import connection
5
- from django.test.testcases import TransactionTestCase
6
- from django.test.utils import override_settings
7
-
8
- from wagtail.search.query import Not, PlainText
9
- from wagtail.search.tests.test_backends import BackendTests
10
- from wagtail.test.search import models
11
-
12
-
13
- @unittest.skipUnless(connection.vendor == "mysql", "The current database is not MySQL")
14
- @override_settings(
15
- WAGTAILSEARCH_BACKENDS={
16
- "default": {
17
- "BACKEND": "wagtail.search.backends.database.mysql.mysql",
18
- }
19
- }
20
- )
21
- class TestMySQLSearchBackend(BackendTests, TransactionTestCase):
22
- backend_path = "wagtail.search.backends.database.mysql.mysql"
23
-
24
- # Overrides parent method, because there's a slight difference in what the MySQL backend supports/accepts as search queries.
25
- def test_not(self):
26
- all_other_titles = {
27
- "A Clash of Kings",
28
- "A Game of Thrones",
29
- "A Storm of Swords",
30
- "Foundation",
31
- "Learning Python",
32
- "The Hobbit",
33
- "The Two Towers",
34
- "The Fellowship of the Ring",
35
- "The Return of the King",
36
- "The Rust Programming Language",
37
- "Two Scoops of Django 1.11",
38
- "Programming Rust",
39
- }
40
-
41
- results = self.backend.search(
42
- Not(PlainText("javascript")), models.Book.objects.all()
43
- )
44
- self.assertSetEqual({r.title for r in results}, all_other_titles)
45
-
46
- results = self.backend.search(
47
- ~PlainText("javascript"), models.Book.objects.all()
48
- )
49
- self.assertSetEqual({r.title for r in results}, all_other_titles)
50
-
51
- # Tests multiple words
52
- results = self.backend.search(
53
- ~PlainText("javascript the"), models.Book.objects.all()
54
- )
55
- # NOTE: The difference with the parent method is here. As we're querying NOT 'javascript the', all entries containing both words should be excluded, but MySQL doesn't index stopwords in FULLTEXT indexes by default, so the JavaScript books won't match the query, since the 'the' word is excluded from the index. Therefore, both books will get returned.
56
- self.assertSetEqual(
57
- {r.title for r in results},
58
- all_other_titles
59
- | {"JavaScript: The Definitive Guide", "JavaScript: The good parts"},
60
- )
61
-
62
- # Tests multiple words too, but this time the second word is not a stopword
63
- results = self.backend.search(
64
- ~PlainText("javascript parts"), models.Book.objects.all()
65
- )
66
- self.assertSetEqual(
67
- {r.title for r in results},
68
- all_other_titles | {"JavaScript: The Definitive Guide"},
69
- )
70
-
71
- def test_empty_search(self):
72
- results = self.backend.search("", models.Book.objects.all())
73
- self.assertSetEqual(
74
- {r.title for r in results},
75
- set(),
76
- )
77
-
78
- results = self.backend.search(" ", models.Book.objects.all())
79
- self.assertSetEqual(
80
- {r.title for r in results},
81
- set(),
82
- )
83
-
84
- results = self.backend.search("*", models.Book.objects.all())
85
- self.assertSetEqual(
86
- {r.title for r in results},
87
- set(),
88
- )
89
-
90
- def test_empty_autocomplete(self):
91
- results = self.backend.autocomplete("", models.Book.objects.all())
92
- self.assertSetEqual(
93
- {r.title for r in results},
94
- set(),
95
- )
96
-
97
- results = self.backend.autocomplete(" ", models.Book.objects.all())
98
- self.assertSetEqual(
99
- {r.title for r in results},
100
- set(),
101
- )
102
-
103
- results = self.backend.autocomplete("*", models.Book.objects.all())
104
- self.assertSetEqual(
105
- {r.title for r in results},
106
- set(),
107
- )
108
-
109
- def test_symbols_in_search_term(self):
110
- # symbols as their own tokens should be ignored
111
- results = self.backend.search("javascript @ parts", models.Book.objects.all())
112
- self.assertSetEqual(
113
- {r.title for r in results},
114
- {"JavaScript: The good parts"},
115
- )
116
-
117
- results = self.backend.search("javascript parts @", models.Book.objects.all())
118
- self.assertSetEqual(
119
- {r.title for r in results},
120
- {"JavaScript: The good parts"},
121
- )
122
-
123
- results = self.backend.search("@ javascript parts", models.Book.objects.all())
124
- self.assertSetEqual(
125
- {r.title for r in results},
126
- {"JavaScript: The good parts"},
127
- )
128
-
129
- # tokens containing both symbols and alphanumerics should not be discarded
130
- # or treated as equivalent to the same token without symbols
131
- results = self.backend.search("java@script parts", models.Book.objects.all())
132
- self.assertSetEqual(
133
- {r.title for r in results},
134
- set(),
135
- )
136
-
137
- def test_autocomplete_with_symbols(self):
138
- # the * is not part of the autocomplete mechanism, but if someone includes it
139
- # we want it to be gracefully ignored
140
- results = self.backend.autocomplete("parts javasc*", models.Book.objects.all())
141
- self.assertSetEqual(
142
- {r.title for r in results},
143
- {"JavaScript: The good parts"},
144
- )
145
-
146
- def test_lexeme_validation(self):
147
- from wagtail.search.backends.database.mysql.query import Lexeme
148
-
149
- with self.assertRaisesMessage(ValueError, "Lexeme value cannot be empty."):
150
- Lexeme("")
151
-
152
- Lexeme("hello") # no error
153
-
154
- with self.assertRaisesMessage(
155
- ValueError,
156
- "Lexeme value 'hello world' must consist of alphanumeric characters "
157
- "and '_' only.",
158
- ):
159
- Lexeme("hello world")
160
-
161
- with self.assertRaisesMessage(
162
- ValueError,
163
- "Lexeme value 'rimsky@korsakov' must consist of alphanumeric characters "
164
- "and '_' only.",
165
- ):
166
- Lexeme("rimsky@korsakov")
167
-
168
- @skip(
169
- "The MySQL backend doesn't support choosing individual fields for the search, only (body, title) or (autocomplete) fields may be searched."
170
- )
171
- def test_search_on_individual_field(self):
172
- return super().test_search_on_individual_field()
173
-
174
- @skip("The MySQL backend doesn't support boosting.")
175
- def test_search_boosting_on_related_fields(self):
176
- return super().test_search_boosting_on_related_fields()
177
-
178
- @skip("The MySQL backend doesn't support boosting.")
179
- def test_boost(self):
180
- return super().test_boost()
181
-
182
- @skip("The MySQL backend doesn't score annotations.")
183
- def test_annotate_score(self):
184
- return super().test_annotate_score()
185
-
186
- @skip("The MySQL backend doesn't score annotations.")
187
- def test_annotate_score_with_slice(self):
188
- return super().test_annotate_score_with_slice()
189
-
190
- @skip("The MySQL backend doesn't guarantee correct ranking of results.")
191
- def test_ranking(self):
192
- return super().test_ranking()