mirror of
https://github.com/zulip/zulip.git
synced 2025-11-09 00:18:12 +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)
|
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]:
|
def get_recursive_subgroups(user_group_id: int) -> QuerySet[UserGroup]:
|
||||||
return get_recursive_subgroups_union_for_groups([user_group_id])
|
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_strict_subgroups,
|
||||||
get_recursive_subgroups,
|
get_recursive_subgroups,
|
||||||
get_recursive_subgroups_union_for_groups,
|
get_recursive_subgroups_union_for_groups,
|
||||||
|
get_recursive_supergroups_union_for_groups,
|
||||||
get_role_based_system_groups_dict,
|
get_role_based_system_groups_dict,
|
||||||
get_subgroup_ids,
|
get_subgroup_ids,
|
||||||
get_system_user_group_by_name,
|
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=staff_group)
|
||||||
GroupGroupMembership.objects.create(supergroup=everyone_group, subgroup=manager_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(
|
self.assertCountEqual(
|
||||||
list(get_recursive_subgroups(leadership_group.id)), [leadership_group.usergroup_ptr]
|
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(leadership_group)), [])
|
||||||
self.assertCountEqual(list(get_recursive_strict_subgroups(staff_group)), [leadership_group])
|
self.assertCountEqual(list(get_recursive_strict_subgroups(staff_group)), [leadership_group])
|
||||||
self.assertCountEqual(
|
self.assertCountEqual(
|
||||||
|
|||||||
Reference in New Issue
Block a user