11import django_filters
22from django .contrib .auth import get_user_model
33from django .contrib .auth .models import Group
4- from django .db .models import CharField , Q , Value
4+ from django .db .models import CharField , Value
55from django .db .models .functions import Coalesce , Lower , NullIf
6+ from django .urls import reverse
7+ from django .utils .functional import cached_property
68from django .utils .safestring import mark_safe
9+ from django .utils .translation import gettext
710from rolepermissions import roles
811from wagtail .admin .filters import WagtailFilterSet
12+ from wagtail .admin .utils import set_query_params
13+ from wagtail .admin .widgets .button import HeaderButton
914from wagtail .compat import AUTH_USER_APP_LABEL , AUTH_USER_MODEL_NAME
10- from wagtail .users .views .groups import GroupViewSet
15+ from wagtail .users .views .groups import EditView as GroupEditView
16+ from wagtail .users .views .groups import GroupViewSet as WagtailGroupViewSet
1117from wagtail .users .views .groups import IndexView as GroupIndexView
12- from wagtail .users .views .users import Index as UserIndexView
13- from wagtail .users .views .users import get_users_filter_query
18+ from wagtail .users .views .users import IndexView as UserIndexView
19+ from wagtail .users .views .users import UserViewSet as WagtailUserViewSet
20+
21+ from .forms import CustomUserCreationForm , CustomUserEditForm
1422
1523User = get_user_model ()
1624
@@ -55,12 +63,6 @@ def filter_by_status(self, queryset, name, value):
5563
5664
5765class CustomUserIndexView (UserIndexView ):
58- """
59- Override wagtail's users index view to filter by full_name. This view
60- also allows for the addition of custom fields to the list_export
61- and list filtering.
62- """
63-
6466 list_export = [
6567 "email" ,
6668 "full_name" ,
@@ -72,69 +74,41 @@ class CustomUserIndexView(UserIndexView):
7274 "last_login" ,
7375 ]
7476
75- default_ordering = "name"
76- list_filter = ("is_active" ,)
77-
78- filterset_class = UserFilterSet
79-
80- def get_context_data (self , * args , object_list = None , ** kwargs ):
81- ctx = super ().get_context_data (* args , object_list = object_list , ** kwargs )
82- ctx ["filters" ] = self .get_filterset_class ()(
83- self .request .GET , queryset = self .get_queryset (), request = self .request
84- )
85- return ctx
86-
87- def get_queryset (self ):
88- """
89- Override the original queryset to filter by full_name, mostly copied from
90- super().get_queryset() with the addition of the custom code
91- """
92- model_fields = set (self .model_fields )
93- if self .is_searching :
94- conditions = get_users_filter_query (self .search_query , model_fields )
95-
96- # == custom code
97- for term in self .search_query .split ():
98- if "full_name" in model_fields :
99- conditions |= Q (full_name__icontains = term )
100- # == custom code end
101-
102- users = User .objects .filter (self .group_filter & conditions )
103- else :
104- users = User .objects .filter (self .group_filter )
105-
106- if self .locale :
107- users = users .filter (locale = self .locale )
77+ def get_base_queryset (self ):
78+ users = User ._default_manager .all ()
10879
10980 users = users .annotate (
11081 display_name = Coalesce (
11182 NullIf ("full_name" , Value ("" )), "email" , output_field = CharField ()
11283 ),
11384 )
11485
115- if "wagtail_userprofile" in model_fields :
86+ if "wagtail_userprofile" in self . model_fields :
11687 users = users .select_related ("wagtail_userprofile" )
11788
11889 # == custom code
119- if "full_name" in model_fields :
90+ if "full_name" in self . model_fields :
12091 users = users .order_by (Lower ("display_name" ))
12192 # == custom code end
12293
123- if self .get_ordering () == "username" :
124- users = users .order_by (User .USERNAME_FIELD )
94+ return users
12595
126- if self .get_ordering () == "name" :
127- users = users .order_by (Lower ("display_name" ))
96+ def order_queryset (self , queryset ):
97+ if self .ordering == "name" :
98+ return queryset .order_by (Lower ("display_name" ))
99+ if self .ordering == "-name" :
100+ return queryset .order_by (Lower ("-display_name" ))
101+ return super ().order_queryset (queryset )
128102
129- # == custom code
130- if not self .group :
131- filterset_class = self .get_filterset_class ()
132- users = filterset_class (
133- self .request .GET , queryset = users , request = self .request
134- ).qs
135- # == end custom code
136103
137- return users
104+ class CustomUserViewSet (WagtailUserViewSet ):
105+ filterset_class = UserFilterSet
106+ index_view_class = CustomUserIndexView
107+
108+ def get_form_class (self , for_update = False ):
109+ if for_update :
110+ return CustomUserEditForm
111+ return CustomUserCreationForm
138112
139113
140114class CustomGroupIndexView (GroupIndexView ):
@@ -167,13 +141,29 @@ def get_queryset(self):
167141 return custom_groups
168142
169143
170- class CustomGroupViewSet (GroupViewSet ):
144+ class CustomGroupEditView (GroupEditView ):
145+ @cached_property
146+ def header_buttons (self ):
147+ return [
148+ HeaderButton (
149+ gettext ("View users in this group" ),
150+ url = set_query_params (
151+ reverse ("wagtailusers_users:index" ),
152+ {"roles" : self .object .pk },
153+ ),
154+ icon_name = "user" ,
155+ )
156+ ]
157+
158+
159+ class CustomGroupViewSet (WagtailGroupViewSet ):
171160 """
172161 Overriding the wagtail.users.views.groups.GroupViewSet just to use custom users view(index)
173162 when getting all users for a group.
174163 """
175164
176165 index_view_class = CustomGroupIndexView
166+ edit_view_class = CustomGroupEditView
177167
178168 @property
179169 def users_view (self ):
0 commit comments