|
@@ -3,6 +3,7 @@ from __future__ import absolute_import
|
|
|
import six
|
|
|
|
|
|
from collections import defaultdict
|
|
|
+from django.db.models import Count
|
|
|
from six.moves import zip
|
|
|
|
|
|
from sentry import roles
|
|
@@ -16,55 +17,70 @@ from sentry.models import (
|
|
|
|
|
|
|
|
|
def get_team_memberships(team_list, user):
|
|
|
+ """Get memberships the user has in the provided team list"""
|
|
|
if user.is_authenticated():
|
|
|
- memberships = frozenset(
|
|
|
- OrganizationMemberTeam.objects.filter(
|
|
|
- organizationmember__user=user,
|
|
|
- team__in=team_list,
|
|
|
- ).values_list('team', flat=True)
|
|
|
- )
|
|
|
- else:
|
|
|
- memberships = frozenset()
|
|
|
+ return OrganizationMemberTeam.objects.filter(
|
|
|
+ organizationmember__user=user,
|
|
|
+ team__in=team_list,
|
|
|
+ ).values_list('team', flat=True)
|
|
|
+ return []
|
|
|
|
|
|
- return memberships
|
|
|
+
|
|
|
+def get_member_totals(team_list, user):
|
|
|
+ """Get the total number of members in each team"""
|
|
|
+ if user.is_authenticated():
|
|
|
+ query = Team.objects.filter(
|
|
|
+ id__in=[t.pk for t in team_list]
|
|
|
+ ).annotate(
|
|
|
+ member_count=Count('organizationmemberteam')
|
|
|
+ ).values('id', 'member_count')
|
|
|
+ return {item['id']: item['member_count'] for item in query}
|
|
|
+ return {}
|
|
|
|
|
|
|
|
|
def get_org_roles(org_ids, user):
|
|
|
+ """Get the role the user has in each org"""
|
|
|
if user.is_authenticated():
|
|
|
# map of org id to role
|
|
|
- org_roles = {
|
|
|
- om.organization_id: om.role for om in
|
|
|
+ return {
|
|
|
+ om['organization_id']: om['role'] for om in
|
|
|
OrganizationMember.objects.filter(
|
|
|
user=user,
|
|
|
organization__in=set(org_ids),
|
|
|
- )}
|
|
|
- else:
|
|
|
- org_roles = {}
|
|
|
+ ).values('role', 'organization_id')
|
|
|
+ }
|
|
|
+ return {}
|
|
|
|
|
|
- return org_roles
|
|
|
+
|
|
|
+def get_access_requests(item_list, user):
|
|
|
+ if user.is_authenticated():
|
|
|
+ return frozenset(
|
|
|
+ OrganizationAccessRequest.objects.filter(
|
|
|
+ team__in=item_list,
|
|
|
+ member__user=user,
|
|
|
+ ).values_list('team', flat=True)
|
|
|
+ )
|
|
|
+ return frozenset()
|
|
|
|
|
|
|
|
|
@register(Team)
|
|
|
class TeamSerializer(Serializer):
|
|
|
def get_attrs(self, item_list, user):
|
|
|
request = env.request
|
|
|
- memberships = get_team_memberships(item_list, user)
|
|
|
+ org_ids = set([t.organization_id for t in item_list])
|
|
|
|
|
|
- if user.is_authenticated():
|
|
|
- access_requests = frozenset(
|
|
|
- OrganizationAccessRequest.objects.filter(
|
|
|
- team__in=item_list,
|
|
|
- member__user=user,
|
|
|
- ).values_list('team', flat=True)
|
|
|
- )
|
|
|
- else:
|
|
|
- access_requests = frozenset()
|
|
|
+ org_roles = get_org_roles(org_ids, user)
|
|
|
+
|
|
|
+ member_totals = get_member_totals(item_list, user)
|
|
|
+ memberships = get_team_memberships(item_list, user)
|
|
|
+ access_requests = get_access_requests(item_list, user)
|
|
|
|
|
|
- org_roles = get_org_roles([t.organization_id for t in item_list], user)
|
|
|
- avatars = {a.team_id: a for a in TeamAvatar.objects.filter(team__in=item_list)}
|
|
|
+ avatars = {a.team_id: a
|
|
|
+ for a in TeamAvatar.objects.filter(team__in=item_list)}
|
|
|
|
|
|
is_superuser = (request and is_active_superuser(request) and request.user == user)
|
|
|
result = {}
|
|
|
+
|
|
|
for team in item_list:
|
|
|
is_member = team.id in memberships
|
|
|
org_role = org_roles.get(team.organization_id)
|
|
@@ -83,6 +99,7 @@ class TeamSerializer(Serializer):
|
|
|
'is_member': is_member,
|
|
|
'has_access': has_access,
|
|
|
'avatar': avatars.get(team.id),
|
|
|
+ 'member_count': member_totals.get(team.id, 0),
|
|
|
}
|
|
|
return result
|
|
|
|
|
@@ -102,6 +119,7 @@ class TeamSerializer(Serializer):
|
|
|
'isMember': attrs['is_member'],
|
|
|
'hasAccess': attrs['has_access'],
|
|
|
'isPending': attrs['pending_request'],
|
|
|
+ 'memberCount': attrs['member_count'],
|
|
|
'avatar': avatar,
|
|
|
}
|
|
|
|