def _email_address(block): if not isinstance(block,dict): return None,None inner=block.get("emailAddress") or block.get("email_address") or block if not isinstance(inner,dict): return None,None email=(inner.get("address") or inner.get("email") or "").strip() or None name=(inner.get("name") or "").strip() or None return email,name def participants_from_event(payload): """Graph event dict -> (organizer, attendees) as {name, email} snapshots.""" if not isinstance(payload,dict): payload={} org_email,org_name=_email_address(payload.get("organizer") or {}) organizer=None if org_email or org_name: organizer={"name":org_name,"email":org_email} attendees=[] seen=set() for item in payload.get("attendees") or []: email,name=_email_address(item) key=(email or "").lower() if not email or key in seen: continue seen.add(key) attendees.append({"name":name,"email":email}) return organizer,attendees def serialize_event(payload) -> dict: """Upstream calendar event -> the fields the interview row stores.""" if not isinstance(payload,dict): payload={} online=payload.get("onlineMeeting") or payload.get("online_meeting") or {} if not isinstance(online,dict): online={} start=payload.get("start") end=payload.get("end") if isinstance(start,dict): start=start.get("dateTime") or start.get("date_time") if isinstance(end,dict): end=end.get("dateTime") or end.get("date_time") if hasattr(start,"isoformat"): start=start.isoformat() if hasattr(end,"isoformat"): end=end.isoformat() event_id=payload.get("id") return { "id": str(event_id) if event_id is not None else None, "web_link": payload.get("webLink") or payload.get("web_link") or None, "online_meeting_url": ( payload.get("onlineMeetingUrl") or payload.get("online_meeting_url") or online.get("joinUrl") or online.get("join_url") or None ), "subject": payload.get("subject"), "start": start, "end": end, }