Skip to content

Instantly share code, notes, and snippets.

@pkorpine
Last active March 1, 2020 21:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pkorpine/bb8d81da6abddeec270dd8755cf216cf to your computer and use it in GitHub Desktop.
Save pkorpine/bb8d81da6abddeec270dd8755cf216cf to your computer and use it in GitHub Desktop.
Espoo Kalenteri
#!/usr/bin/env python3
# Retrieves Espoo calendar for the given unit and writes separate .ics files for each given group.
# 2020-03-01 Pekka Korpinen <pekka.korpinen@iki.fi>
import time
import argparse
import requests
import ics
def get_unit_data():
url = 'https://kalenteri.espoo.fi/api/v1/units'
j = requests.get(url).json()
return j['_embedded']['units']
def find_unit(data, name):
unit = None
for u in data:
if u['name'] == name:
unit = u['id']
break
return unit
def get_group_data(unit):
url = f'https://kalenteri.espoo.fi/api/v1/units/{unit}/groups'
j = requests.get(url).json()
return j['_embedded']['groups']
def find_group(data, name):
group = None
for g in data:
if g['name'] == name:
group = g['id']
break
return group
def get_calendar_data(unit, startdate):
url = f'https://kalenteri.espoo.fi/api/v1/events/search/findByUnit?unit={unit}&after={startdate}T00%3A00%3A00%2B02%3A00'
r = requests.get(url)
j = r.json()['_embedded']['eventResources']
return j
def write_calendar(data, group, filename):
c = ics.Calendar()
events = 0
for e in data:
# Filter by group
groups = [int(x['_links']['group']['href'].split('/')[-1]) for x in e['groupAssociations']]
if not group in groups:
continue
events += 1
d = {
'uid': e['_links']['self']['href'],
'name': e['event']['summary'],
'begin': e['event']['startTime'],
'end': e['event']['endTime'],
'description': e['event']['description'],
}
e = ics.Event(**d)
c.events.add(e)
print(f"Saving {events} events to {filename}")
with open(filename, 'w') as f:
f.writelines(c)
return events
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--unit', required=True)
parser.add_argument('--group', required=True, nargs=2, action='append', metavar=('group', 'filename.ics'))
args = parser.parse_args()
print("Getting unit data")
unitdata = get_unit_data()
unit = find_unit(unitdata, args.unit)
assert unit is not None
print(f"Getting group data for unit {unit}")
groupdata = get_group_data(unit)
data = get_calendar_data(unit, time.strftime('%Y-01-01'))
for (groupname, filename) in args.group:
group = find_group(groupdata, groupname)
print(f"ID for {groupname} is {group}")
write_calendar(data, group, filename)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment