wagtail 6.1.3__py3-none-any.whl → 6.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 (257) hide show
  1. wagtail/__init__.py +1 -1
  2. wagtail/actions/copy_for_translation.py +15 -1
  3. wagtail/admin/checks.py +20 -30
  4. wagtail/admin/forms/pages.py +10 -0
  5. wagtail/admin/icons.py +43 -0
  6. wagtail/admin/locale/en/LC_MESSAGES/django.po +405 -295
  7. wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +21 -3
  8. wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
  9. wagtail/admin/locale/sl/LC_MESSAGES/django.po +30 -0
  10. wagtail/admin/menu.py +2 -2
  11. wagtail/admin/migrations/0004_editingsession.py +57 -0
  12. wagtail/admin/migrations/0005_editingsession_is_editing.py +18 -0
  13. wagtail/admin/models.py +36 -3
  14. wagtail/admin/rich_text/editors/draftail/__init__.py +2 -20
  15. wagtail/admin/static/wagtailadmin/css/core.css +1 -1
  16. wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
  17. wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
  18. wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
  19. wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
  20. wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
  21. wagtail/admin/static/wagtailadmin/js/core.js +1 -1
  22. wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
  23. wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
  24. wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
  25. wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
  26. wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
  27. wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
  28. wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
  29. wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
  30. wagtail/admin/static/wagtailadmin/js/preview-panel.js +2 -1
  31. wagtail/admin/static/wagtailadmin/js/preview-panel.js.LICENSE.txt +11 -0
  32. wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
  33. wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
  34. wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
  35. wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
  36. wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
  37. wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
  38. wagtail/admin/static/wagtailadmin/js/userbar.js +2 -1
  39. wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +11 -0
  40. wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
  41. wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +0 -12
  42. wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
  43. wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
  44. wagtail/admin/templates/wagtailadmin/collection_privacy/ancestor_privacy.html +2 -6
  45. wagtail/admin/templates/wagtailadmin/generic/index_results.html +1 -17
  46. wagtail/admin/templates/wagtailadmin/generic/listing_results.html +20 -1
  47. wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +2 -11
  48. wagtail/admin/templates/wagtailadmin/page_privacy/ancestor_privacy.html +2 -6
  49. wagtail/admin/templates/wagtailadmin/page_privacy/no_privacy.html +2 -0
  50. wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -1
  51. wagtail/admin/templates/wagtailadmin/pages/action_menu/menu.html +1 -1
  52. wagtail/admin/templates/wagtailadmin/reports/aging_pages_results.html +54 -0
  53. wagtail/admin/templates/wagtailadmin/reports/base_page_report.html +1 -17
  54. wagtail/admin/templates/wagtailadmin/reports/base_page_report_results.html +10 -0
  55. wagtail/admin/templates/wagtailadmin/reports/base_report.html +1 -40
  56. wagtail/admin/templates/wagtailadmin/reports/base_report_results.html +1 -0
  57. wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_report.html +21 -27
  58. wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_types_usage.html +48 -54
  59. wagtail/admin/templates/wagtailadmin/reports/{locked_pages.html → locked_pages_results.html} +3 -3
  60. wagtail/admin/templates/wagtailadmin/reports/page_types_usage_results.html +10 -0
  61. wagtail/admin/templates/wagtailadmin/reports/site_history_results.html +53 -0
  62. wagtail/admin/templates/wagtailadmin/reports/workflow_results.html +74 -0
  63. wagtail/admin/templates/wagtailadmin/reports/workflow_tasks_results.html +56 -0
  64. wagtail/admin/templates/wagtailadmin/shared/_workflow_init.html +8 -44
  65. wagtail/admin/templates/wagtailadmin/shared/avatar.html +11 -1
  66. wagtail/admin/templates/wagtailadmin/shared/dialog/dialog.html +5 -4
  67. wagtail/admin/templates/wagtailadmin/shared/dropdown/dropdown_button.html +2 -1
  68. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/list.html +132 -0
  69. wagtail/admin/templates/wagtailadmin/shared/editing_sessions/module.html +44 -0
  70. wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +7 -1
  71. wagtail/admin/templates/wagtailadmin/shared/page_status_tag_new.html +1 -1
  72. wagtail/admin/templates/wagtailadmin/shared/side_panels/checks.html +32 -16
  73. wagtail/admin/templates/wagtailadmin/skeleton.html +1 -1
  74. wagtail/admin/templates/wagtailadmin/userbar/item_accessibility.html +9 -11
  75. wagtail/admin/templatetags/wagtailadmin_tags.py +13 -2
  76. wagtail/admin/tests/formats/en/__init__.py +0 -0
  77. wagtail/admin/tests/formats/en/formats.py +1 -0
  78. wagtail/admin/tests/pages/test_create_page.py +47 -0
  79. wagtail/admin/tests/pages/test_edit_page.py +10 -8
  80. wagtail/admin/tests/pages/test_parent_page_chooser_view.py +45 -1
  81. wagtail/admin/tests/test_checks.py +53 -3
  82. wagtail/admin/tests/test_collections_views.py +62 -1
  83. wagtail/admin/tests/test_edit_handlers.py +37 -0
  84. wagtail/admin/tests/test_editing_sessions.py +1336 -0
  85. wagtail/admin/tests/test_icon_sprite.py +12 -21
  86. wagtail/admin/tests/test_page_chooser.py +309 -7
  87. wagtail/admin/tests/test_privacy.py +82 -0
  88. wagtail/admin/tests/test_reports_views.py +464 -70
  89. wagtail/admin/tests/test_userbar.py +93 -6
  90. wagtail/admin/tests/test_workflows.py +223 -33
  91. wagtail/admin/tests/viewsets/test_model_viewset.py +151 -2
  92. wagtail/admin/ui/editing_sessions.py +57 -0
  93. wagtail/admin/urls/__init__.py +9 -15
  94. wagtail/admin/urls/editing_sessions.py +17 -0
  95. wagtail/admin/urls/reports.py +33 -1
  96. wagtail/admin/userbar.py +77 -20
  97. wagtail/admin/views/chooser.py +49 -22
  98. wagtail/admin/views/collections.py +0 -11
  99. wagtail/admin/views/editing_sessions.py +193 -0
  100. wagtail/admin/views/generic/__init__.py +1 -0
  101. wagtail/admin/views/generic/history.py +9 -3
  102. wagtail/admin/views/generic/mixins.py +44 -3
  103. wagtail/admin/views/generic/models.py +46 -72
  104. wagtail/admin/views/generic/permissions.py +20 -10
  105. wagtail/admin/views/home.py +2 -31
  106. wagtail/admin/views/page_privacy.py +20 -5
  107. wagtail/admin/views/pages/choose_parent.py +62 -0
  108. wagtail/admin/views/pages/edit.py +28 -0
  109. wagtail/admin/views/reports/aging_pages.py +6 -10
  110. wagtail/admin/views/reports/audit_logging.py +13 -42
  111. wagtail/admin/views/reports/base.py +31 -4
  112. wagtail/admin/views/reports/locked_pages.py +5 -8
  113. wagtail/admin/views/reports/page_types_usage.py +6 -10
  114. wagtail/admin/views/reports/workflows.py +36 -12
  115. wagtail/admin/viewsets/base.py +8 -3
  116. wagtail/admin/viewsets/chooser.py +1 -1
  117. wagtail/admin/viewsets/model.py +26 -1
  118. wagtail/admin/wagtail_hooks.py +2 -1
  119. wagtail/api/v2/filters.py +6 -0
  120. wagtail/api/v2/tests/test_documents.py +1 -1
  121. wagtail/api/v2/tests/test_images.py +1 -1
  122. wagtail/api/v2/tests/test_pages.py +11 -1
  123. wagtail/api/v2/utils.py +2 -2
  124. wagtail/blocks/base.py +35 -12
  125. wagtail/blocks/definition_lookup.py +85 -0
  126. wagtail/blocks/list_block.py +12 -0
  127. wagtail/blocks/migrations/migrate_operation.py +2 -0
  128. wagtail/blocks/stream_block.py +19 -0
  129. wagtail/blocks/struct_block.py +19 -0
  130. wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +1 -1
  131. wagtail/contrib/frontend_cache/backends/__init__.py +5 -0
  132. wagtail/contrib/frontend_cache/backends/azure.py +179 -0
  133. wagtail/contrib/frontend_cache/backends/base.py +28 -0
  134. wagtail/contrib/frontend_cache/backends/cloudflare.py +114 -0
  135. wagtail/contrib/frontend_cache/backends/cloudfront.py +99 -0
  136. wagtail/contrib/frontend_cache/backends/http.py +64 -0
  137. wagtail/contrib/frontend_cache/tests.py +59 -17
  138. wagtail/contrib/frontend_cache/utils.py +26 -8
  139. wagtail/contrib/redirects/filters.py +15 -1
  140. wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +37 -72
  141. wagtail/contrib/redirects/models.py +6 -5
  142. wagtail/contrib/redirects/templates/wagtailredirects/edit.html +1 -38
  143. wagtail/contrib/redirects/tests/test_redirects.py +141 -1
  144. wagtail/contrib/redirects/urls.py +1 -2
  145. wagtail/contrib/redirects/views.py +39 -80
  146. wagtail/contrib/routable_page/models.py +6 -4
  147. wagtail/contrib/routable_page/tests.py +11 -0
  148. wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +1 -1
  149. wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +4 -4
  150. wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +5 -1
  151. wagtail/contrib/simple_translation/models.py +2 -1
  152. wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
  153. wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
  154. wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
  155. wagtail/contrib/typed_table_block/blocks.py +19 -0
  156. wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
  157. wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
  158. wagtail/contrib/typed_table_block/tests.py +38 -0
  159. wagtail/coreutils.py +1 -1
  160. wagtail/documents/__init__.py +1 -1
  161. wagtail/documents/locale/en/LC_MESSAGES/django.po +8 -8
  162. wagtail/documents/locale/sl/LC_MESSAGES/django.mo +0 -0
  163. wagtail/documents/locale/sl/LC_MESSAGES/django.po +20 -0
  164. wagtail/documents/models.py +5 -1
  165. wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
  166. wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
  167. wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
  168. wagtail/documents/tests/test_models.py +5 -1
  169. wagtail/embeds/apps.py +2 -0
  170. wagtail/embeds/embeds.py +12 -14
  171. wagtail/embeds/finders/__init__.py +2 -0
  172. wagtail/embeds/finders/facebook.py +17 -33
  173. wagtail/embeds/finders/instagram.py +19 -16
  174. wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
  175. wagtail/embeds/signal_handlers.py +13 -0
  176. wagtail/embeds/tests/test_embeds.py +7 -7
  177. wagtail/fields.py +58 -14
  178. wagtail/images/__init__.py +1 -1
  179. wagtail/images/locale/en/LC_MESSAGES/django.po +34 -34
  180. wagtail/images/locale/sl/LC_MESSAGES/django.mo +0 -0
  181. wagtail/images/locale/sl/LC_MESSAGES/django.po +20 -0
  182. wagtail/images/models.py +2 -0
  183. wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
  184. wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
  185. wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
  186. wagtail/images/templates/wagtailimages/images/edit.html +4 -4
  187. wagtail/images/tests/test_admin_views.py +26 -2
  188. wagtail/images/views/chooser.py +6 -1
  189. wagtail/locale/en/LC_MESSAGES/django.po +84 -80
  190. wagtail/locales/locale/en/LC_MESSAGES/django.po +2 -2
  191. wagtail/locales/tests.py +16 -0
  192. wagtail/locales/wagtail_hooks.py +0 -9
  193. wagtail/migrations/0094_alter_page_locale.py +19 -0
  194. wagtail/models/__init__.py +11 -5
  195. wagtail/models/i18n.py +6 -1
  196. wagtail/project_template/requirements.txt +1 -1
  197. wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
  198. wagtail/signals.py +4 -0
  199. wagtail/sites/locale/en/LC_MESSAGES/django.po +2 -2
  200. wagtail/sites/tests.py +15 -0
  201. wagtail/sites/wagtail_hooks.py +0 -9
  202. wagtail/snippets/locale/en/LC_MESSAGES/django.po +9 -9
  203. wagtail/snippets/permissions.py +5 -3
  204. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
  205. wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
  206. wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/menu.html +1 -1
  207. wagtail/snippets/tests/test_snippets.py +78 -12
  208. wagtail/snippets/tests/test_viewset.py +22 -0
  209. wagtail/snippets/views/snippets.py +19 -14
  210. wagtail/snippets/wagtail_hooks.py +2 -10
  211. wagtail/templatetags/wagtailcore_tags.py +3 -0
  212. wagtail/test/dummy_external_storage.py +1 -1
  213. wagtail/test/i18n/migrations/0003_alter_clusterabletestmodel_locale_and_more.py +40 -0
  214. wagtail/test/routablepage/models.py +4 -0
  215. wagtail/test/snippets/migrations/0012_alter_translatablesnippet_locale.py +20 -0
  216. wagtail/test/testapp/migrations/0038_sociallink.py +52 -0
  217. wagtail/test/testapp/migrations/0039_alter_eventcategory_locale_and_more.py +45 -0
  218. wagtail/test/testapp/models.py +24 -0
  219. wagtail/test/testapp/views.py +1 -0
  220. wagtail/test/testapp/wagtail_hooks.py +9 -0
  221. wagtail/test/urls_multilang.py +6 -1
  222. wagtail/test/urls_multilang_non_root.py +11 -0
  223. wagtail/tests/streamfield_migrations/test_migrations.py +53 -12
  224. wagtail/tests/test_audit_log.py +72 -2
  225. wagtail/tests/test_blocks.py +103 -0
  226. wagtail/tests/test_signals.py +49 -2
  227. wagtail/tests/test_streamfield.py +153 -0
  228. wagtail/tests/test_utils.py +14 -0
  229. wagtail/tests/tests.py +5 -0
  230. wagtail/users/apps.py +1 -0
  231. wagtail/users/forms.py +7 -0
  232. wagtail/users/locale/en/LC_MESSAGES/django.po +55 -50
  233. wagtail/users/models.py +1 -0
  234. wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +3 -2
  235. wagtail/users/templatetags/wagtailusers_tags.py +9 -0
  236. wagtail/users/tests/__init__.py +7 -1
  237. wagtail/users/tests/test_admin_views.py +117 -32
  238. wagtail/users/views/groups.py +4 -0
  239. wagtail/users/views/users.py +58 -14
  240. wagtail/users/wagtail_hooks.py +7 -123
  241. wagtail/utils/utils.py +1 -0
  242. wagtail/utils/version.py +5 -2
  243. {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/METADATA +3 -3
  244. {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/RECORD +248 -222
  245. wagtail/admin/templates/wagtailadmin/reports/aging_pages.html +0 -58
  246. wagtail/admin/templates/wagtailadmin/reports/page_types_usage.html +0 -18
  247. wagtail/admin/templates/wagtailadmin/reports/site_history.html +0 -57
  248. wagtail/admin/templates/wagtailadmin/reports/workflow.html +0 -81
  249. wagtail/admin/templates/wagtailadmin/reports/workflow_tasks.html +0 -63
  250. wagtail/contrib/frontend_cache/backends.py +0 -400
  251. wagtail/contrib/redirects/templates/wagtailredirects/list.html +0 -43
  252. wagtail/contrib/redirects/templates/wagtailredirects/reports/redirects_report.html +0 -14
  253. wagtail/contrib/redirects/tests/test_reports_view.py +0 -82
  254. {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/LICENSE +0 -0
  255. {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/WHEEL +0 -0
  256. {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/entry_points.txt +0 -0
  257. {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,10 @@ from warnings import warn
2
2
 
3
3
  import django_filters
4
4
  from django.conf import settings
5
- from django.contrib.auth import get_user_model, update_session_auth_hash
5
+ from django.contrib.auth import (
6
+ get_user_model,
7
+ update_session_auth_hash,
8
+ )
6
9
  from django.contrib.auth.models import Group
7
10
  from django.core.exceptions import FieldDoesNotExist, PermissionDenied
8
11
  from django.db.models import Q
@@ -14,6 +17,7 @@ from django.utils.translation import gettext_lazy
14
17
 
15
18
  from wagtail import hooks
16
19
  from wagtail.admin.filters import DateRangePickerWidget, WagtailFilterSet
20
+ from wagtail.admin.search import SearchArea
17
21
  from wagtail.admin.ui.tables import (
18
22
  BulkActionsCheckboxColumn,
19
23
  Column,
@@ -22,8 +26,7 @@ from wagtail.admin.ui.tables import (
22
26
  TitleColumn,
23
27
  )
24
28
  from wagtail.admin.utils import get_user_display_name
25
- from wagtail.admin.views.generic import CreateView, DeleteView, EditView, IndexView
26
- from wagtail.admin.views.generic.history import HistoryView
29
+ from wagtail.admin.views import generic
27
30
  from wagtail.admin.viewsets.model import ModelViewSet
28
31
  from wagtail.admin.widgets.boolean_radio_select import BooleanRadioSelect
29
32
  from wagtail.admin.widgets.button import (
@@ -41,7 +44,8 @@ User = get_user_model()
41
44
 
42
45
  # Typically we would check the permission 'auth.change_user' (and 'auth.add_user' /
43
46
  # 'auth.delete_user') for user management actions, but this may vary according to
44
- # the AUTH_USER_MODEL setting
47
+ # the AUTH_USER_MODEL setting. These are no longer used in the codebase in favour
48
+ # of ModelPermissionPolicy, but are kept here for backwards compatibility.
45
49
  add_user_perm = f"{AUTH_USER_APP_LABEL}.add_{AUTH_USER_MODEL_NAME.lower()}"
46
50
  change_user_perm = "{}.change_{}".format(
47
51
  AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower()
@@ -54,6 +58,11 @@ delete_user_perm = "{}.delete_{}".format(
54
58
  def get_user_creation_form():
55
59
  form_setting = "WAGTAIL_USER_CREATION_FORM"
56
60
  if hasattr(settings, form_setting):
61
+ warn(
62
+ "The `WAGTAIL_USER_CREATION_FORM` setting is deprecated. Use a custom "
63
+ "`UserViewSet` subclass and override `get_form_class()` instead.",
64
+ RemovedInWagtail70Warning,
65
+ )
57
66
  return get_custom_form(form_setting)
58
67
  else:
59
68
  return UserCreationForm
@@ -62,6 +71,11 @@ def get_user_creation_form():
62
71
  def get_user_edit_form():
63
72
  form_setting = "WAGTAIL_USER_EDIT_FORM"
64
73
  if hasattr(settings, form_setting):
74
+ warn(
75
+ "The `WAGTAIL_USER_EDIT_FORM` setting is deprecated. Use a custom "
76
+ "`UserViewSet` subclass and override `get_form_class()` instead.",
77
+ RemovedInWagtail70Warning,
78
+ )
65
79
  return get_custom_form(form_setting)
66
80
  else:
67
81
  return UserEditForm
@@ -125,7 +139,7 @@ class UserFilterSet(WagtailFilterSet):
125
139
  fields = []
126
140
 
127
141
 
128
- class Index(IndexView):
142
+ class IndexView(generic.IndexView):
129
143
  """
130
144
  Lists the users for management within the admin.
131
145
  """
@@ -257,7 +271,7 @@ class Index(IndexView):
257
271
  return queryset
258
272
 
259
273
 
260
- class Create(CreateView):
274
+ class CreateView(generic.CreateView):
261
275
  """
262
276
  Provide the ability to create a user within the admin.
263
277
  """
@@ -279,7 +293,7 @@ class Create(CreateView):
279
293
  )
280
294
 
281
295
 
282
- class Edit(EditView):
296
+ class EditView(generic.EditView):
283
297
  """
284
298
  Provide the ability to edit a user within the admin.
285
299
  """
@@ -333,7 +347,7 @@ class Edit(EditView):
333
347
  return context
334
348
 
335
349
 
336
- class Delete(DeleteView):
350
+ class DeleteView(generic.DeleteView):
337
351
  """
338
352
  Provide the ability to delete a user within the admin.
339
353
  """
@@ -363,7 +377,7 @@ class Delete(DeleteView):
363
377
  )
364
378
 
365
379
 
366
- class History(HistoryView):
380
+ class HistoryView(generic.HistoryView):
367
381
  def get_page_subtitle(self):
368
382
  return get_user_display_name(self.object)
369
383
 
@@ -374,12 +388,16 @@ class UserViewSet(ModelViewSet):
374
388
  ordering = "name"
375
389
  add_to_reference_index = False
376
390
  filterset_class = UserFilterSet
391
+ menu_name = "users"
392
+ menu_label = gettext_lazy("Users")
393
+ menu_order = 600
394
+ add_to_settings_menu = True
377
395
 
378
- index_view_class = Index
379
- add_view_class = Create
380
- edit_view_class = Edit
381
- delete_view_class = Delete
382
- history_view_class = History
396
+ index_view_class = IndexView
397
+ add_view_class = CreateView
398
+ edit_view_class = EditView
399
+ delete_view_class = DeleteView
400
+ history_view_class = HistoryView
383
401
 
384
402
  template_prefix = "wagtailusers/users/"
385
403
 
@@ -395,3 +413,29 @@ class UserViewSet(ModelViewSet):
395
413
  if for_update:
396
414
  return get_user_edit_form()
397
415
  return get_user_creation_form()
416
+
417
+ @cached_property
418
+ def search_area_class(self):
419
+ class UsersSearchArea(SearchArea):
420
+ def is_shown(search_area, request):
421
+ return self.permission_policy.user_has_any_permission(
422
+ request.user, {"add", "change", "delete"}
423
+ )
424
+
425
+ return UsersSearchArea
426
+
427
+ def get_search_area(self):
428
+ return self.search_area_class(
429
+ gettext_lazy("Users"),
430
+ self.get_url_name("index"),
431
+ name="users",
432
+ icon_name="user",
433
+ order=600,
434
+ )
435
+
436
+ def register_search_area(self):
437
+ hooks.register("register_admin_search_area", self.get_search_area)
438
+
439
+ def on_register(self):
440
+ super().on_register()
441
+ self.register_search_area()
@@ -1,151 +1,35 @@
1
1
  from django.apps import apps
2
- from django.contrib.auth import get_user_model
3
- from django.contrib.auth.models import Permission
4
2
  from django.core.exceptions import ImproperlyConfigured
5
- from django.db.models import Q
6
- from django.urls import reverse
7
3
  from django.utils.module_loading import import_string
8
- from django.utils.translation import gettext_lazy as _
9
4
 
10
5
  from wagtail import hooks
11
- from wagtail.admin.admin_url_finder import (
12
- ModelAdminURLFinder,
13
- register_admin_url_finder,
14
- )
15
- from wagtail.admin.menu import MenuItem
16
- from wagtail.admin.search import SearchArea
17
- from wagtail.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME
18
- from wagtail.permission_policies import ModelPermissionPolicy
19
6
  from wagtail.users.views.bulk_actions import (
20
7
  AssignRoleBulkAction,
21
8
  DeleteBulkAction,
22
9
  SetActiveStateBulkAction,
23
10
  )
24
- from wagtail.users.views.users import UserViewSet
25
11
 
26
12
 
27
- def get_group_viewset_cls(app_config):
13
+ def get_viewset_cls(app_config, viewset_name):
28
14
  try:
29
- group_viewset_cls = import_string(app_config.group_viewset)
15
+ viewset_cls = import_string(getattr(app_config, viewset_name))
30
16
  except (AttributeError, ImportError) as e:
31
17
  raise ImproperlyConfigured(
32
- "Invalid setting for {appconfig}.group_viewset: {message}".format(
33
- appconfig=app_config.__class__.__name__, message=e
34
- )
18
+ f"Invalid setting for {app_config.__class__.__name__}.{viewset_name}: {e}"
35
19
  )
36
- return group_viewset_cls
20
+ return viewset_cls
37
21
 
38
22
 
39
23
  @hooks.register("register_admin_viewset")
40
24
  def register_viewset():
41
25
  app_config = apps.get_app_config("wagtailusers")
42
- group_viewset_cls = get_group_viewset_cls(app_config)
26
+ user_viewset_cls = get_viewset_cls(app_config, "user_viewset")
27
+ group_viewset_cls = get_viewset_cls(app_config, "group_viewset")
43
28
  return [
44
- UserViewSet("wagtailusers_users", url_prefix="users"),
29
+ user_viewset_cls("wagtailusers_users", url_prefix="users"),
45
30
  group_viewset_cls("wagtailusers_groups", url_prefix="groups"),
46
31
  ]
47
32
 
48
33
 
49
- # Typically we would check the permission 'auth.change_user' (and 'auth.add_user' /
50
- # 'auth.delete_user') for user management actions, but this may vary according to
51
- # the AUTH_USER_MODEL setting
52
- add_user_perm = f"{AUTH_USER_APP_LABEL}.add_{AUTH_USER_MODEL_NAME.lower()}"
53
- change_user_perm = "{}.change_{}".format(
54
- AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower()
55
- )
56
- delete_user_perm = "{}.delete_{}".format(
57
- AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME.lower()
58
- )
59
-
60
-
61
- class UsersMenuItem(MenuItem):
62
- def is_shown(self, request):
63
- return (
64
- request.user.has_perm(add_user_perm)
65
- or request.user.has_perm(change_user_perm)
66
- or request.user.has_perm(delete_user_perm)
67
- )
68
-
69
-
70
- @hooks.register("register_settings_menu_item")
71
- def register_users_menu_item():
72
- return UsersMenuItem(
73
- _("Users"),
74
- reverse("wagtailusers_users:index"),
75
- name="users",
76
- icon_name="user",
77
- order=600,
78
- )
79
-
80
-
81
- class GroupsMenuItem(MenuItem):
82
- def is_shown(self, request):
83
- return (
84
- request.user.has_perm("auth.add_group")
85
- or request.user.has_perm("auth.change_group")
86
- or request.user.has_perm("auth.delete_group")
87
- )
88
-
89
-
90
- @hooks.register("register_settings_menu_item")
91
- def register_groups_menu_item():
92
- return GroupsMenuItem(
93
- _("Groups"),
94
- reverse("wagtailusers_groups:index"),
95
- name="groups",
96
- icon_name="group",
97
- order=601,
98
- )
99
-
100
-
101
- @hooks.register("register_permissions")
102
- def register_permissions():
103
- user_permissions = Q(
104
- content_type__app_label=AUTH_USER_APP_LABEL,
105
- codename__in=[
106
- "add_%s" % AUTH_USER_MODEL_NAME.lower(),
107
- "change_%s" % AUTH_USER_MODEL_NAME.lower(),
108
- "delete_%s" % AUTH_USER_MODEL_NAME.lower(),
109
- ],
110
- )
111
- group_permissions = Q(
112
- content_type__app_label="auth",
113
- codename__in=["add_group", "change_group", "delete_group"],
114
- )
115
-
116
- return Permission.objects.filter(user_permissions | group_permissions)
117
-
118
-
119
- class UsersSearchArea(SearchArea):
120
- def is_shown(self, request):
121
- return (
122
- request.user.has_perm(add_user_perm)
123
- or request.user.has_perm(change_user_perm)
124
- or request.user.has_perm(delete_user_perm)
125
- )
126
-
127
-
128
- @hooks.register("register_admin_search_area")
129
- def register_users_search_area():
130
- return UsersSearchArea(
131
- _("Users"),
132
- reverse("wagtailusers_users:index"),
133
- name="users",
134
- icon_name="user",
135
- order=600,
136
- )
137
-
138
-
139
- User = get_user_model()
140
-
141
-
142
- class UserAdminURLFinder(ModelAdminURLFinder):
143
- edit_url_name = "wagtailusers_users:edit"
144
- permission_policy = ModelPermissionPolicy(User)
145
-
146
-
147
- register_admin_url_finder(User, UserAdminURLFinder)
148
-
149
-
150
34
  for action_class in [AssignRoleBulkAction, DeleteBulkAction, SetActiveStateBulkAction]:
151
35
  hooks.register("register_bulk_action", action_class)
wagtail/utils/utils.py CHANGED
@@ -18,6 +18,7 @@ def deep_update(source, overrides):
18
18
  def flatten_choices(choices):
19
19
  """
20
20
  Convert potentially grouped choices into a flat dict of choices.
21
+
21
22
  flatten_choices([(1, '1st'), (2, '2nd')]) -> {1: '1st', 2: '2nd'}
22
23
  flatten_choices([('Group', [(1, '1st'), (2, '2nd')])]) -> {1: '1st', 2: '2nd'}
23
24
  flatten_choices({'Group': {'1': '1st', '2': '2nd'}}) -> {'1': '1st', '2': '2nd'}
wagtail/utils/version.py CHANGED
@@ -20,10 +20,13 @@ def get_version(version):
20
20
  return main + sub
21
21
 
22
22
 
23
- def get_main_version(version=None):
23
+ def get_main_version(version=None, include_patch=True):
24
24
  """Return main version (X.Y[.Z]) from VERSION."""
25
25
  version = get_complete_version(version)
26
- parts = 2 if version[2] == 0 else 3
26
+ if include_patch:
27
+ parts = 2 if version[2] == 0 else 3
28
+ else:
29
+ parts = 2
27
30
  return ".".join(str(x) for x in version[:parts])
28
31
 
29
32
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wagtail
3
- Version: 6.1.3
3
+ Version: 6.2rc1
4
4
  Summary: A Django content management system.
5
5
  Home-page: https://wagtail.org/
6
6
  Author: Wagtail core team + contributors
@@ -32,7 +32,7 @@ License-File: LICENSE
32
32
  Requires-Dist: Django (<6.0,>=4.2)
33
33
  Requires-Dist: django-modelcluster (<7.0,>=6.2.1)
34
34
  Requires-Dist: django-permissionedforms (<1.0,>=0.1)
35
- Requires-Dist: django-taggit (<5.1,>=4.0)
35
+ Requires-Dist: django-taggit (<5.1,>=5.0)
36
36
  Requires-Dist: django-treebeard (<5.0,>=4.5.1)
37
37
  Requires-Dist: djangorestframework (<4.0,>=3.15.1)
38
38
  Requires-Dist: django-filter (<25,>=23.3)
@@ -49,7 +49,7 @@ Requires-Dist: laces (<0.2,>=0.1)
49
49
  Provides-Extra: docs
50
50
  Requires-Dist: pyenchant (<4,>=3.1.1) ; extra == 'docs'
51
51
  Requires-Dist: sphinxcontrib-spelling (<8,>=7) ; extra == 'docs'
52
- Requires-Dist: Sphinx (>=1.5.2) ; extra == 'docs'
52
+ Requires-Dist: Sphinx (>=7.0) ; extra == 'docs'
53
53
  Requires-Dist: sphinx-autobuild (>=0.6.0) ; extra == 'docs'
54
54
  Requires-Dist: sphinx-wagtail-theme (==6.3.0) ; extra == 'docs'
55
55
  Requires-Dist: myst-parser (==2.0.0) ; extra == 'docs'