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.
- wagtail/__init__.py +1 -1
- wagtail/actions/copy_for_translation.py +15 -1
- wagtail/admin/checks.py +20 -30
- wagtail/admin/forms/pages.py +10 -0
- wagtail/admin/icons.py +43 -0
- wagtail/admin/locale/en/LC_MESSAGES/django.po +405 -295
- wagtail/admin/locale/en/LC_MESSAGES/djangojs.po +21 -3
- wagtail/admin/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/admin/locale/sl/LC_MESSAGES/django.po +30 -0
- wagtail/admin/menu.py +2 -2
- wagtail/admin/migrations/0004_editingsession.py +57 -0
- wagtail/admin/migrations/0005_editingsession_is_editing.py +18 -0
- wagtail/admin/models.py +36 -3
- wagtail/admin/rich_text/editors/draftail/__init__.py +2 -20
- wagtail/admin/static/wagtailadmin/css/core.css +1 -1
- wagtail/admin/static/wagtailadmin/js/bulk-actions.js +1 -1
- wagtail/admin/static/wagtailadmin/js/chooser-modal.js +1 -1
- wagtail/admin/static/wagtailadmin/js/chooser-widget-telepath.js +1 -1
- wagtail/admin/static/wagtailadmin/js/chooser-widget.js +1 -1
- wagtail/admin/static/wagtailadmin/js/comments.js +1 -1
- wagtail/admin/static/wagtailadmin/js/core.js +1 -1
- wagtail/admin/static/wagtailadmin/js/date-time-chooser.js +1 -1
- wagtail/admin/static/wagtailadmin/js/draftail.js +1 -1
- wagtail/admin/static/wagtailadmin/js/expanding-formset.js +1 -1
- wagtail/admin/static/wagtailadmin/js/filtered-select.js +1 -1
- wagtail/admin/static/wagtailadmin/js/modal-workflow.js +1 -1
- wagtail/admin/static/wagtailadmin/js/page-chooser-modal.js +1 -1
- wagtail/admin/static/wagtailadmin/js/page-chooser-telepath.js +1 -1
- wagtail/admin/static/wagtailadmin/js/page-chooser.js +1 -1
- wagtail/admin/static/wagtailadmin/js/preview-panel.js +2 -1
- wagtail/admin/static/wagtailadmin/js/preview-panel.js.LICENSE.txt +11 -0
- wagtail/admin/static/wagtailadmin/js/privacy-switch.js +1 -1
- wagtail/admin/static/wagtailadmin/js/sidebar.js +1 -1
- wagtail/admin/static/wagtailadmin/js/task-chooser-modal.js +1 -1
- wagtail/admin/static/wagtailadmin/js/task-chooser.js +1 -1
- wagtail/admin/static/wagtailadmin/js/telepath/blocks.js +1 -1
- wagtail/admin/static/wagtailadmin/js/telepath/widgets.js +1 -1
- wagtail/admin/static/wagtailadmin/js/userbar.js +2 -1
- wagtail/admin/static/wagtailadmin/js/userbar.js.LICENSE.txt +11 -0
- wagtail/admin/static/wagtailadmin/js/vendor.js +1 -1
- wagtail/admin/static/wagtailadmin/js/vendor.js.LICENSE.txt +0 -12
- wagtail/admin/static/wagtailadmin/js/wagtailadmin.js +1 -1
- wagtail/admin/static/wagtailadmin/js/workflow-action.js +1 -1
- wagtail/admin/templates/wagtailadmin/collection_privacy/ancestor_privacy.html +2 -6
- wagtail/admin/templates/wagtailadmin/generic/index_results.html +1 -17
- wagtail/admin/templates/wagtailadmin/generic/listing_results.html +20 -1
- wagtail/admin/templates/wagtailadmin/home/workflow_objects_to_moderate.html +2 -11
- wagtail/admin/templates/wagtailadmin/page_privacy/ancestor_privacy.html +2 -6
- wagtail/admin/templates/wagtailadmin/page_privacy/no_privacy.html +2 -0
- wagtail/admin/templates/wagtailadmin/pages/_editor_js.html +0 -1
- wagtail/admin/templates/wagtailadmin/pages/action_menu/menu.html +1 -1
- wagtail/admin/templates/wagtailadmin/reports/aging_pages_results.html +54 -0
- wagtail/admin/templates/wagtailadmin/reports/base_page_report.html +1 -17
- wagtail/admin/templates/wagtailadmin/reports/base_page_report_results.html +10 -0
- wagtail/admin/templates/wagtailadmin/reports/base_report.html +1 -40
- wagtail/admin/templates/wagtailadmin/reports/base_report_results.html +1 -0
- wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_report.html +21 -27
- wagtail/admin/templates/wagtailadmin/reports/listing/_list_page_types_usage.html +48 -54
- wagtail/admin/templates/wagtailadmin/reports/{locked_pages.html → locked_pages_results.html} +3 -3
- wagtail/admin/templates/wagtailadmin/reports/page_types_usage_results.html +10 -0
- wagtail/admin/templates/wagtailadmin/reports/site_history_results.html +53 -0
- wagtail/admin/templates/wagtailadmin/reports/workflow_results.html +74 -0
- wagtail/admin/templates/wagtailadmin/reports/workflow_tasks_results.html +56 -0
- wagtail/admin/templates/wagtailadmin/shared/_workflow_init.html +8 -44
- wagtail/admin/templates/wagtailadmin/shared/avatar.html +11 -1
- wagtail/admin/templates/wagtailadmin/shared/dialog/dialog.html +5 -4
- wagtail/admin/templates/wagtailadmin/shared/dropdown/dropdown_button.html +2 -1
- wagtail/admin/templates/wagtailadmin/shared/editing_sessions/list.html +132 -0
- wagtail/admin/templates/wagtailadmin/shared/editing_sessions/module.html +44 -0
- wagtail/admin/templates/wagtailadmin/shared/headers/slim_header.html +7 -1
- wagtail/admin/templates/wagtailadmin/shared/page_status_tag_new.html +1 -1
- wagtail/admin/templates/wagtailadmin/shared/side_panels/checks.html +32 -16
- wagtail/admin/templates/wagtailadmin/skeleton.html +1 -1
- wagtail/admin/templates/wagtailadmin/userbar/item_accessibility.html +9 -11
- wagtail/admin/templatetags/wagtailadmin_tags.py +13 -2
- wagtail/admin/tests/formats/en/__init__.py +0 -0
- wagtail/admin/tests/formats/en/formats.py +1 -0
- wagtail/admin/tests/pages/test_create_page.py +47 -0
- wagtail/admin/tests/pages/test_edit_page.py +10 -8
- wagtail/admin/tests/pages/test_parent_page_chooser_view.py +45 -1
- wagtail/admin/tests/test_checks.py +53 -3
- wagtail/admin/tests/test_collections_views.py +62 -1
- wagtail/admin/tests/test_edit_handlers.py +37 -0
- wagtail/admin/tests/test_editing_sessions.py +1336 -0
- wagtail/admin/tests/test_icon_sprite.py +12 -21
- wagtail/admin/tests/test_page_chooser.py +309 -7
- wagtail/admin/tests/test_privacy.py +82 -0
- wagtail/admin/tests/test_reports_views.py +464 -70
- wagtail/admin/tests/test_userbar.py +93 -6
- wagtail/admin/tests/test_workflows.py +223 -33
- wagtail/admin/tests/viewsets/test_model_viewset.py +151 -2
- wagtail/admin/ui/editing_sessions.py +57 -0
- wagtail/admin/urls/__init__.py +9 -15
- wagtail/admin/urls/editing_sessions.py +17 -0
- wagtail/admin/urls/reports.py +33 -1
- wagtail/admin/userbar.py +77 -20
- wagtail/admin/views/chooser.py +49 -22
- wagtail/admin/views/collections.py +0 -11
- wagtail/admin/views/editing_sessions.py +193 -0
- wagtail/admin/views/generic/__init__.py +1 -0
- wagtail/admin/views/generic/history.py +9 -3
- wagtail/admin/views/generic/mixins.py +44 -3
- wagtail/admin/views/generic/models.py +46 -72
- wagtail/admin/views/generic/permissions.py +20 -10
- wagtail/admin/views/home.py +2 -31
- wagtail/admin/views/page_privacy.py +20 -5
- wagtail/admin/views/pages/choose_parent.py +62 -0
- wagtail/admin/views/pages/edit.py +28 -0
- wagtail/admin/views/reports/aging_pages.py +6 -10
- wagtail/admin/views/reports/audit_logging.py +13 -42
- wagtail/admin/views/reports/base.py +31 -4
- wagtail/admin/views/reports/locked_pages.py +5 -8
- wagtail/admin/views/reports/page_types_usage.py +6 -10
- wagtail/admin/views/reports/workflows.py +36 -12
- wagtail/admin/viewsets/base.py +8 -3
- wagtail/admin/viewsets/chooser.py +1 -1
- wagtail/admin/viewsets/model.py +26 -1
- wagtail/admin/wagtail_hooks.py +2 -1
- wagtail/api/v2/filters.py +6 -0
- wagtail/api/v2/tests/test_documents.py +1 -1
- wagtail/api/v2/tests/test_images.py +1 -1
- wagtail/api/v2/tests/test_pages.py +11 -1
- wagtail/api/v2/utils.py +2 -2
- wagtail/blocks/base.py +35 -12
- wagtail/blocks/definition_lookup.py +85 -0
- wagtail/blocks/list_block.py +12 -0
- wagtail/blocks/migrations/migrate_operation.py +2 -0
- wagtail/blocks/stream_block.py +19 -0
- wagtail/blocks/struct_block.py +19 -0
- wagtail/contrib/forms/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/frontend_cache/backends/__init__.py +5 -0
- wagtail/contrib/frontend_cache/backends/azure.py +179 -0
- wagtail/contrib/frontend_cache/backends/base.py +28 -0
- wagtail/contrib/frontend_cache/backends/cloudflare.py +114 -0
- wagtail/contrib/frontend_cache/backends/cloudfront.py +99 -0
- wagtail/contrib/frontend_cache/backends/http.py +64 -0
- wagtail/contrib/frontend_cache/tests.py +59 -17
- wagtail/contrib/frontend_cache/utils.py +26 -8
- wagtail/contrib/redirects/filters.py +15 -1
- wagtail/contrib/redirects/locale/en/LC_MESSAGES/django.po +37 -72
- wagtail/contrib/redirects/models.py +6 -5
- wagtail/contrib/redirects/templates/wagtailredirects/edit.html +1 -38
- wagtail/contrib/redirects/tests/test_redirects.py +141 -1
- wagtail/contrib/redirects/urls.py +1 -2
- wagtail/contrib/redirects/views.py +39 -80
- wagtail/contrib/routable_page/models.py +6 -4
- wagtail/contrib/routable_page/tests.py +11 -0
- wagtail/contrib/search_promotions/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/settings/locale/en/LC_MESSAGES/django.po +4 -4
- wagtail/contrib/simple_translation/locale/en/LC_MESSAGES/django.po +5 -1
- wagtail/contrib/simple_translation/models.py +2 -1
- wagtail/contrib/styleguide/locale/en/LC_MESSAGES/django.po +7 -7
- wagtail/contrib/table_block/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/contrib/table_block/static/table_block/js/table.js +1 -1
- wagtail/contrib/typed_table_block/blocks.py +19 -0
- wagtail/contrib/typed_table_block/locale/en/LC_MESSAGES/django.po +10 -10
- wagtail/contrib/typed_table_block/static/typed_table_block/js/typed_table_block.js +1 -1
- wagtail/contrib/typed_table_block/tests.py +38 -0
- wagtail/coreutils.py +1 -1
- wagtail/documents/__init__.py +1 -1
- wagtail/documents/locale/en/LC_MESSAGES/django.po +8 -8
- wagtail/documents/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/documents/locale/sl/LC_MESSAGES/django.po +20 -0
- wagtail/documents/models.py +5 -1
- wagtail/documents/static/wagtaildocs/js/document-chooser-modal.js +1 -1
- wagtail/documents/static/wagtaildocs/js/document-chooser-telepath.js +1 -1
- wagtail/documents/static/wagtaildocs/js/document-chooser.js +1 -1
- wagtail/documents/tests/test_models.py +5 -1
- wagtail/embeds/apps.py +2 -0
- wagtail/embeds/embeds.py +12 -14
- wagtail/embeds/finders/__init__.py +2 -0
- wagtail/embeds/finders/facebook.py +17 -33
- wagtail/embeds/finders/instagram.py +19 -16
- wagtail/embeds/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/embeds/signal_handlers.py +13 -0
- wagtail/embeds/tests/test_embeds.py +7 -7
- wagtail/fields.py +58 -14
- wagtail/images/__init__.py +1 -1
- wagtail/images/locale/en/LC_MESSAGES/django.po +34 -34
- wagtail/images/locale/sl/LC_MESSAGES/django.mo +0 -0
- wagtail/images/locale/sl/LC_MESSAGES/django.po +20 -0
- wagtail/images/models.py +2 -0
- wagtail/images/static/wagtailimages/js/image-chooser-modal.js +1 -1
- wagtail/images/static/wagtailimages/js/image-chooser-telepath.js +1 -1
- wagtail/images/static/wagtailimages/js/image-chooser.js +1 -1
- wagtail/images/templates/wagtailimages/images/edit.html +4 -4
- wagtail/images/tests/test_admin_views.py +26 -2
- wagtail/images/views/chooser.py +6 -1
- wagtail/locale/en/LC_MESSAGES/django.po +84 -80
- wagtail/locales/locale/en/LC_MESSAGES/django.po +2 -2
- wagtail/locales/tests.py +16 -0
- wagtail/locales/wagtail_hooks.py +0 -9
- wagtail/migrations/0094_alter_page_locale.py +19 -0
- wagtail/models/__init__.py +11 -5
- wagtail/models/i18n.py +6 -1
- wagtail/project_template/requirements.txt +1 -1
- wagtail/search/locale/en/LC_MESSAGES/django.po +1 -1
- wagtail/signals.py +4 -0
- wagtail/sites/locale/en/LC_MESSAGES/django.po +2 -2
- wagtail/sites/tests.py +15 -0
- wagtail/sites/wagtail_hooks.py +0 -9
- wagtail/snippets/locale/en/LC_MESSAGES/django.po +9 -9
- wagtail/snippets/permissions.py +5 -3
- wagtail/snippets/static/wagtailsnippets/js/snippet-chooser-telepath.js +1 -1
- wagtail/snippets/static/wagtailsnippets/js/snippet-chooser.js +1 -1
- wagtail/snippets/templates/wagtailsnippets/snippets/action_menu/menu.html +1 -1
- wagtail/snippets/tests/test_snippets.py +78 -12
- wagtail/snippets/tests/test_viewset.py +22 -0
- wagtail/snippets/views/snippets.py +19 -14
- wagtail/snippets/wagtail_hooks.py +2 -10
- wagtail/templatetags/wagtailcore_tags.py +3 -0
- wagtail/test/dummy_external_storage.py +1 -1
- wagtail/test/i18n/migrations/0003_alter_clusterabletestmodel_locale_and_more.py +40 -0
- wagtail/test/routablepage/models.py +4 -0
- wagtail/test/snippets/migrations/0012_alter_translatablesnippet_locale.py +20 -0
- wagtail/test/testapp/migrations/0038_sociallink.py +52 -0
- wagtail/test/testapp/migrations/0039_alter_eventcategory_locale_and_more.py +45 -0
- wagtail/test/testapp/models.py +24 -0
- wagtail/test/testapp/views.py +1 -0
- wagtail/test/testapp/wagtail_hooks.py +9 -0
- wagtail/test/urls_multilang.py +6 -1
- wagtail/test/urls_multilang_non_root.py +11 -0
- wagtail/tests/streamfield_migrations/test_migrations.py +53 -12
- wagtail/tests/test_audit_log.py +72 -2
- wagtail/tests/test_blocks.py +103 -0
- wagtail/tests/test_signals.py +49 -2
- wagtail/tests/test_streamfield.py +153 -0
- wagtail/tests/test_utils.py +14 -0
- wagtail/tests/tests.py +5 -0
- wagtail/users/apps.py +1 -0
- wagtail/users/forms.py +7 -0
- wagtail/users/locale/en/LC_MESSAGES/django.po +55 -50
- wagtail/users/models.py +1 -0
- wagtail/users/templates/wagtailusers/groups/includes/formatted_permissions.html +3 -2
- wagtail/users/templatetags/wagtailusers_tags.py +9 -0
- wagtail/users/tests/__init__.py +7 -1
- wagtail/users/tests/test_admin_views.py +117 -32
- wagtail/users/views/groups.py +4 -0
- wagtail/users/views/users.py +58 -14
- wagtail/users/wagtail_hooks.py +7 -123
- wagtail/utils/utils.py +1 -0
- wagtail/utils/version.py +5 -2
- {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/METADATA +3 -3
- {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/RECORD +248 -222
- wagtail/admin/templates/wagtailadmin/reports/aging_pages.html +0 -58
- wagtail/admin/templates/wagtailadmin/reports/page_types_usage.html +0 -18
- wagtail/admin/templates/wagtailadmin/reports/site_history.html +0 -57
- wagtail/admin/templates/wagtailadmin/reports/workflow.html +0 -81
- wagtail/admin/templates/wagtailadmin/reports/workflow_tasks.html +0 -63
- wagtail/contrib/frontend_cache/backends.py +0 -400
- wagtail/contrib/redirects/templates/wagtailredirects/list.html +0 -43
- wagtail/contrib/redirects/templates/wagtailredirects/reports/redirects_report.html +0 -14
- wagtail/contrib/redirects/tests/test_reports_view.py +0 -82
- {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/LICENSE +0 -0
- {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/WHEEL +0 -0
- {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/entry_points.txt +0 -0
- {wagtail-6.1.3.dist-info → wagtail-6.2rc1.dist-info}/top_level.txt +0 -0
wagtail/users/views/users.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
379
|
-
add_view_class =
|
|
380
|
-
edit_view_class =
|
|
381
|
-
delete_view_class =
|
|
382
|
-
history_view_class =
|
|
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()
|
wagtail/users/wagtail_hooks.py
CHANGED
|
@@ -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
|
|
13
|
+
def get_viewset_cls(app_config, viewset_name):
|
|
28
14
|
try:
|
|
29
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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,>=
|
|
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 (>=
|
|
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'
|