user-groups: Add groups to page_params.

This commit is contained in:
Umair Khan
2017-11-07 11:56:26 +05:00
committed by Tim Abbott
parent ef545b9180
commit 4c6a376fd5
5 changed files with 47 additions and 4 deletions

View File

@@ -35,6 +35,7 @@ from zerver.lib.actions import (
get_status_dict, streams_to_dicts_sorted get_status_dict, streams_to_dicts_sorted
) )
from zerver.lib.upload import get_total_uploads_size_for_user from zerver.lib.upload import get_total_uploads_size_for_user
from zerver.lib.user_groups import user_groups_in_realm_serialized
from zerver.tornado.event_queue import request_event_queue, get_user_events from zerver.tornado.event_queue import request_event_queue, get_user_events
from zerver.models import Client, Message, Realm, UserPresence, UserProfile, \ from zerver.models import Client, Message, Realm, UserPresence, UserProfile, \
get_user_profile_by_id, \ get_user_profile_by_id, \
@@ -177,6 +178,9 @@ def fetch_initial_state_data(user_profile, event_types, queue_id, client_gravata
if want('realm_filters'): if want('realm_filters'):
state['realm_filters'] = realm_filters_for_realm(user_profile.realm_id) state['realm_filters'] = realm_filters_for_realm(user_profile.realm_id)
if want('realm_user_groups'):
state['realm_user_groups'] = user_groups_in_realm_serialized(user_profile.realm)
if want('realm_user'): if want('realm_user'):
state['raw_users'] = get_raw_user_data( state['raw_users'] = get_raw_user_data(
realm_id=user_profile.realm_id, realm_id=user_profile.realm_id,

View File

@@ -1,10 +1,11 @@
from __future__ import absolute_import from __future__ import absolute_import
from collections import defaultdict
from django.db import transaction from django.db import transaction
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from zerver.lib.exceptions import JsonableError from zerver.lib.exceptions import JsonableError
from zerver.models import UserProfile, Realm, UserGroupMembership, UserGroup from zerver.models import UserProfile, Realm, UserGroupMembership, UserGroup
from typing import Dict, Iterable, List, Text from typing import Dict, Iterable, List, Text, Tuple, Any
def access_user_group_by_id(user_group_id: int, realm: Realm) -> UserGroup: def access_user_group_by_id(user_group_id: int, realm: Realm) -> UserGroup:
try: try:
@@ -18,6 +19,28 @@ def user_groups_in_realm(realm):
user_groups = UserGroup.objects.filter(realm=realm) user_groups = UserGroup.objects.filter(realm=realm)
return list(user_groups) return list(user_groups)
def user_groups_in_realm_serialized(realm):
# type: (Realm) -> List[Dict[Text, Any]]
"""
This function is used in do_events_register code path so this code should
be performant. This is the reason why we get the groups through
UserGroupMembership table. It gives us the groups and members in one query.
"""
memberships = UserGroupMembership.objects.filter(user_group__realm=realm)
memberships = memberships.select_related('user_group')
groups = defaultdict(list) # type: Dict[Tuple[int, Text, Text], List[int]]
for membership in memberships:
group = (membership.user_group.id,
membership.user_group.name,
membership.user_group.description)
groups[group].append(membership.user_profile_id)
return [dict(id=group[0],
name=group[1],
description=group[2],
members=sorted(members))
for group, members in groups.items()]
def get_user_groups(user_profile): def get_user_groups(user_profile):
# type: (UserProfile) -> List[UserGroup] # type: (UserProfile) -> List[UserGroup]
return list(user_profile.usergroup_set.all()) return list(user_profile.usergroup_set.all())

View File

@@ -2351,7 +2351,7 @@ class FetchQueriesTest(ZulipTestCase):
client_gravatar=False, client_gravatar=False,
) )
self.assert_length(queries, 28) self.assert_length(queries, 29)
expected_counts = dict( expected_counts = dict(
alert_words=0, alert_words=0,
@@ -2370,6 +2370,7 @@ class FetchQueriesTest(ZulipTestCase):
realm_emoji=1, realm_emoji=1,
realm_filters=1, realm_filters=1,
realm_user=4, realm_user=4,
realm_user_groups=1,
stream=2, stream=2,
subscription=5, subscription=5,
total_uploads_size=1, total_uploads_size=1,

View File

@@ -138,6 +138,7 @@ class HomeTest(ZulipTestCase):
"realm_restricted_to_domain", "realm_restricted_to_domain",
"realm_show_digest_email", "realm_show_digest_email",
"realm_uri", "realm_uri",
"realm_user_groups",
"realm_users", "realm_users",
"realm_waiting_period_threshold", "realm_waiting_period_threshold",
"root_domain_uri", "root_domain_uri",
@@ -179,7 +180,7 @@ class HomeTest(ZulipTestCase):
with patch('zerver.lib.cache.cache_set') as cache_mock: with patch('zerver.lib.cache.cache_set') as cache_mock:
result = self._get_home_page(stream='Denmark') result = self._get_home_page(stream='Denmark')
self.assert_length(queries, 40) self.assert_length(queries, 41)
self.assert_length(cache_mock.call_args_list, 10) self.assert_length(cache_mock.call_args_list, 10)
html = result.content.decode('utf-8') html = result.content.decode('utf-8')
@@ -244,7 +245,7 @@ class HomeTest(ZulipTestCase):
with queries_captured() as queries2: with queries_captured() as queries2:
result = self._get_home_page() result = self._get_home_page()
self.assert_length(queries2, 34) self.assert_length(queries2, 35)
# Do a sanity check that our new streams were in the payload. # Do a sanity check that our new streams were in the payload.
html = result.content.decode('utf-8') html = result.content.decode('utf-8')

View File

@@ -13,6 +13,7 @@ from zerver.lib.user_groups import (
get_user_groups, get_user_groups,
user_groups_in_realm, user_groups_in_realm,
get_memberships_of_users, get_memberships_of_users,
user_groups_in_realm_serialized,
) )
from zerver.models import UserProfile, UserGroup, get_realm, Realm, \ from zerver.models import UserProfile, UserGroup, get_realm, Realm, \
UserGroupMembership UserGroupMembership
@@ -33,6 +34,19 @@ class UserGroupTestCase(ZulipTestCase):
self.assertEqual(len(user_groups), 1) self.assertEqual(len(user_groups), 1)
self.assertEqual(user_groups[0].name, 'support') self.assertEqual(user_groups[0].name, 'support')
def test_user_groups_in_realm_serialized(self):
# type: () -> None
realm = get_realm('zulip')
user_group = self.create_user_group_for_test('support')
hamlet = self.example_user('hamlet')
check_add_user_to_user_group(hamlet, user_group)
members = user_groups_in_realm_serialized(realm)
self.assertEqual(len(members), 1)
self.assertEqual(members[0]['id'], user_group.id)
self.assertEqual(members[0]['name'], user_group.name)
self.assertEqual(members[0]['description'], '')
self.assertEqual(members[0]['members'], [4, 6])
def test_get_user_groups(self): def test_get_user_groups(self):
# type: () -> None # type: () -> None
othello = self.example_user('othello') othello = self.example_user('othello')