from collections import OrderedDict ROLE_PRIORITY = {"lead": 0, "leader": 0, "organizer": 1, "collaborator": 2} ROLE_LABEL_FIELDS = {0: "lead_group_label", 1: "organizer_group_label", 2: "collaborator_group_label"} def person_sort_key(person): role = (person.role or "").strip().casefold() return (ROLE_PRIORITY.get(role, 3), role if role not in ROLE_PRIORITY else "", person.order, person.pk or 0) def group_people(people, branding): groups = OrderedDict() for person in sorted(people, key=person_sort_key): role = (person.role or "").strip() priority = ROLE_PRIORITY.get(role.casefold(), 3) key = priority if priority < 3 else role.casefold() if key not in groups: groups[key] = { "title": getattr(branding, ROLE_LABEL_FIELDS[priority], "") if priority < 3 else role, "people": [], } groups[key]["people"].append(person) return list(groups.values())