mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 16:37:23 +00:00
user_groups: Add get_recursive_supergroups_union_for_groups.
This function will be useful in finding out affected groups when
sending events for users gaining or losing metadata access when the
members of a user group change in any way.
(cherry picked from commit 139679cdb1)
This commit is contained in:
committed by
Tim Abbott
parent
5d947cb501
commit
1e896d9878
@@ -790,6 +790,15 @@ def get_recursive_subgroups_union_for_groups(user_group_ids: list[int]) -> Query
|
||||
return cte.join(UserGroup, id=cte.col.group_id).with_cte(cte)
|
||||
|
||||
|
||||
def get_recursive_supergroups_union_for_groups(user_group_ids: list[int]) -> QuerySet[UserGroup]:
|
||||
cte = With.recursive(
|
||||
lambda cte: UserGroup.objects.filter(id__in=user_group_ids)
|
||||
.values(group_id=F("id"))
|
||||
.union(cte.join(UserGroup, direct_subgroups=cte.col.group_id).values(group_id=F("id")))
|
||||
)
|
||||
return cte.join(UserGroup, id=cte.col.group_id).with_cte(cte)
|
||||
|
||||
|
||||
def get_recursive_subgroups(user_group_id: int) -> QuerySet[UserGroup]:
|
||||
return get_recursive_subgroups_union_for_groups([user_group_id])
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ from zerver.lib.user_groups import (
|
||||
get_recursive_strict_subgroups,
|
||||
get_recursive_subgroups,
|
||||
get_recursive_subgroups_union_for_groups,
|
||||
get_recursive_supergroups_union_for_groups,
|
||||
get_role_based_system_groups_dict,
|
||||
get_subgroup_ids,
|
||||
get_system_user_group_by_name,
|
||||
@@ -308,6 +309,16 @@ class UserGroupTestCase(ZulipTestCase):
|
||||
GroupGroupMembership.objects.create(supergroup=everyone_group, subgroup=staff_group)
|
||||
GroupGroupMembership.objects.create(supergroup=everyone_group, subgroup=manager_group)
|
||||
|
||||
subgroup_for_anonymous_supergroup = check_add_user_group(
|
||||
realm, "subgroup_for_anonymous_supergroup", [iago], acting_user=iago
|
||||
)
|
||||
anonymous_supergroup = check_add_user_group(
|
||||
realm, "anonymous_supergroup", [iago], acting_user=iago
|
||||
)
|
||||
GroupGroupMembership.objects.create(
|
||||
supergroup=anonymous_supergroup, subgroup=subgroup_for_anonymous_supergroup
|
||||
)
|
||||
|
||||
self.assertCountEqual(
|
||||
list(get_recursive_subgroups(leadership_group.id)), [leadership_group.usergroup_ptr]
|
||||
)
|
||||
@@ -334,6 +345,24 @@ class UserGroupTestCase(ZulipTestCase):
|
||||
],
|
||||
)
|
||||
|
||||
with self.assert_database_query_count(1):
|
||||
recursive_supergroups_union_for_groups = list(
|
||||
get_recursive_supergroups_union_for_groups(
|
||||
[leadership_group.id, subgroup_for_anonymous_supergroup.id]
|
||||
)
|
||||
)
|
||||
self.assertCountEqual(
|
||||
recursive_supergroups_union_for_groups,
|
||||
[
|
||||
leadership_group.usergroup_ptr,
|
||||
everyone_group.usergroup_ptr,
|
||||
staff_group.usergroup_ptr,
|
||||
manager_group.usergroup_ptr,
|
||||
subgroup_for_anonymous_supergroup.usergroup_ptr,
|
||||
anonymous_supergroup.usergroup_ptr,
|
||||
],
|
||||
)
|
||||
|
||||
self.assertCountEqual(list(get_recursive_strict_subgroups(leadership_group)), [])
|
||||
self.assertCountEqual(list(get_recursive_strict_subgroups(staff_group)), [leadership_group])
|
||||
self.assertCountEqual(
|
||||
|
||||
Reference in New Issue
Block a user