all repos — mycal @ 5de57db60fc130e39d3496eb139276dac487b39f

private calendar anonymiser

make output conform to spec (aside from vTimezone)

Alan Pearce
commit

5de57db60fc130e39d3496eb139276dac487b39f

parent

9d4b921d4a07ea69e6aa1f1e4c3bdabf81411ed4

1 file changed, 19 insertions(+), 7 deletions(-)

changed files
M mycal.pymycal.py
@@ -1,10 +1,11 @@
+from uuid import uuid4 from icalendar.cal import Calendar, FreeBusy import icalendar import urllib.parse import requests from flask import Flask -from datetime import date, datetime, timedelta, time, timezone +from datetime import date, datetime, timedelta, time import zoneinfo from dataclasses import dataclass from danoan.toml_dataclass import TomlDataClassIO
@@ -18,6 +19,7 @@
@dataclass class Config(TomlDataClassIO): name: str + email: str timezone: str calendar: CalendarConfig
@@ -66,6 +68,9 @@ today = date.today()
start_of_week = today - timedelta(days=today.weekday()) start_date = datetime.combine(start_of_week, time.min, tzinfo=tz) end_date = start_date + timedelta(days=30) + organizer = icalendar.prop.vCalAddress(f"mailto:{config.email}") + organizer.name = config.name + domain = config.email.split('@')[1] output = Calendar() output.add('prodid', '-//Calendar Anonymiser//alin.ovh//')
@@ -74,12 +79,22 @@
# Parse with icalendar try: input = Calendar.from_ical(get_calendar(config.calendar)) + + ## causes parse error in go code + # vtimezone = icalendar.Timezone.from_tzid(config.timezone) + # output.add_component(vtimezone) + + busy = FreeBusy(uid=f'{uuid4()}@{domain}') + busy.add('organizer', organizer) + busy.add('dtstamp', datetime.now(tz=tz)) + busy.add('dtstart', start_date) + busy.add('dtend', end_date) + for component in input.walk(): if component.name == "VEVENT": dtstart = fixup_date(component.get('dtstart').dt) dtend = fixup_date(component.get('dtend', component.get('dtstart')).dt) if dtstart >= start_date and dtend <= end_date: - busy = FreeBusy(uid=component.get('uid')) vp = icalendar.prop.vPeriod([ dtstart, dtend ]) if looks_tentative(component):
@@ -88,11 +103,8 @@ else:
vp.FBTYPE = icalendar.enums.FBTYPE.BUSY_UNAVAILABLE busy.add('freebusy', vp) - busy.add('summary', f'{config.name} Busy') - busy.add('dtstamp', component.get('dtstamp', icalendar.prop.vDatetime(datetime.now(tz)))) - busy.add('dtstart', dtstart) - busy.add('dtend', dtend) - output.add_component(busy) + + output.add_component(busy) return output.to_ical(), { "Content-Type": "text/calendar" } except Exception as e: print("error:", e)