64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
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,
|
|
}
|