from __future__ import annotations import uuid from typing import Mapping def parse_contact_user_ids(contact: str | None) -> set[uuid.UUID]: ids: set[uuid.UUID] = set() for token in _contact_tokens(contact): try: ids.add(uuid.UUID(token)) except ValueError: continue return ids def build_contact_display(contact: str | None, users: Mapping[uuid.UUID, object]) -> str | None: labels: list[str] = [] for token in _contact_tokens(contact): try: user_id = uuid.UUID(token) except ValueError: labels.append(token) continue user = users.get(user_id) label = _user_display_name(user) if label: labels.append(label) return "、".join(labels) if labels else None def _contact_tokens(contact: str | None) -> list[str]: return [part.strip() for part in str(contact or "").split(",") if part.strip()] def _user_display_name(user: object | None) -> str | None: if user is None: return None for attr in ("full_name", "username", "email"): value = getattr(user, attr, None) if value: return str(value) return None