-
Notifications
You must be signed in to change notification settings - Fork 0
/
restcal.py
83 lines (66 loc) · 2.22 KB
/
restcal.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# requires python 3 & icalendar
from bottle import route, run, response, hook
from icalendar import Calendar, vDDDTypes
from datetime import date, datetime
import urllib.request
# TODO configurable
URL = 'http://localhost/calendar.ics'
FORMAT = '%d-%m-%Y'
@hook('after_request')
def cors():
# Don't use the wildcard '*' for Access-Control-Allow-Origin in production.
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'PUT, GET, POST, DELETE, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
@route('/date/<date>')
def byDate(date):
d = parseDate(date)
return filterEvents(lambda e: datePredicate(e, d), today())
@route('/type/<type>')
def byType(type):
return filterEvents(lambda e: typePredicate(e, type) and futurePredicate(e), today())
@route('/current')
def current():
todayStr = today().strftime(FORMAT)
return byDate(todayStr)
@route('/current/<type>')
def currentType(type):
d = today()
return filterEvents(lambda e: typePredicate(e, type) and datePredicate(e, d), d)
def getCal():
calStr = fetch(URL)
return Calendar.from_ical(calStr)
def fetch(url):
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
return response.read().decode('utf-8')
def parseDate(date):
return datetime.strptime(date, FORMAT).date()
def filterEvents(predicate, d):
events = {}
for event in getCal().walk('VEVENT'):
if predicate(event):
events[event['SUMMARY']] = toDict(event, d)
return events
def toDict(event, d):
start = vDDDTypes.from_ical(event['DTSTART'], d)
end = vDDDTypes.from_ical(event['DTEND'], d)
return {
'start' : start.strftime(FORMAT),
'end' : end.strftime(FORMAT),
'diff': (end - d).days
}
def datePredicate(event, d):
start = vDDDTypes.from_ical(event['DTSTART'], d)
end = vDDDTypes.from_ical(event['DTEND'], d)
return start <= d <= end
def typePredicate(event, t):
summary = event['SUMMARY'].lower()
return t.lower() in summary
def futurePredicate(event):
d = today()
end = vDDDTypes.from_ical(event['DTEND'], d)
return d <= end
def today():
return date.today()
run(host='10.30.9.10', port=81)