38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
from datetime import datetime, timedelta, timezone
|
|
|
|
from app.models import EventEdition
|
|
|
|
|
|
def _fmt_ics(dt: datetime) -> str:
|
|
if dt.tzinfo is None:
|
|
dt = dt.replace(tzinfo=timezone.utc)
|
|
return dt.strftime("%Y%m%dT%H%M%SZ")
|
|
|
|
|
|
def build_ics(edition: EventEdition, page_url: str) -> str:
|
|
start = edition.event_date or datetime.now(timezone.utc) + timedelta(days=7)
|
|
end = start + timedelta(hours=4)
|
|
uid = f"desi-clans-{edition.slug}@bengaluru"
|
|
location = edition.venue_name or edition.city
|
|
summary = edition.title.replace(",", "\\,")
|
|
desc = (edition.meta_description or edition.description or edition.title).replace("\n", "\\n")
|
|
|
|
lines = [
|
|
"BEGIN:VCALENDAR",
|
|
"VERSION:2.0",
|
|
"PRODID:-//Desi Clans//Bengaluru Events//EN",
|
|
"CALSCALE:GREGORIAN",
|
|
"METHOD:PUBLISH",
|
|
"BEGIN:VEVENT",
|
|
f"UID:{uid}",
|
|
f"DTSTAMP:{_fmt_ics(datetime.now(timezone.utc))}",
|
|
f"DTSTART:{_fmt_ics(start)}",
|
|
f"DTEND:{_fmt_ics(end)}",
|
|
f"SUMMARY:{summary}",
|
|
f"DESCRIPTION:{desc} — {page_url}",
|
|
f"LOCATION:{location}",
|
|
f"URL:{page_url}",
|
|
"END:VEVENT",
|
|
"END:VCALENDAR",
|
|
]
|
|
return "\r\n".join(lines) + "\r\n"
|