11import typing
22
3+ from admin_auto_filters .filters import AutocompleteFilterFactory
34from django .contrib import admin
5+ from django .db import models
6+ from django .db .models .functions import Coalesce
7+ from django .http import HttpRequest
48from django .urls import reverse
59from django .utils .html import format_html
610from djangoql .admin import DjangoQLSearchMixin # type: ignore[reportMissingTypeStubs]
@@ -23,9 +27,12 @@ class ContributorUserAdmin(DjangoQLSearchMixin, admin.ModelAdmin): # type: igno
2327 "modified_at" ,
2428 )
2529 list_display = ("firebase_id" , "username" , "team" , "created_at" )
30+ list_filter = (
31+ AutocompleteFilterFactory ("Team" , "team" ),
32+ "created_at" ,
33+ )
2634 ordering = ("username" , "team" , "created_at" )
2735 search_fields = ("username" ,)
28- # list_filter = ("team",)
2936 list_select_related = True
3037 autocomplete_fields = ("team" ,)
3138
@@ -65,19 +72,49 @@ class ContributorTeamAdmin(
6572 UserResourceAdmin ,
6673 admin .ModelAdmin , # type: ignore[reportMissingTypeArgument]
6774):
68- list_display = ("name" , "view_team_members" )
75+ list_display = (
76+ "name" ,
77+ "members_count" ,
78+ )
6979 ordering = ("name" ,)
7080 search_fields = ("name" ,)
7181 list_select_related = True
7282
83+ @typing .override
84+ def get_queryset (self , request : HttpRequest ) -> models .QuerySet [ContributorTeam ]:
85+ return (
86+ super ()
87+ .get_queryset (request )
88+ .annotate (
89+ members_count = Coalesce (
90+ models .Subquery (
91+ ContributorUser .objects .filter (
92+ team = models .OuterRef ("id" ),
93+ )
94+ .order_by ()
95+ .values ("team" )
96+ .annotate (c = models .Count ("id" ))
97+ .values ("c" )[:1 ],
98+ output_field = models .IntegerField (),
99+ ),
100+ 0 ,
101+ ),
102+ )
103+ )
104+
73105 @typing .override
74106 def save_model (self , request , obj , form , change ): # type: ignore[reportMissingParameterType]
75107 super ().save_model (request , obj , form , change )
76108 FirebaseContributorTeam (obj ).trigger ()
77109
78- def view_team_members (self , obj ): # type: ignore[reportMissingParameterType]
79- url = reverse ("admin:contributor_contributoruser_changelist" ) + f"?team__id__exact={ obj .id } "
80- return format_html ('<a href="{}">View Team Members</a>' , url )
110+ @admin .display (ordering = "members_count" , description = "Members count" )
111+ def members_count (self , obj : ContributorTeam ):
112+ url = reverse ("admin:contributor_contributoruser_changelist" ) + f"?team={ obj .id } "
113+ return format_html (
114+ '<a href="{}">{}</a>' ,
115+ url ,
116+ obj .members_count , # type: ignore[reportAttributeAccessIssue]
117+ )
81118
82119
83120@admin .register (ContributorUserGroupMembership )
0 commit comments