ical_offset/main.py

64 lines
1.8 KiB
Python

"""
Take existing calendar and update it slightly
"""
from datetime import datetime, time, timedelta
import requests
from flask import Flask, Response, request
from icalendar import Calendar, Event # type: ignore[import]
from werkzeug.middleware.proxy_fix import ProxyFix
app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1) # type: ignore[assignment]
@app.route('/', methods=['get'])
def process() -> Response:
"""
Fetch ICS url and convert from Events to Todos
Returns:
Response: ical response
"""
# Fetch existing calendar
orig = requests.get(request.args['url'])
days = request.args.get('days', '0')
hours = request.args.get('hours', '0')
mins = request.args.get('mins', '0')
orig_cal = Calendar.from_ical(orig.text)
cal = Calendar()
cal.add('version', '2.0')
cal.add(
'prodid',
'-//Scott Wallace//event2task//EN',
)
for component in orig_cal.subcomponents:
if isinstance(component, Event):
entry = Event()
entry.add('description', component['description'])
entry.add('dtstamp', component['dtstamp'])
entry.add(
'dtstart',
datetime.combine(component.decoded('dtstart'), time(0))
+ timedelta(days=int(days), hours=int(hours), minutes=int(mins)),
)
entry.add(
'dtend',
datetime.combine(component.decoded('dtend'), time(0))
+ timedelta(days=int(days), hours=int(hours), minutes=int(mins)),
)
entry.add('summary', component['summary'])
entry.add('uid', component['uid'])
cal.add_component(entry)
return Response(
cal.to_ical().decode().replace('\\r\\n', '\n').strip(),
headers={'content-type': 'text/calendar; charset=UTF-8'},
)