angrybeanie_wagtail/env/lib/python3.12/site-packages/wagtail/users/views/groups.py
2025-07-25 21:32:16 +10:00

172 lines
5.1 KiB
Python

from django.contrib.auth.models import Group
from django.urls import reverse
from django.utils.functional import cached_property
from django.utils.translation import gettext
from django.utils.translation import gettext_lazy as _
from wagtail import hooks
from wagtail.admin.ui.tables import TitleColumn
from wagtail.admin.utils import set_query_params
from wagtail.admin.views import generic
from wagtail.admin.viewsets.model import ModelViewSet
from wagtail.admin.widgets.button import HeaderButton
from wagtail.users.forms import GroupForm, GroupPagePermissionFormSet
_permission_panel_classes = None
def get_permission_panel_classes():
global _permission_panel_classes
if _permission_panel_classes is None:
_permission_panel_classes = [GroupPagePermissionFormSet]
for fn in hooks.get_hooks("register_group_permission_panel"):
_permission_panel_classes.append(fn())
return _permission_panel_classes
class PermissionPanelFormsMixin:
def get_permission_panel_form_kwargs(self, cls):
kwargs = {}
if self.request.method in ("POST", "PUT"):
kwargs.update(
{
"data": self.request.POST,
"files": self.request.FILES,
}
)
if hasattr(self, "object"):
kwargs.update({"instance": self.object})
return kwargs
def get_permission_panel_forms(self):
return [
cls(**self.get_permission_panel_form_kwargs(cls))
for cls in get_permission_panel_classes()
]
def process_form(self):
form = self.get_form()
permission_panels = self.get_permission_panel_forms()
if form.is_valid() and all(panel.is_valid() for panel in permission_panels):
response = self.form_valid(form)
for panel in permission_panels:
panel.save()
return response
else:
return self.form_invalid(form)
def get_context_data(self, **kwargs):
if "permission_panels" not in kwargs:
kwargs["permission_panels"] = self.get_permission_panel_forms()
context = super().get_context_data(**kwargs)
# Add js/css media from the formsets to the existing media
for panel in context["permission_panels"]:
context["media"] += panel.media
return context
class IndexView(generic.IndexView):
page_title = _("Groups")
add_item_label = _("Add a group")
search_box_placeholder = _("Search groups")
search_fields = ["name"]
context_object_name = "groups"
paginate_by = 20
columns = [
TitleColumn(
"name",
label=_("Name"),
sort_key="name",
url_name="wagtailusers_groups:edit",
),
]
class CreateView(PermissionPanelFormsMixin, generic.CreateView):
page_title = _("Add group")
success_message = _("Group '%(object)s' created.")
def post(self, request, *args, **kwargs):
"""
Handle POST requests: instantiate a form instance with the passed
POST variables and then check if it's valid.
"""
# Create an object now so that the permission panel forms have something to link them against
self.object = Group()
return self.process_form()
class EditView(PermissionPanelFormsMixin, generic.EditView):
success_message = _("Group '%(object)s' updated.")
error_message = _("The group could not be saved due to errors.")
context_object_name = "group"
@cached_property
def header_buttons(self):
return [
HeaderButton(
gettext("View users in this group"),
url=set_query_params(
reverse("wagtailusers_users:index"),
{"group": self.object.pk},
),
icon_name="user",
)
]
def post(self, request, *args, **kwargs):
"""
Handle POST requests: instantiate a form instance with the passed
POST variables and then check if it's valid.
"""
self.object = self.get_object()
return self.process_form()
class DeleteView(generic.DeleteView):
success_message = _("Group '%(object)s' deleted.")
page_title = _("Delete group")
confirmation_message = _("Are you sure you want to delete this group?")
class GroupViewSet(ModelViewSet):
icon = "group"
model = Group
ordering = ["name"]
add_to_reference_index = False
menu_name = "groups"
menu_label = _("Groups")
menu_order = 601
add_to_settings_menu = True
index_view_class = IndexView
add_view_class = CreateView
edit_view_class = EditView
delete_view_class = DeleteView
# Copying requires prepopulating the formsets with copies of the existing
# permissions, which is not currently supported.
copy_view_enabled = False
template_prefix = "wagtailusers/groups/"
def get_common_view_kwargs(self, **kwargs):
return super().get_common_view_kwargs(
**{
"usage_url_name": None,
**kwargs,
}
)
def get_form_class(self, for_update=False):
return GroupForm