diff --git a/aleksis/core/models.py b/aleksis/core/models.py index ee50301394b0f12444bb06262b1bf17ec0a22d62..e928312cf7355f28c6ea81ca461a4a275377de8c 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -506,6 +506,17 @@ class Group(SchoolTermRelatedExtensibleModel): def child_groups_recursive(self) -> CTEQuerySet: """Get all child groups recursively.""" + def _make_cte(cte): + Through = self.child_groups.through + return ( + Through.objects.values("from_group_id") + .filter(to_group=self) + .union(cte.join(Through, to_group=cte.col.from_group_id), all=True) + ) + + cte = With.recursive(_make_cte) + return cte.join(Group, id=cte.col.from_group_id).with_cte(cte) + def __str__(self) -> str: if self.school_term: return f"{self.name} ({self.short_name}) ({self.school_term})"