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:
Shubham Padia
2025-03-20 09:01:53 +00:00
committed by Tim Abbott
parent 5d947cb501
commit 1e896d9878
2 changed files with 38 additions and 0 deletions

View File

@@ -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])