""" Utilitaires de parcours de l'arborescence de catégories (profondeur illimitée). Partagés entre le routeur categories (affichage de l'arbre) et le routeur materiels (construction du indenté sans avoir besoin de JavaScript.""" resultat: list[tuple[int, Categorie]] = [] for categorie in categories: resultat.append((profondeur, categorie)) resultat.extend(aplatir(categorie.enfants, profondeur + 1)) return resultat def ids_sous_arbre(categorie: Categorie) -> set[int]: """L'id de cette catégorie et de tous ses descendants, à n'importe quelle profondeur. Sert au filtre "cette catégorie" sur /materiels : on veut aussi les matériels rattachés à ses sous-catégories, pas seulement à elle-même.""" ids = {categorie.id} for enfant in categorie.enfants: ids |= ids_sous_arbre(enfant) return ids